About Class, Struct
미리보기
- 구조체
- 클래스
- 구조체와 클래스의 차이
- 무엇을 선택해야 하는가?
우선 내용을 정리하기에 앞서, 아래와 같은 사실을 꼭 알아두자
- 하나의 프로세스 내 존재하는 메모리 모델은 아래와 같다.

코드, 데이터, 힙, 스택은 꼭 기억하자.
또한, 클래스와 구조체는 ‘객체 지향 프로그래밍’ 패러다임을 연 녀석들이다.
- 흔히 사용하는 비유로 클래스, 구조체는 ‘붕어빵 틀’을 만들어 낸 것과 같다. → 인스턴스를 찍어냈다. 라는 말로도 사용
클래스
[클래스의 특징은 다음과 같다]
- reference type
- 데이터 영역에 (클래스)틀이 저장
- 인스턴스 데이터는 Heap에 저장, 해당 Heap을 가르키는 변수는 stack에 저장.
- 메모리 주소값이 Heap을 가르킴.
- (복사시) 값을 전달하는 것이 아닌, 저장된 주소를 전달
- Heap의 공간에 저장, ARC 시스템을 통해 메모리 관리
- weak, strong(default) 등을 사용해 이를 컨트롤
- 인스턴스를 상수(let)으로 선언하면 가르키는 인스턴스 고정
- 메서드 내에서 속성 변경 가능
- 편의 생성자 존재
- 소멸자 존재
- 상속 가능!
[그림을 통해 정리하면 아래와 같다]

[코드로 보면 다음과 같다]
class Member {
var name: String
var part: String
fun presentation() {
print("발표")
}
}
var foden = Member() // 스택에 foden 변수는 1000번지를 가르킴
foden.name = "박성근" // 1000번지 주소가 존재하는 힙에는 "박성근", "iOS"의 값이 존재
foden.part = "iOS"
구조체
[구조체의 특징은 아래와 같다]
- value type
- 값이 들어있는 스택의 스코프가 종료되면 메모리에서 자동 제거
- 인스턴스 데이터를 모두 Stack에 저장
- (복사시) 값을 전달할때마다 복사본을 생성
- 다른 메모리 공간 생성 → Stack에 새롭게 할당
- Stack의 공간에 저장, 스택 프레임 종료시, 메모리에서 자동 제거
- 스택 프레임?
- 함수수가 호출될 때 Stack(메모리 구조 내부)에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수 내부 지역 변수가 저장되는데, 이때 차례대로 저장되는 함수의 호출 정보를 스택 프레임이라고 함.
- 인스턴스를 상수(let)으로 선언시 저장 속성이 전부 상수로 선언
- 멤버와이즈 이니셜라이저 (자동) 제공
- 메서드 내에서 속성 변경 원칙적으로 불가능
- but, mutating 키워드를 사용하면 가능
- 소멸자 없음
- 상속 불가능
[그림을 통해 정리하면 아래와 같다]

[코드로 보면 아래와 같다]
struct Member {
var name: String
var part: String
}
var m1 = Member() // m1에 name, part가 모두 저장됨
m1.name = "foden"
m1.part = "iOS"
클래스와 구조체의 차이
- 앞서 기술한 내용 중 가장 큰 차이는 type의 차이다
- reference, value type의 차이.
- 즉, 메모리에 저장되는 영역, 방식에서 가장 큰 차이를 보인다.
[코드, 그림으로 차이를 보자]
- 하나의 상황을 가정하자.
- “클래스, 구조체 인스턴스를 복사한 후, 변경하는 상황”
class Member {
var name = "Foden"
}
struct Kuit {
var part = "iOS"
}
var m1 = Member()
var m2 = m1
m2.name = "Phil Foden"
var frontPart = Kuit()
var backPart = frontPart()
backPart.part = "Server"
print(m1.name) // Phil Foden
print(m2.name) // Phil Foden
print(frontPart.part) // iOS
print(backPart.part) // Server

- 힙의 메모리영역은 조금 더 데이터를 길게 저장하기 위해 사용된다.
- 생성 시간도 스택에서보다 조금 더 오래 걸림
- 일반적으로 가벼운 자료들은 struct로 선언해 스택에 저장하게끔 함.
- 구조체를 let으로 선언하는 경우, 원래 가지고 있는 속성의 경우 모두 let으로 선언
- 스택에서 선언하기 때문.
- 클래스를 let으로 선언 시, 가리키는 주소값이 상수가 된다는 의미
- 즉, 주소를 바꿔서 다른 객체를 가리킬 수 없다.
그래서 클래스, 구조체의 구체적인 차이가 뭔데?
- 구조체
- Stack 할당
- 스레드들은 각각 독립적인 Stack 공간을 가지고 있기 때문에 상호 배제(mutual exclusion)를 위한 자원이 필요하지 않음 → 스레들로부터 안전(race condition이 날 확률이 적다)
- 오버헤드가 적음(주소 참조해서 들어가서 값을 확인하고 하는 과정이 생략되다 보니 빠르다)
- Stack 할당
- 클래스
- Heap 할당
- 오버헤드가 높음. 메모리 할당, 해제도 필요, 참조해서 데이터를 확인하는 과정이 stack과 달리 필요하다.
- 스레드가 공유하는 메모리 공간이기 때문에 스레드로부터(race condition)으로부터 안전하지 않음.
- 즉, 이를 관리해주기 위한 lock과 같은 자원도 필요
- Heap 할당
참고
Choosing Between Structures and Classes | Apple Developer Documentation
Choosing Between Structures and Classes | Apple Developer Documentation
Decide how to store data and model behavior.
developer.apple.com
- Use structures by default.
- Use classes when you need Objective-C interoperability.
- Use classes when you need to control the identity of the data you’re modeling.
- Use structures along with protocols to adopt behavior by sharing implementations.
'iOS > Swift' 카테고리의 다른 글
About Clousre (Basics) (0) | 2024.03.19 |
---|---|
About Delegate Pattern (0) | 2024.03.10 |
[Swift] Date, Calendar, DateFormatter (1) | 2024.02.25 |
Result Type에 대한 이해 (1) | 2024.02.19 |
제네릭(Generics) (0) | 2024.02.18 |
About Class, Struct
미리보기
- 구조체
- 클래스
- 구조체와 클래스의 차이
- 무엇을 선택해야 하는가?
우선 내용을 정리하기에 앞서, 아래와 같은 사실을 꼭 알아두자
- 하나의 프로세스 내 존재하는 메모리 모델은 아래와 같다.

코드, 데이터, 힙, 스택은 꼭 기억하자.
또한, 클래스와 구조체는 ‘객체 지향 프로그래밍’ 패러다임을 연 녀석들이다.
- 흔히 사용하는 비유로 클래스, 구조체는 ‘붕어빵 틀’을 만들어 낸 것과 같다. → 인스턴스를 찍어냈다. 라는 말로도 사용
클래스
[클래스의 특징은 다음과 같다]
- reference type
- 데이터 영역에 (클래스)틀이 저장
- 인스턴스 데이터는 Heap에 저장, 해당 Heap을 가르키는 변수는 stack에 저장.
- 메모리 주소값이 Heap을 가르킴.
- (복사시) 값을 전달하는 것이 아닌, 저장된 주소를 전달
- Heap의 공간에 저장, ARC 시스템을 통해 메모리 관리
- weak, strong(default) 등을 사용해 이를 컨트롤
- 인스턴스를 상수(let)으로 선언하면 가르키는 인스턴스 고정
- 메서드 내에서 속성 변경 가능
- 편의 생성자 존재
- 소멸자 존재
- 상속 가능!
[그림을 통해 정리하면 아래와 같다]

[코드로 보면 다음과 같다]
class Member {
var name: String
var part: String
fun presentation() {
print("발표")
}
}
var foden = Member() // 스택에 foden 변수는 1000번지를 가르킴
foden.name = "박성근" // 1000번지 주소가 존재하는 힙에는 "박성근", "iOS"의 값이 존재
foden.part = "iOS"
구조체
[구조체의 특징은 아래와 같다]
- value type
- 값이 들어있는 스택의 스코프가 종료되면 메모리에서 자동 제거
- 인스턴스 데이터를 모두 Stack에 저장
- (복사시) 값을 전달할때마다 복사본을 생성
- 다른 메모리 공간 생성 → Stack에 새롭게 할당
- Stack의 공간에 저장, 스택 프레임 종료시, 메모리에서 자동 제거
- 스택 프레임?
- 함수수가 호출될 때 Stack(메모리 구조 내부)에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수 내부 지역 변수가 저장되는데, 이때 차례대로 저장되는 함수의 호출 정보를 스택 프레임이라고 함.
- 인스턴스를 상수(let)으로 선언시 저장 속성이 전부 상수로 선언
- 멤버와이즈 이니셜라이저 (자동) 제공
- 메서드 내에서 속성 변경 원칙적으로 불가능
- but, mutating 키워드를 사용하면 가능
- 소멸자 없음
- 상속 불가능
[그림을 통해 정리하면 아래와 같다]

[코드로 보면 아래와 같다]
struct Member {
var name: String
var part: String
}
var m1 = Member() // m1에 name, part가 모두 저장됨
m1.name = "foden"
m1.part = "iOS"
클래스와 구조체의 차이
- 앞서 기술한 내용 중 가장 큰 차이는 type의 차이다
- reference, value type의 차이.
- 즉, 메모리에 저장되는 영역, 방식에서 가장 큰 차이를 보인다.
[코드, 그림으로 차이를 보자]
- 하나의 상황을 가정하자.
- “클래스, 구조체 인스턴스를 복사한 후, 변경하는 상황”
class Member {
var name = "Foden"
}
struct Kuit {
var part = "iOS"
}
var m1 = Member()
var m2 = m1
m2.name = "Phil Foden"
var frontPart = Kuit()
var backPart = frontPart()
backPart.part = "Server"
print(m1.name) // Phil Foden
print(m2.name) // Phil Foden
print(frontPart.part) // iOS
print(backPart.part) // Server

- 힙의 메모리영역은 조금 더 데이터를 길게 저장하기 위해 사용된다.
- 생성 시간도 스택에서보다 조금 더 오래 걸림
- 일반적으로 가벼운 자료들은 struct로 선언해 스택에 저장하게끔 함.
- 구조체를 let으로 선언하는 경우, 원래 가지고 있는 속성의 경우 모두 let으로 선언
- 스택에서 선언하기 때문.
- 클래스를 let으로 선언 시, 가리키는 주소값이 상수가 된다는 의미
- 즉, 주소를 바꿔서 다른 객체를 가리킬 수 없다.
그래서 클래스, 구조체의 구체적인 차이가 뭔데?
- 구조체
- Stack 할당
- 스레드들은 각각 독립적인 Stack 공간을 가지고 있기 때문에 상호 배제(mutual exclusion)를 위한 자원이 필요하지 않음 → 스레들로부터 안전(race condition이 날 확률이 적다)
- 오버헤드가 적음(주소 참조해서 들어가서 값을 확인하고 하는 과정이 생략되다 보니 빠르다)
- Stack 할당
- 클래스
- Heap 할당
- 오버헤드가 높음. 메모리 할당, 해제도 필요, 참조해서 데이터를 확인하는 과정이 stack과 달리 필요하다.
- 스레드가 공유하는 메모리 공간이기 때문에 스레드로부터(race condition)으로부터 안전하지 않음.
- 즉, 이를 관리해주기 위한 lock과 같은 자원도 필요
- Heap 할당
참고
Choosing Between Structures and Classes | Apple Developer Documentation
Choosing Between Structures and Classes | Apple Developer Documentation
Decide how to store data and model behavior.
developer.apple.com
- Use structures by default.
- Use classes when you need Objective-C interoperability.
- Use classes when you need to control the identity of the data you’re modeling.
- Use structures along with protocols to adopt behavior by sharing implementations.
'iOS > Swift' 카테고리의 다른 글
About Clousre (Basics) (0) | 2024.03.19 |
---|---|
About Delegate Pattern (0) | 2024.03.10 |
[Swift] Date, Calendar, DateFormatter (1) | 2024.02.25 |
Result Type에 대한 이해 (1) | 2024.02.19 |
제네릭(Generics) (0) | 2024.02.18 |