본문 바로가기

C#

구조체(struct)와 클래스(class)의 차이

728x90
// 구조체(struct) 코드
struct Point
{
    public int X;
    public int Y;
    public int Z;
    public Point(int x, int y, int z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
    public static Point operator +(Point p1, Point p2)
    {
        return new Point(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z);
    }
    public String toString()
    {
        return "x: " + X + ", y: " + Y + ", z: " + Z;
    }
}

// 클래스(class) 코드
class Point
{
    public int X;
    public int Y;
    public int Z;
    public Point(int x, int y, int z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
    public static Point operator +(Point p1, Point p2)
    {
        return new Point(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z);
    }
    public String toString()
    {
        return "x: " + X + ", y: " + Y + ", z: " + Z;
    }
}

공통점
- 필드로 변수와 함수들을 가질 수 있으며 생성자 역시 가질 수 있다.

차이점
1. 구조체(struct)는 상속을 할 수 없다.
2. 클래스(class) 객체는 힙(heap)에 할당되지만 구조체(struct) 객체는 스택(stack)에 할당된다.

 

하지만 구조체로 선언을 했어도 객체를 힙 영역에 메모리를 할당할 때가 있다.
1. 모든 필드의 합이 16byte를 넘는 경우이다.
2. 구조체 안에 클래스 타입을 필드로 가질 경우이다.

C#에서는 위의 두경우와 상속이 필요한 경우가 아닌 경우라면 구조체로 선언해서 스택(stack) 메모리 영역을 사용하기를 권장한다. 스택은 기본적으로 가비지 컬렉션의 대상이 아니다. 선언한 함수가 종료되면 그때그때 해제가 되기 때문에 heap영역을 사용하는 것보다 좋은 점이 많다고 생각된다. 가비지 컬렉션이 자동으로 메모리를 해제시켜주긴 하지만 많은 오버헤드가 발생할 수가 있다. 가비지 컬렉션의 동작원리를 알면 이해가 갈 것이다. 되도록 16byte가 넘지 않는다면 구조체를 사용하는 버릇을 들이는 것이 좋다.

[출처]
https://stillchobo.tistory.com/118
https://hijuworld.tistory.com/43

728x90

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

LiteDB  (0) 2023.01.31
싱글톤 패턴(Singleton Pattern)  (0) 2023.01.30
디자인 패턴 정의와 종류에 대해  (0) 2023.01.26
IoC(Inversion of Control; 종속성 반전)  (0) 2023.01.26
.NET에서 종속성 주입  (1) 2023.01.26