C# 프로그래밍 - static 키워드(정적 클래스, 정적 필드, 정적 메서드)
C# 프로그래밍 - static 키워드(정적 클래스, 정적 필드, 정적 메서드)
클래스 또는 클래스의 멤버(필드, 속성, 메서드, 생성자,기타)에 대해 static 키워드를 사용할 수 있습니다.
static 키워드를 사용하면 해당 멤버가 인스턴스가 아닌 클래스 자체에 속하게 됩니다. static 멤버는 클래스의 인스턴스를 생성하지 않고도 접근할 수 있습니다.
정적 클래스(Static Class)
정적(static) 클래스는 인스턴스를 생성할 수 없는 클래스로 static 키워드를 사용하여 선언합니다. 정적 클래스의 멤버에 접근하기위해 모든 멤버는 static이어야 합니다.
정적 클래스와 멤버 선언(필드, 메서드)
public static class MyStaticClass
{
public static int StaticMember;
public static void StaticMethod()
{
Console.WriteLine("Static method called.");
}
}
정적 클래스의 멤버 접근
정적 클래스의 멤버는 클래스이름.멤버이름으로 직접 접근할수있습니다. 예에서 정적 메서드를 호출하고 정적 필드에 값을 할당합니다.
MyStaticClass.StaticMethod();
MyStaticClass.StaticMember = 10;
정적 클래스 잘못된 사용
정적 클래스의 인스턴스 멤버 접근은 허용되지않습니다. MyStaticClass.InstanceMember = 5; 에서 클래스이름.멤버이름으로 접근하면 오류가 발생합니다.
public static class MyStaticClass
{
public int InstanceMember;
}
MyStaticClass.InstanceMember = 5;
정적 클래스 사용 예시
정적 클래스는 주로 유틸리티 또는 헬퍼 클래스에서 사용됩니다.
public static class MathUtils
{
public static int Add(int a, int b)
{
return a + b;
}
public static int Subtract(int a, int b)
{
return a - b;
}
public static int Multiply(int a, int b)
{
return a * b;
}
}
MathUtils.Add(5, 2);
MathUtils.Subtract(10, 4);
정적 필드(Static Field)
정적(static) 필드는 클래스의 모든 인스턴스가 공유하는 데이터입니다. 모든 인스턴스는 동일한 값을 참조합니다.
정적 필드 사용 예시1
public class Counter
{
public static int Count = 0;
}
Counter.Count++;
정적 필드 사용 예시2
public class UserSession
{
public static int ActiveUsers = 0;
public UserSession()
{
ActiveUsers++;
}
~UserSession()
{
ActiveUsers--;
}
}
두개의 객체를 생성하고 출력한 필드의 값은 2입니다.
UserSession user1 = new UserSession();
UserSession user2 = new UserSession();
Console.WriteLine(UserSession.ActiveUsers);
user1 객체를 참조에서 제거하고 가비지 컬렉션 실행한후에 출력한 값은 1입니다.
user1 = null;
GC.Collect();
Console.WriteLine(UserSession.ActiveUsers);
정적 메서드 (Static Method)
static 메서드는 클래스의 인스턴스없이 호출할 수 있는 메서드입니다(정적 메서드는 인스턴스를 만들때 포함되지않습니다)
메서드는 클래스의 인스턴스에서 호출되는 인스턴스 메서드와 클래스의 인스턴스없이 호출할 수 있는 정적(static) 메서드로 구분할수있습니다.
static 메서드는 클래스의 정적 필드나 다른 static 메서드에만 접근할 수 있습니다.
정적 메서드 사용 예시1
정적 메서드 MultiplyAndAdjust는 클래스의 정적 필드(multiplier)와 정적 메서드(Multiply)에 접근합니다.
public class Calculator
{
private static int multiplier = 2;
public static int Multiply(int a, int b)
{
return a * b;
}
public static int MultiplyAndAdjust(int a, int b)
{
int product = Multiply(a, b);
return product * multiplier;
}
}
Calculator.MultiplyAndAdjust(3, 4);
정적 메서드 잘못된 사용
정적 메서드에서 인스턴스 멤버 instanceField에 접근할수없어 Example.StaticMethod(); 에서 오류가 발생합니다.
public class Example
{
private int instanceField;
public static void StaticMethod()
{
Console.WriteLine(instanceField);
}
}
Example.StaticMethod();
정적 메서드 사용 예시2
정적 메서드에서 인스턴스 멤버에 접근하기위해 클래스의 인스턴스를 생성하고 접근하면 오류가 발생하지않습니다.
public class Example
{
private int instanceField;
public void SetInstanceField(int value)
{
instanceField = value;
}
public static void StaticMethod()
{
Example ex = new Example();
ex.SetInstanceField(10);
Console.WriteLine(ex.instanceField);
}
}
Example.StaticMethod();