C# - Static 키워드에 대하여 (개념, 예제, 스태틱 메서드,속성,필드,클래스 사용 방법)

 

static 메서드

개념

  • 인스턴스 메서드와는 달리 클래스로부터 객체를 생성하지 않음
  • '클래스명.메서드명'과 같이 직접 호출하는 메서드
  • 메서드 정의 시, 메서드 앞에 static 키워드 사용
  • 메서드 내부에서 클래스의 인스턴스 객체 멤버를 참조해서는 안됨
  • 인스턴스 객체로부터 호출될 수 없음
  • 반드시 클래스명과 함께 사용

예제 - 인스턴스 메서드와 스태틱 메서드 선언

public class MyClass
{
    private int val = 1;

    // 인스턴스 메서드
    public int InstRun()
    {
        return val;
    }

    // 정적(Static) 메서드
    // 메서드 앞에 static 키워드 사용
    public static int Run()
    {
        // 클래스의 인스턴스 객체 멤버를 참조할 수 없음 (val)
        // return val; >>> Error
        return 1;
    }
}

예제 - 인스턴스 메서드와 스태틱 메서드 호출

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

		// 인스턴스 메서드 호출
        MyClass myClass = new MyClass();
        int i = myClass.InstRun();

        // 정적 메서드 호출
        int j = MyClass.Run();

        MessageBox.Show("i(Instance 메서드) : " + i + "\nj(Static 메서드) : " + j);
    }
}

 

  • 출력 화면

static 속성, 필드

개념

  • static 메서드와 같이 '클래스명.속성명' 형식 사용
  • 프로그램 실행 후 해당 클래스가 처음으로 사용될 때 한 번 초기화되어 계속 동일한 메모리를 사용
    • 반대로 Non-static 필드들은 클래스 인스턴스를 생성할 때마다 메모리에 새롭게 생성 

예제 - static 필드와 속성 정의

// static 필드
protected static int _id;

// static 속성
public static string Name { get; set; }

static 클래스

개념

  • 모든 클래스 멤버가 static 멤버로 되어 있음
  • 클래스 정의 시, 클래스명 앞에 static 키워드 사용
  • public 생성자(Constructor)를 가질 수 없고 static 생성자를 가질 수 있음
    • static 생성자는 주로 static 필드들을 초기화 하는데 사용

예제 - static 생성자를 통해 static 변수 초기화

public class MyClass
{
	// 인스턴스 멤버 변수
    private int val = 1;

    // static 멤버 변수
    private static int iStaticVar;

    // static 생성자
    static MyClass()
    {
        // static 멤버 변수가 아닌 멤버 변수 사용 시 에러 출력
        // val = 1;
        
        // static 멤버 변수 초기화
        iStaticVar = 1;
    }

    // static 메서드
    public static int changeStaticValue()
    {
        iStaticVar++;
        return iStaticVar;
    }
    
    // 인스턴스 메서드
    public int changeValue()
    {
        val++;
        return val;
    }
}

예제 - static 클래스에서 static 메서드 사용

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // static 클래스, 스태틱 메서드 사용
        MessageBox.Show( MyClass.changeStaticValue() + "");
        
        // static 클래스, 인스턴스 메서드 사용
        // 스태틱 클래스는 인스턴스 멤버 변수를 참조 할 수 없음 : Error 출력
        // MessageBox.Show( MyClass.changeValue() + "");
    }
}

 

  • 출력 화면
    • 생성자를 통해 1의 값으로 초기화된 스태틱 변수
    • 스태틱 메서드를 통해 +1이 된 스태틱 변수의 값 : 2

참고