C#

[C#]정적 멤버(static member), 비정적 멤버(Non-static member)

DevStory 2021. 12. 25.

정적 멤버와 비정적 멤버

클래스의 구성 요소는 정적 멤버와 비정적 멤버로 분류됩니다.

 

클래스의 멤버를 초기화 또는 사용하기 위해 인스턴스가 필요 없는 클래스의 멤버를 정적 멤버라고 정의하며, 클래스의 멤버 변수를 초기화 또는 사용하기 위해 인스턴스가 필요한 클래스의 멤버를 비정적 멤버라고 정의합니다.

 

이번 포스팅에서는 정적 멤버와 비정적 멤버에 대해 소개합니다.

 


정적 변수와 비정적 변수

static 한정자를 사용하여 선언되거나 static 함수 내부에 선언된 변수는 정적 변수로 간주하며, static 한정자를 사용하지 않고 선언된 변수는 비정적 변수로 간주됩니다.

 

다음은 정적 변수와 비정적 변수를 선언한 예제입니다.

int i = 100;
static int j = 200;

static void Main(string[] args)
{
    int k = 200;
}

변수 istatic 한정자를 사용하지 않았으므로 비정적 변수입니다.

변수 jstatic 한정자를 사용하여 선언되었으므로 정적 변수입니다.

변수 kstatic 한정자로 선언된 Main() 함수 내부에 선언되었으므로 정적 변수입니다.

 

▶ 정적 변수와 비정적 변수 초기화 시점

정적 변수는 클래스 실행이 시작되면, 즉시 초기화됩니다. 반면 비정적 변수는 클래스의 객체를 생성 후 초기화됩니다.

 

▶ 정적 변수와 비정적 변수 접근 방법

정적 변수에 접근하려면 클래스 이름을 사용하여 접근합니다. 반면 비정적 변수는 클래스의 객체를 생성 후 생성된 객체로 비정적 변수를 접근합니다.

 

다음은 클래스 내부의 정적 변수와 비정적 변수를 접근하는 예제입니다.

class Program
{
    // 비정적 변수
    public int i { get; set; }
    // 정적 변수
    static int j = 200;

    public Program(int i)
    {
        this.i = i;
    }

    static void Main(string[] args)
    {
        // 정적 변수 접근
        Console.WriteLine(Program.j);
        // 200

        // 비정적 변수 접근
        Program obj = new Program(50);
        Console.WriteLine(obj.i);
        // 50
    }
}

 

▶ 비정적 변수의 범위

비정적 변수는 객체를 생성하지 않고 접근 가능하지만, 정적 변수는 객체가 생성될 때 생성되므로 객체로 정적 변수를 접근할 수 있습니다.

그리고 객체가 소멸되면, 정적 변수도 소멸됩니다.


정적 메서드와 비정적 메서드

static 한정자를 사용하여 메서드를 선언하면 정적 메서드이며, 그렇지 않으면 비정적 메서드입니다. 정적 메서드 내부에서는 비정적 멤버를 사용하기 위해서는 클래스의 객체를 생성 후 객체를 통해 비정적 멤버를 접근합니다. 반면에 비정적 메서드 내부에서는 클래스 객체를 생성하지 않고 정적 멤버를 접근할 수 있습니다.

 

다음은 정적 메서드와 비정적 메서드 예제입니다.

class Program
{
    // 비정적 변수
    public int i { get; set; } = 100;
    // 정적 변수
    static int j = 200;
        
    // 비정적 메서드
    void Mul()
    {
        // 비정적 메서드에서 정적 멤버를 직접 접근하거나 클래스 이름으로 접근합니다.
        // 비정적 메서드에서 비정적 멤버를 직접 접근하거나 this 키워드로 접근합니다.
        Console.WriteLine("this.i * Program.j :" + (this.i * Program.j));
        Console.WriteLine("i * j :" + (i * j));
    }

    // 정적 메서드
    static void Add()
    {
        // 정적 메서드에서 비정적 멤버를 접근하기 위해 객체 생성합니다.
        Program obj = new Program();
        Console.WriteLine("obj.i + j :" + (obj.i + j));
    }

    static void Main(string[] args)
    {
        // 정적 메서드 호출
        // 클래스 이름으로 호출하거나 직접 호출합니다.
        Program.Add();
        Add();

        // 비정적 메서드 호출
        Program obj = new Program();
        obj.Mul();
    }
}

실행 결과


정적 생성자와 비정적 생성자

static 한정자를 사용하여 선언된 생성자를 정적 생성자라고 부르며 static 한정자가 없는 경우 비정적 생성자입니다.

 

정적 생성자는 클래스가 실행 시점에 제일 먼저 실행되며, 클래스 객체의 수에 상관없이 정적 생성자는 한 번만 실행됩니다. 반면에 비정적 생성자는 클래스의 객체를 생성할 때만 실행됩니다.

 

그리고 정적 생성자는 인수를 가질 수 없습니다.

 

다음은 정적 생성자와 비정적 생성자 예제입니다.

class Program
{
    static Program()
    {
        Console.WriteLine("정적 생성자 호출");
    }

    public Program()
    {
        Console.WriteLine("비정적 생성자 호출");
    }
    
    static void Main(string[] args)
    {
        Console.WriteLine("Main문 시작");
        Program obj1 = new Program();
        Program obj2 = new Program();
        Console.WriteLine("Main문 종료");
    }
}

실행 결과

정적 생성자는 클래스 실행 시점에 제일 먼저 실행되므로 Main() 함수보다 먼저 실행되었습니다. 그리고 두 개의 클래스의 객체를 생성하였으므로 비정적 생성자는 두 번 실행되었습니다.


정적 클래스

static 한정자를 사용하여 선언된 클래스를 정적 클래스라고 부르며 정적 클래스는 정적 멤버만 가질 수 있습니다.

 

다음은 비정적 클래스에서 정적 클래스의 메서드를 호출하는 예제입니다.

public static class staticClass
{
    static staticClass()
    {
        Console.WriteLine("staticClass 클래스의 정적 생성자 호출");
    }

    public static void ConsoleWriteStr(string str)
    {
        Console.WriteLine(str);
    }
}

class Program
{
    static void Main(string[] args)
    {
        staticClass.ConsoleWriteStr("정적 메서드 호출");
    }
}

실행 결과

 

반응형

'C#' 카테고리의 다른 글

[C#]Convert.ToString()과 ToString() 차이  (1) 2022.01.09
[C#]checked, unchecked 키워드  (0) 2021.12.29
[C#]const와 readonly 차이점  (1) 2021.12.25
[C#]First, FirstOfDefault 함수 사용 방법  (0) 2021.12.20
[C#]Dictionary 정렬 방법  (0) 2021.12.20

댓글