본문 바로가기

C# 프로그래밍/문법 개념

[C#] 구조체와 클래스 (Struct & Class)

반응형

구조체와 클래스는 매우 닮았고 자주 쓰인다. 그렇다면 둘은 어떤 용도에 각각 쓰이며 차이점은 무엇일까?

 


둘의 서로 다른 타입을 갖고 있다.

구조체는 값 타입이므로 스택에 저장된다.

반면 클래스는 참조 타입이라서 힙에 저장된다.

 

따라서 구조체는 가비지 컬렉터가 발생하지 않으므로 속도면에서 클래스에 비해 더 장점이 있다.

하지만 구조체의 값은 복사되어 전달되므로 당연스럽게도 함수가 종료되면 해당 값은 소멸된다.


사용하는 문법이 서로 다르다.

클래스는 new 연산자를 사용하여 메모리 할당을 해주어야만 한다. 힙에 저장되기 때문이다.

struct_test s_test;
s_test.name = "this is struct";

class_test c_test = new class_test();
c_test.name = "this is class";

반면 구조체의 경우 생성자를 쓰지 않아도 사용이 가능하다. 먼저 구조체는 내부적으로 매개변수가 없고 재정의가 불가능한 기본 생성자를 생성한다. 또한 메모리 할당이 불필요하기 때문에 매번 구조체 생성 시에 new 연산자를 사용할 필요가 없도록(어차피 내부적으로 생성자를 생성하기 때문) 해놓은 것이다.

하지만 만약 생성과 동시에 필드 값들을 초기화하고 싶다면? 그럴 때는 클래스와 마찬가지로 생성자를 통해 값들을 초기화하면 된다. 이때 주의할 점은 필드의 모든 값들을 다 초기화해주어야 한다.

struct Example
{
    public int a;
    public string b;
    public Example(int _a, string _b)
    {
    	a = _a;
        b = _b;
    }
}

이 외에도 구조체는 상속이 불가능하며 필드의 초기화는 const나 static을 통해서만 가능하다는 차이점이 있다.


언제 사용해야 할까?

구조체는 할당이 자주 일어나고 변수의 양이 적으며 생명주기가 짧은 객체에 사용한다.

반면 클래스는 변수의 양이 많고 생명주기가 긴 객체에 사용하면 적당하다.

반응형