I'm FanJae.
[20260429] 구조체(struct)와 클래스(class)의 차이점 (C#) 본문
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); // 불가능 (관련된 생성자가 없음)
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260430] C# 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) (0) | 2026.04.30 |
|---|---|
| [20260430] 클래스(Class) (0) | 2026.04.30 |
| [20260429] string / StringBuilder / 사용자 정의형 타입(struct, enum) (0) | 2026.04.29 |
| [20260428] 메서드(Method)와 배열(Array) (0) | 2026.04.28 |
| [20260427] C# 값 형식(Value Type)과 참조 형식(Reference Type) (0) | 2026.04.27 |