728x90
클래스, 구조체 공통점
- 멤버변수, 멤버함수를 갖고 있음
- . 을 통해 내부 요소 접근가능
- 생성자를 사용해 초기화
- 프로토콜을 채택할 수 있음
클래스의 특징
- 참조 타입
- 모든 클래스의 인스턴스는 힙 영역의 내용을 공유함
- 상속 가능
- ARC로 메모리 관리
구조체의 특징
- 값 타입
- 모든 구조체의 인스턴스는 독립적임 복사될 때마다 새 인스턴스가 생성됨
- 구조체의 인스턴스는 불변
기본적으로 멤버함수를 통해 멤버변수 값 변경이 불가능 하나, mutating이라는 키워드를 멤버함수에 붙여줌으로써 변경 권한을 준다.
mutating을 사용하는 예시
struct Test1{
var name : String = ""
func ChangeName(){
name = "박효준"
}
}
struct Test2{
var name : String = ""
mutating func ChangeName(){
name = "박효준"
}
}
Test1은 에러가 발생한다.
구조체는 값 타입이기에 구조체 인스턴스가 생성되는 순간 복사가 일어나고, 해당 인스턴스의 내부 요소는 바꿀 수 없는게 원칙이다.
그러나 Test2와 같이 mutating 문법을 사용함으로써
Test2 구조체의 인스턴스는 값 복사가 발생하더라도 이후 인스턴스 스스로 메소드를 통해 내부 멤버변수를 바꿀 수 있다.
클래스의 힙 영역 저장과 구조체의 스택 영역 저장과 같이 메모리 구조에 빗대어 각각의 특성과 비교하며 공부하니 이해가 잘 됐다.
ps.
mutating 이란 단어를 어디서 봤는데, 리눅스 수업 들을 때 스레드 부분에서 mutex를 보았다.
아직 운영체제를 깊게 배우진 못 하였지만, 스레드는 메모리의 데이터 영역 (공유변수)등을 공유하고 있기에
하나의 스레드가 사용 중일 때, 다른 스레드가 접근하는 충돌을 방지하려고 mutex 키워드를 쓴 게 기억났다.
그렇다. mutating과 mutex는 전혀 상관없음
-----
2024 05 20 추가
Dispatch를 공부하면서 깨달은 사실인데, 클래스는 오버라이딩 가능성이 있기 때문에
Virtual Method Table을 지닌다.
구조체는 지니지 않음
'iOS > Swift Grammar' 카테고리의 다른 글
[Swift] final을 사용해야 하는 이유 with Dispatch (0) | 2024.05.22 |
---|---|
[Swift] 제네릭 대신 Any 타입을 사용하면 안될까 ? (1) | 2024.02.15 |
[Swift] 제네릭 문법 (0) | 2024.02.15 |
[Swift] 클로저(Closure) 간소화 표현, 값 획득, 탈출 클로저 (1) | 2024.02.06 |
[Swift] 클로저(Closure) 기본 클로저와 후행(트레일링) 클로저 (1) | 2024.02.06 |