타입
클래스는 '참조 타입'이며, 구조체는 '값 타입'이다.
- 함수의 매개변수로 넘겨준다면, 클래스는 참조라서 메모리 주소만을 넘기고, 구조체는 값을 복사해서 스택에 다시 할당한다.
- 값 자체를 복사해야 하기 때문에 구조체 자체의 크기가 크면 클수록 메모리 사용량이 늘어나며, 스택은 메모리가 한정적이기 때문에 스택 오버플로우의 위험이 있다.
메모리
클래스는 '힙 영역'에 할당되며, 구조체는 '스택 영역'에 할당된다.
- 클래스는 힙에 할당되기 때문에 메모리 크기는 여유롭지만 가비지 컬렉션에 의해서 수거되야한다.
- 반대로 구조체는 스택에 할당되기 때문에 메모리 크기가 한정적인 대신 메모리 해제가 즉시 일어난다.
클래스 | 구조체 | |
타입 | 참조 타입(Reference) | 값 타입(Value) |
메모리 | 힙(heap) 영역 | 스택(stack) 영역 |
결론적으로 클래스와 구조체는 상황에 따라서 사용해야한다.
클래스를 사용하면 가비지 컬렉션의 호출 빈도가 잦아지며, 힙 영역을 사용하기에 구조체보다 접근 속도가 느리다.
구조체를 사용하면 접근 속도는 빠르지만, 함수를 호출할 때마다 복사본이 생성된다.
기본 접근 한정자
C++ 에서는 구조체 : public / 클래스 : private
C#에서는 구조체 : private / 클래스 : private
데이터컨테이너로서 클래스 vs 구조체
데이터가 많다면 구조체보다는 클래스를 사용하는게 바람직하다.
데이터를 자주 복사한다면 구조체보다는 클래스를 사용하는게 바람직하다.
메모리를 희생하고 성능을 얻고싶다면 구조체를 사용하자.
'🛡️ 기술 면접용 질문들 > 프로그래밍 관련' 카테고리의 다른 글
Big-O 표기법 (0) | 2021.04.15 |
---|---|
객체지향의 특징 (0) | 2021.04.14 |
객체 지향적 설계 원칙 (SOLID원칙) (0) | 2021.04.12 |
오버로딩(Overloading) vs 오버라이딩(Overriding) (0) | 2021.04.12 |
박싱(Boxing) vs 언박싱(Unboxing) (0) | 2021.04.12 |