c#

C# 프로그래밍 - static 키워드(정적 클래스, 정적 필드, 정적 메서드)

디지털콘텐츠크리에이터 2024. 9. 3. 17:27

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();