Aspect | Struct | Class |
---|
Type | Value Type | Reference Type |
Memory Allocation | Stack | Heap |
Copy Behavior | Copy | Share |
Inheritance | Does Not Support Inheritance | Supports Inheritance |
Performance | Fast | Slow |
클래스와 구조체의 차이점
- Struct는 값 타입(Value Type) / Class는 참조 타입(Reference Type)
- 구조체는 값을 복사하여 전달한다 / 클래스는 메모리의 동일한 인스턴스를 공유
- 변수에 구조체를 할당하면, 새로운 인스턴스가 생성 / 변수에 클래스를 할당하면, 원래 인스턴스에 대한 참조를 전달
- 함수나 메서드에 구조체를 전달하면, 값이 복사되어 전달됨 / 함수나 메서드에 클래스를 전달하면, 참조가 전달되어 원래 인스턴스가 변경됨
- 메모리 관리
- Struct는 스택(Stack)에 저장 / Class는 힙(Heap)에 저장된다.
- 함수 호출이 끝나면, 구조체가 자동으로 해제된다. / 클래스 인스턴스는 명시적으로 해제되기 전까지 메모리에 남아 있다.
- 상속
- Struct는 상속을 지원하지 않는다. / Class는 상속을 지원한다.
- 구조체는 상속을 통해 기능을 확장할 수 없다. / 클래스는 다른 클래스를 상속받아 기능을 확장할 수 있다.
- 프로토콜을 통해 구조체의 기능을 확장할 수 있다. / 상속을 통해 코드 재사용성과 다형성을 구현할 수 있다.
무엇을 써야할까?
구조체를 주로 쓴다. 카피>전달 방식이기 때문에 각 객체들이 독립적일 수 있고 데이터 안전성을 보장하고 빠르다.
- Struct를 사용하는 경우
- 값의 불변성을 유지하고 싶을 때
- 데이터를 복사하여 전달하는 것이 더 적합할 때 사용한다.
- 예시: 좌표(Point), 크기(Size), 범위(Range) 등
- Class를 사용하는 경우
- 객체의 상태를 공유하고 싶을 때 사용한다.
- 상속을 통해 기능을 확장하고 싶을 때 사용한다.
- 예시: 사용자(User), 뷰(View), 네트워크 연결(Connection) 등
네 가지 주요 메모리 영역에 다룰 때
메모리 영역 | 설명 | Struct 구조체 | Class 클래스 |
---|
스택(Stack) | 함수 호출과 관련된 지역 변수와 매개변수를 저장 | 구조체 인스턴스가 스택에 저장된다. | 클래스 인스턴스의 참조가 스택에 저장된다. |
힙(Heap) | 동적으로 할당되는 메모리 영역 | 구조체가 힙에 저장된 객체를 참조할 수 있다. | 클래스 인스턴스가 힙에 저장된다. |
데이터(Data) | 전역 변수와 정적 변수가 저장 | 전역 변수 또는 정적 변수로 선언된 구조체가 이 영역에 저장된다. | 전역 변수 또는 정적 변수로 선언된 클래스의 참조가 이 영역에 저장된다. |
코드(Code) | 실행할 프로그램 코드가 저장 | 구조체의 메서드가 이 영역에 저장된다. | 클래스의 메서드가 이 영역에 저장된다. |
구조체의 네 가지 메모리 영역에 대한 세부 설명:
- 스택(Stack)
- 함수 호출과 관련된 지역 변수와 매개변수를 저장하는 메모리 영역이다. 구조체는 값 타입이므로 스택에 저장된다.
- 특징: LIFO(Last In First Out) 구조로 동작한다.
- 힙(Heap)
- 설명: 동적으로 할당되는 메모리 영역이다. 구조체 자체는 힙에 저장되지 않지만, 구조체가 힙에 할당된 객체를 참조할 수 있다.
- 특징: 메모리 단편화가 발생할 수 있고, 상대적으로 느린 메모리 할당과 해제가 이루어진다.
- 데이터(Data) 영역
- 전역 변수와 정적 변수가 저장되는 메모리 영역이다. 프로그램 시작 시 할당되고 종료 시 해제된다.
- 특징: 초기화된 데이터(.data)와 초기화되지 않은 데이터(.bss)로 구분된다.
- 코드(Code) 영역
- 설명: 실행할 프로그램 코드가 저장되는 메모리 영역이다.
- 특징: 읽기 전용이며, 프로그램 실행 중 변경되지 않는다.
클래스의 네 가지 메모리 영역에 대한 세부 설명:
- 스택(Stack)
- 함수 호출 시 지역 변수와 매개 변수가 저장되는 메모리 영역이다. 클래스 인스턴스의 참조(포인터)는 스택에 저장된다.
- 특징: 함수 호출이 끝나면 메모리가 자동으로 해제된다. LIFO(Last In First Out) 구조로 동작한다.
- 힙(Heap)
- 클래스 인스턴스는 힙에 동적으로 할당된다. 동적 메모리 할당을 지원하는 큰 메모리 영역이다.
- 특징: 메모리 할당과 해제가 상대적으로 느리며, 여러 참조에 의해 공유될 수 있다. 가비지 컬렉션이나 수동으로 메모리를 관리해야 한다.
- 데이터(Data) 영역
- 초기화된 전역 변수와 정적 변수가 저장되는 메모리 영역이다. 프로그램 시작 시 할당되고 종료 시 해제된다.
- 특징: 초기화된 데이터(.data)와 초기화되지 않은 데이터(.bss)로 구분된다.
- 코드(Code) 영역
- 실행할 프로그램 코드가 저장되는 메모리 영역이다.
- 특징: 읽기 전용이며, 프로그램 실행 중 변경되지 않는다.