Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

I'm FanJae.

[20260429] 구조체(struct)와 클래스(class)의 차이점 (C#) 본문

Unity/Unity 초격차캠프

[20260429] 구조체(struct)와 클래스(class)의 차이점 (C#)

FanJae 2026. 4. 29. 18:28

1. 값 형식과 참조 형식

1) 구조체

- 구조체는 값 형식이다.

- 구조체 변수를 다른 변수에 대입하면 값이 복사된다.

- 따라서 복사본을 수정해도 원본에는 영향을 주지 않는다.

2) 클래스

- 클래스는 참조 형식이다.

- 클래스 변수를 다른 변수에 대입하면 객체 자체가 복사가 되는 것이 아니라, 객체를 가리키는 참조가 복사된다.

- 따라서, 두 변수가 같은 객체를 가리키는 경우, 한쪽에서 객체의 값을 변경하면 다른 쪽에서도 변경된 값이 보이는 특징이 있다

3. 사용 예시

struct StructPlayer
{
		public int hp;
}

class ClassPlayer
{
		public int hp;
}

static void Main(string[] args)
{
		StructPlayer s1;
    s1.hp = 50;

    StructPlayer s2 = s1; // 값 복사
    s2.hp = 100;

    Console.WriteLine(s1.hp); // 100
    Console.WriteLine(s2.hp); // 50
    // s1의 값 변화가 없다.

    ClassPlayer c1 = new ClassPlayer();
    c1.hp = 100;

    ClassPlayer c2 = c1; // 참조 복사
    c2.hp = 50;

    Console.WriteLine(c1.hp); // 50
    Console.WriteLine(c2.hp); // 50
    
    // c1의 값 변화가 일어난다.
}

- 위 처럼, 구조체는 대입 한 값을 복사해도 값이 바뀌지 않지만, 클래스는 같은 객체를 가리킨다.

- 따라서, c2 가 hp 를 바꿨을 때, c1.hp 도 영향을 받는다.


2. 메모리 관점

1) 구조체

- 구조체는 변수 값 자체를 담는다.

- 지역 변수로 선언된 구조체는 보통 스택에 직접 저장된다.

- 단, 구조체가 클래스의 필드이거나 배열의 요소라면 그 구조체 값은 해당 객체나 배열 내부에 포함된다.

2) 클래스

- 클래스 변수는 객체 자체가 아닌 객체를 가리키는 참조를 담는다.

- 객체는 힙에 생성되고, 변수는 그 객체를 참조하는 방식이다.

3. 사용 예시

struct Position
{
    public int x;
    public int y;
}

class Player
{
    public Position pos;
}
Player p = new Player();
  • 위와 같다면, Player 객체는 힙에 생성된다.
  • 이때, pos 는 Player 객체 안에 포함된 필드이므로, 힙에 저장된다.
Position[] positions = new Position[3];
  • 위와 같이 배열 요소로 들어간 구조체도 실질적으로 힙에 저장된다.


3. 복사 관점 (깊은 복사 / 얕은 복사)

1) 얕은 복사(객체의 참조 복사) / Shallow Copy

- 배열이나 클래스와 같은 것을 복사할 경우, 위에서 다룬 것처럼 객체의 참조를 복사한다.

int [] a = {1,2,3};
int [] b = a;

- 이처럼, 객체의 참조만 복사하는 것을 얕은 복사라고 한다.

- C++ 의 경우 포인터를 소유하고 있을 때, 복사 생성자나 대입 연산자를 제대로 만들지 않을 경우, 포인터의 이중 해제(Dangling Pointer) 관련 문제가 있지만, C# 의 경우 GC(Garbage Collector)가 이를 관리하기 때문에 값을 공유하는 문제만 신경써도 괜찮을 것으로 보인다. (더 공부하면서 알아봐야 할 것 같다.)

 

2) 깊은 복사(값 형식의 복사) / Deep Copy

- 일반적인 값 형식 자료형은 대입 시 값 자체가 복사된다. 따라서 내부에 참조형 필드가 없는 경우,에는 깊은 복사와 유사하게, 복사본을 수정해도 원본에 영향을 주지 않는다.

- C#에서도 객체의 깊은 복사 구현은 가능한 것으로 보인다. (단, 일반적으로 사용하는가에 대해서는 더 알아봐야 할 것 같다.)


4. null 가능 여부

1) 구조체

struct Student
{
    int score;
    int age;
}    
int x = null;
Student s = null; // 불가능

일반 구조체 변수는 NULL 값을 가질 수 없다.

 

2) 클래스

struct Position
{
    public int x;
    public int y;
}

class Player
{
    public Position pos;
}

Player p = null; // 가능

 

- 클래스 변수는 참조 형식이므로 NULL 값을 가질 수 있다.


5. 상속

1) 구조체

- 구조체는 다른 구조체나 클래스를 상속할 수 없다.

- 대신 인터페이스를 이용한 구현은 가능하다.

2)클래스

- 다른 클래스의 상속이 가능하다.


6. 생성자

1) 구조체

- 사용자가 생성자를 만든 것과 별개로 new Struct() 와 같은 형태로 기본값 초기화를 할 수 있다.

struct Position
{
    public int x;
    public int y;

    public Position(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

Position p1 = new Position(10, 20);
Position p2 = new Position(); // 이런 형태

Console.WriteLine(p2.x); // 0
Console.WriteLine(p2.y); // 0

- new Position() 과 같이 모든 필드가 기본값인 상태를 만들 수 있다.

2. 클래스

- 생성자를 하나도 만들지 않으면 기본 생성자가 자동으로 제공된다.

- 사용자가 생성자를 하나라도 만들면 기본 생성자는 제공되지 않는다.

class Player
{
    public int hp;
}

Player p1 = new Player();      // 가능
Player p2 = new Player(100);   // 불가능 (관련된 생성자가 없음)
​
 
Comments