본문 바로가기
SBS아카데미/게임프로그래밍

[C# - TIL] 객체지향 기초 - 클래스, 프로퍼티 및 가비지 컬렉션(GC)

by musukie 2025. 9. 4.

🎮 주제 : 객체지향 기초 - 클래스, 프로퍼티 및 가비지 컬렉션(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에게 "이 메모리는 이제 치워도 돼"라고 신호를 주는 과정임을 이해하게 됨