CS

클래스 파고들기

kark 2025. 4. 24. 14:44
728x90

클래스가 뭔가요?


클래스는 객체를 만들기 위한 설계도로 데이터와 함수를 하나로 묶어 표현한 구조를 의미합니다.

클래스는 객체가 가져야할 상태와 행동을 정의하고, 이 클래스를 기반으로 여러 객체를 생성할 수 있습니다.


 

 

클래스와 구조체의 차이가 뭔가요?


클래스와 구조체는 문법상 비슷해 보이지만, 메모리할당방식과 참조방식에 중요한 차이점이 있습니다.

클래스는 힙 메모리에 할당되는 참조타입이며, 구조체는 스택 메모리에 할당되는 값 타입 입니다.

이로인해 클래스는 변수를 다른 변수로 변경할 시 기존에 같은 메모리를 참조하고 있던 다른 변수 또한 영향을 받으며

구조체의 경우 스택에 할당되어, 값 자체만 복사하므로 복사본을 수정하더라도 원본에는 영향이 없다는 차이점이 있습니다.

또한 구조체의 경우 특수한 상황이 아니라면 스택메모리에 할당되므로 GC 의 대상이 아닌 차이점이 있고, 비교적 클래스보다 메모리 접근 속도가 빠르다는 이점이 있습니다.


 

 

특수한 상황은 뭔가요?


스택 메모리는 1회성 데이터를 저장하는데 적합합니다. 그렇기에 메서드 내 활용되는 로컬변수처럼 코드블럭이 종료될때 더이상 필요가 없는 구조체 사용은 보통 스택메모리에 할당 됩니다. 하지만 특수한 상황은 구조체가 클래스의 변수로 포함되어 있는경우, 박싱이 일어나는경우, 구조체를 배열형태로 관리하는경우엔 구조체 또한 힙 메모리에 할당이 진행됩니다.


 

 

값 타입의 복사에 대해 설명해주세요


값형식의 복사는 깊은복사과정으로 진행됩니다.

참조형식과 값형식은 둘다 스택에 메모리 할당이 진행되지만

값형식의 메모리할당은 값자체를 그대로 할당하게되고, 참조타입은 메모리에 힙 영역 메모리의 주소를 저장하게 됩니다.

이때 값형식의 복사는 스택메모리의 데이터에 저장된 값 자체를 그대로 복사하게되며, 복사된 값과 원본 값은 서로 독립적인 관계로

유지됩니다.


 

 

참조 타입은 힙에 할당된다 했는데, 어떻게 복사가 일어나나요?


참조형식의 복사는 얕은복사과정으로 스택에 저장된 힙 메모리의 주소만 복사하는 것을 의미합니다.

그렇기에 스택 메모리상 복사된 데이터는 독립적으로 존재하긴 하지만 서로 참조하고 있는 힙메모리의 주소는 동일하기에

힙 메모리에 저장된 데이터를 변경하게 될 경우 다른 한쪽도 똑같이 수정이 발생되는 과정을 확인할 수 있습니다.


 

 

만약 구조체안에 참조타입 변수를 활용할 경우 문제가 있을까요?


구조체 내부에 참조타입 변수를 활용할 경우 관리적 측면에서 문제가 발생할 수 있습니다.

구조체는 값 타입이므로 복사 시 내부 데이터가 모두 복사됩니다.
하지만 내부에 참조 타입 필드가 포함된 경우, 그 참조는 복사되지만 참조 대상은 공유됩니다.

구조체 내 다른 구조체 필드는 모두 값 복사되어 독립적으로 존재하지만, 클래스와 같은 참조 타입 필드는 참조값만 복사되므로,
복사본과 원본이 같은 힙 객체를 참조하게 됩니다. 그렇기에 스택과 힙 메모리 두 영역을 전부 고려해야하므로 좋은 방법은 아닙니다.


 

'CS' 카테고리의 다른 글

컴파일의 각 단계 파고들기  (0) 2025.04.22
컴파일 파고들기  (0) 2025.04.22
오버로드, 오버라이드(가상테이블 개념) 파고들기  (0) 2025.04.21
Static 파고들기  (0) 2025.04.18
절차지향 프로그래밍 POP  (0) 2025.02.13