더북(TheBook)

3.7.2 구조체는 아주 좋다!

2장에서 말했듯이, 클래스에는 약간의 스토리지 오버헤드가 있다. 모든 클래스는 인스턴스를 만들 때 객체 헤더와 가상 메서드 테이블을 저장해야 한다. 또한, 클래스는 힙에 할당되며 가비지 컬렉션의 대상이 된다.

즉, .NET은 인스턴스화된 모든 클래스를 추적하다가 더 이상 필요하지 않은 인스턴스를 메모리에서 제거한다. 매우 효율적인 프로세스인데, 대부분 이런 프로세스가 있다는 것조차 눈치채지 못하니 마법과도 같다. 수동으로 메모리를 관리하지 않아도 되므로 클래스를 이용하는 것을 겁내지 않아도 된다.

대신 이런 장점을 언제 활용할 수 있는지를 알아 두는 것이 좋다. 구조체는 클래스처럼 속성, 필드, 메서드를 정의할 수 있다. 또한, 인터페이스도 구현할 수 있다. 하지만 구조체를 상속할 수 없으며 다른 구조체나 클래스에서 상속할 수도 없다. 구조체에는 가상 메서드 테이블이나 객체 헤더가 없기 때문이다. 호출 스택에 할당되며 가비지 컬렉션의 대상이 아니다.

호출 스택은 상위 포인터가 움직이는 연속된 메모리 블록일 뿐이다. 스택은 정리가 빠르고 자동이므로 매우 효율적인 스토리지 메커니즘이다. 항상 후입선출(LIFO, Last In First Out)이기 때문에 메모리가 단편화될 가능성은 없다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.