class와 struct

moonazn·2025년 4월 9일

Swift

목록 보기
4/11

🥝1. class

  • 참조 타입
    (소멸 시점: 더이상 참조할 필요가 없을 때 (=class 인스턴스에 nil을 넣었을 때) 메모리에서 소멸)
  • ARC로 메모리 관리(참조 count 계산 필요)
  • 메모리 복사
  • 상속 가능
  • 타입 캐스팅 가능
  • deinit을 사용하여 메모리 해제

> heap 할당 (모든 스레드가 공유)

참조가 어디서 어떻게 될지 미리 알 수 없음.(=컴파일 시점에 알 수 없다.)
스레드 공유 자원이기 때문에 lock과 같은 자원으로 관리가 필요함.

(stack에는 heap 영역의 메모리 주소가 저장된다.)

🫐2. struct

  • 값 타입
  • 멤버와이즈 이니셜라이저 자동 제공
  • swift의 표준 라이브러리 속 기본 타입들은 다 구조체로 되어 있음.
  • 값 복사 (할당 시 계속 새로운 구조체가 할당됨.)
    ✔️ 같은 구조체를 여러 변수에 할당 후 값을 변경시켜도 다른 변수에 영향을 주지 않음! (class의 경우 영향을 받는다. 메모리 복사이기 때문)

> stack 할당 (스레드마다 독립적)

생성&소멸 시점을 컴파일 시 알 수 있음.
LIFO(Last In Fist Out)
사용이 빠르다. (각 스레드마다 개별의 stack이 존재하기 때문에 상호 배제를 위한 자원이 필요하지 않음.)

> 상호 배제: 같은 자원에 대해 동시 접근 문제가 없도록 제어하는 것.

스택 프레임 종료 시 메모리에서 자동 제거되며, 참조&해제는 pop, push 등 명령어로 쉽게 가능하다.

🥗3. class + struct

1) class 안에 struct 프로퍼티가 존재하는 경우 (값 타입을 포함하는 참조 타입)

값 타입도 heap에 저장된다.

2) struct 안에 class 프로퍼티가 존재하는 경우 (참조 타입을 포함하는 값 타입)

값 타입은 heap에 할당되지 않지만, 내부에 참조 타입이 존재하기 때문에 참조 count에 대한 처리가 필요하다.

4. Copy-on-assignment, Copy-on-write (값 타입)

1) Copy-on-assignment

값 타입이 다른 변수에 할당될 시 copy되어 할당된다.
= 새 메모리 공간에 같은 값 복사

2) Copy-on-write

값 타입이 다른 변수에 할당될 시 일단은 메모리 할당을 하지 않고, 같은 곳을 본다.
if-> 해당 값이 변경된다면 이때 메모리에 값을 copy 및 변경
(메모리 최적화를 위해서!)
❗️참조 타입을 포함하는 값 타입의 경우에는 copy-on-write가 적용되지 않는다. 많은 오버헤드가 발생할 수 있기 때문.

🥨5. let

let 키워드는 속성의 변경을 불가능하도록 만든다.

1) struct

let으로 구조체 변수 선언 시 구조체 내부의 속성(프로퍼티)을 변경할 수 없다.
stack 영역의 메모리 공간을 변경하지 못하게 되기 때문이다.

속성을 바꾸다 = stack 메모리의 내용을 바꾸다
(그리고 struct는 stack에 직접 저장된다!)

2) class

class의 경우 실제 data는 heap에, stack에는 heap 영역의 메모리 주소가 저장되어 있다. (참조 타입)
따라서 let은 참조 주소(메모리 주소)만 고정시키고, heap에 저장된 내부 내용은 바꿀 수 있다.

class Dog{
	var name: String
    init(name: String) { self.name = name }
}
let d = Dog(name: "coco")
d.name = "moonazn"	// 가능❗️
profile
개발 공뷰

0개의 댓글