🎮 주제 : 객체지향 기초 - 클래스, 프로퍼티 및 가비지 컬렉션(GC)
태그 : #CSharp #객체지향 #클래스 #프로퍼티 #가비지컬렉터 #메모리관리
📌 학습 요약
- C# 클래스 구조 : 데이터(필드)와 기능(메서드)을 하나로 묶는 객체지향의 핵심 단위로, 생성자를 통해 객체의 초기 상태를 안전하게 설정하는 방법 습득
- 프로퍼티(Property)의 캡슐화 : 필드를 직접 노출하지 않고 get과 set 접근자를 통해 데이터를 보호하며, 자동 구현 프로퍼티를 활용해 코드의 가독성을 높이는 기법 파악
- 가비지 컬렉터(GC)의 메커니즘 : 힙(Heap) 메모리에서 참조가 끊긴 객체를 자동으로 추적하고 회수하여 메모리 누수를 방지하는 닷넷(.NET)의 관리형 메모리 시스템 이해
- GC 성능 최적화 : 객체의 수명에 따라 0, 1, 2세대로 나누어 관리하는 세대별 수집 방식을 통해 CPU 부하를 최소화하는 GC의 효율성 인식
🛠 주요 코드 및 구현 상세
1. 프로퍼티와 생성자를 활용한 클래스 설계
namespace Program
{
internal class Stat
{
// 1. 자동 구현 프로퍼티: 별도의 프라이빗 필드 선언 없이 간결하게 작성
public int Wisdom { get; set; }
public int Strength { get; set; }
public int Dexterity { get; set; }
public int Intelligence { get; set; }
// 2. 생성자: 객체 생성 시점에 데이터를 초기화
public Stat(int wisdom, int strength, int dexterity, int intelligence)
{
Wisdom = wisdom;
Strength = strength;
Dexterity = dexterity;
Intelligence = intelligence;
}
public void Describe()
{
Console.WriteLine($"Wisdom : {Wisdom}");
Console.WriteLine($"Strength : {Strength}");
Console.WriteLine($"Dexterity : {Dexterity}");
Console.WriteLine($"Intelligence: {Intelligence}");
}
}
}
2. 가비지 컬렉션(GC) 동작 예시
// 객체 생성 (Heap 메모리 할당)
Stat playerStat = new Stat(10, 10, 10, 10);
// 참조 해제: 이제 playerStat이 가리키던 객체는 가비지(Garbage)가 됨
playerStat = null;
// (학습용) GC 강제 실행 호출
// 실제 서비스 코드에서는 성능 저하 방지를 위해 시스템에 맡기는 것이 권장됨
GC.Collect();
GC.WaitForPendingFinalizers();
✅ 주요 문법 및 개념 정리
개념 특징 장점
| 자동 구현 프로퍼티 | public int Id { get; set; } | 백필드(Field) 선언 생략으로 코드 간결화 |
| get / set 접근자 | 읽기 및 쓰기 권한 제어 가능 | 데이터의 무결성 유지 (캡슐화) |
| GC 세대 (Generation) | 0세대(신규) → 2세대(장수) 관리 | 자주 발생하는 작은 객체 위주로 빠르게 정리 |
| 힙(Heap) 메모리 | new 키워드로 생성된 객체 저장소 | GC의 주요 관리 대상 영역 |
💡 핵심 인사이트 : 왜 프로퍼티를 사용하는가?
- 변수를 public으로 선언하면 외부에서 제약 없이 값을 바꿀 수 있지만, 프로퍼티를 사용하면 set 내부에서 조건문(예: 음수 입력 방지)을 추가하는 등 데이터 검증이 가능해짐
✨ 느낀 점
- set만 있는 프로퍼티는 외부에서 값을 확인할 수 없어 '쓰기 전용'이라는 특수한 목적 외에는 사용이 제한적임을 실습을 통해 깨달음
- 자동 구현 프로퍼티 덕분에 C++에 비해 캡슐화 코드가 획기적으로 짧아지고 깔끔해진다는 점이 인상적이었음
- GC가 메모리를 대신 관리해 주지만, 무분별한 객체 생성은 결국 GC 호출 빈도를 높여 성능 저하(Stop-the-world)를 일으킬 수 있다는 점을 배우며 최적화의 필요성을 느낌
- 객체의 참조를 null로 만드는 행위가 GC에게 "이 메모리는 이제 치워도 돼"라고 신호를 주는 과정임을 이해하게 됨
'SBS아카데미 > 게임프로그래밍' 카테고리의 다른 글
| [C++ - TIL] 삽입 정렬의 진화, 쉘 정렬(Shell Sort)의 원리와 효율성 (0) | 2025.09.03 |
|---|---|
| [C++ - TIL] 다익스트라 최단 경로 알고리즘의 핵심 로직과 거리 갱신 원리 (0) | 2025.09.02 |
| [C++ - TIL] 벡터의 수동 제어를 통한 다익스트라 인접 행렬 구현 (0) | 2025.09.01 |
| [C++ - TIL] 위상 정렬(Topological Sort)의 메커니즘과 STL 컨테이너의 활용 (0) | 2025.08.29 |
| [C++ - TIL] 그래프 탐색 알고리즘 - BFS의 체계적 이해와 위상 정렬의 기초 (0) | 2025.08.28 |