intro) 클래스와 구조체의 차이점이 무엇인가요?

이전아티클에서 클래스와 구조체의 공통적인 기능과 특징에 대해서 알아보았다. 그렇게 많은 공통점을 가진 클래스와 구조체인데 왜 두가지로 나눠서 사용하나? 둘의 가장 큰 차이점인 메모리에 저장되는 관점이며, 이를 알기 위해선 값타입과 참조타입를 알아야 한다! 같이 알아보자!

1. Value Type

실제 인스턴스가 Stack 영역에 생성된다!

→ 구조체, 열거형, 튜플, 컬렉션 타입이 값타입의 대표적인 예시이다.

아래의 구조체가 메모리에 어떻게 저장되는지 같이 알아보자!

struct SoptMemberStruct {
		var part: String
		var name: String

		init(part: String, name: String) {
				self.part = part
				self.name = name
		}
}

var hidi: SoptMemberStruct = SoptMemberStruct(part: "아요", name: "류희재")

아래 그림처럼 Struct는 Data 영역에 추가되고, hidi라는 실제 인스턴스는 Stack영역에 할당된다.

Untitled

2. Reference Type

heap 메모리 영역실제 인스턴스가 저장되고, stack 메모리 영역에 heap 영역에 있는 실제 인스턴스의 메모리 주소만 가지고 있다

→ 클래스와 클로저가 참조타입의 대표적인 예시이다.

아래의 클래스가 메모리에 어떻게 저장되는지 같이 알아보자!

class SoptMemberClass {
		var part: String
		var name: String

		init(part: String, name: String) {
				self.part = part
				self.name = name
		}
}

var hidi: SoptMemberClass = SoptMemberClass(part: "아요", name: "류희재")

아래 그림처럼 Class는 Data 영역에 추가되고, hidi라는 실제 인스턴스는 Heap영역에 할당된다. 그리고 Stack 메모리에 있는 hidi의 주소값만 가지고 있다.

Untitled

3. Value Type vs Reference Type

둘의 메모리 저장 방식에 대해서 살펴보았다. 근데 도대체 실질적인 차이점이 뭔데??? 를 이제 알아보자

i) 인스턴스 복제