- C++에서는 구조체나 클래스를 선언할 때, 그것이 스택에 저장되는지, 힙에 저장되는지가 new 사용 여부나 선언 위치에 따라 명확하게 결정된다.
- 반면 C#에서는 타입 자체가 메모리 저장 위치를 결정한다. 이때 타입은 크게 두 가지로 나뉜다:
1) 값 형식(Value Type): 스택에 저장됨 (int, float, struct 등)
2) 참조 형식(Reference Type): 힙에 저장됨 (class, string, object 등)
- 참조형 타입이 어떤 구조로 작동하는지 알아보다 보면, 자연스럽게 object라는 이름을 만나게 된다. 이는 단순한 타입이 아니라, C#의 모든 참조 타입의 최상위 조상이다.
1. Object란?
- C#에서 object는 System.Object의 키워드 약칭이며, C#의 모든 타입은 궁극적으로 object를 상속한다.
- 즉, C#의 모든 값은 object로 암시적 변환될 수 있다.
int a = 10;
string s = "hello";
MyClass m = new MyClass();
// 위의 모든 변수는 모두 object 타입으로 받을 수 있다.
object o1 = a; // int → object (박싱 발생)
object o2 = s; // string → object (참조 복사)
object o3 = m; // MyClass → object (참조 복사)
2. 왜 object가 필요할까?
2-1. 다형성
- 다양한 타입을 하나로 다루기 위해 필요하다.
- 위의 예시 코드처럼 정수, 문자열, 사용자 정의 클래스까지 object 하나로 다룰 수 있다.
2-2. 공통 기능 제공
- 모든 타입이 object를 상속하므로, 아래 메서드를 공통으로 사용할 수 있다.
| 메서드 | 설명 |
| ToString() | 문자열로 표현 |
| Equals() | 값 비교 |
| GetHashCode() | 해시 코드 반환 |
| GetType() | 런타임 타입 반환 |
int x = 10;
Console.WriteLine(x.ToString()); // "10"
Console.WriteLine(x.GetType()); // System.Int32
2-3. 박싱과 언박싱
C# 박싱과 언박싱
- 박싱과 언박싱은 C#에서 값형(value Type)과 참조형(Reference Type) 간의 변환을 의미한다.- 이 과정은 메모리 구조와 성능에도 영향을 미치기 때문에, C#을 이해할 때 꼭 짚고 넘어가야 한다고 한다.1.
gyro-code-game.tistory.com
3. 마무리
- 예전 C++을 배울 때 C#은 메모리 관리를 할 필요가 없어 편하다고 했다. 하지만 Unity나 C#을 조금만 다뤄보면, 이 말이 절반은 틀렸다는 걸 금방 알 수 있다.
- 게임 엔진도 마찬가지지만, 결국 어떤 객체를 멈추게 하려면 직접 파괴하거나, 참조를 끊어야 한다. 아무리 GC가 있다 하더라도, 참조가 남아 있는 한 메모리는 해제되지 않는다.
- 그래서 C#에서 메모리를 제대로 관리하려면 객체가 언제 참조되고, 언제 참조가 끊기는지를 정확히 파악하는 능력이 중요하다고 생각한다. 참조를 이해하지 못하면 메모리 관리도 제대로 할 수 없다.
- 이 과정에서 object는 단순히 모든 타입의 부모 클래스 그 이상이다. C#의 참조 시스템, 메모리 구조, 런타임 동작을 이해하는 데 있어 가장 기초이자 중심이 되는 개념이라고 생각한다.
'Programming > C#' 카테고리의 다른 글
| C# 콘솔에서 멀티 스레드로 키 입력 처리하기 (2) | 2025.07.10 |
|---|---|
| C# static 함수의 구조와 그 의미 (2) | 2025.07.09 |
| C# 박싱과 언박싱 (0) | 2025.07.07 |
| C# 문자열 (0) | 2025.06.17 |
| C# is와 as (Type Checking and Casting) (0) | 2025.06.11 |
