Struct와 Class의 차이
Struct와 Class는 데이터 저장 방식, 가변성(Mutability), 상속 측면에서 다르다.
- 첫 째, Struct는 그 자체로 값으로 저장이 되지만 Class는 변수에 객체에 대한 주소값을 저장한다.
- 둘 째, Struct는 기본적으로 Immutable하지만 Class는 Mutable하다. 때문에 Struct의 내부 변수값을 바꾸기 위해서는 mutating이라는 강제로 mutability를 부여하는 접두어를 붙여야 한다.
- 셋 째, Struct는 상속이 불가능하지만, Class는 상속이 가능하다. 이는 불변성의 연장선으로 볼 수 있다.
데이터 저장 방식
struct의 데이터는 그 자체가 값으로 저장이 된다. 따라서 기존 struct가 새로운 struct에 할당되면 기존 struct의 값이 그대로 새로운 struct로 할당되어 완전히 별개의 struct가 만들어진다.
예를 들어 다음의 PersonStruct가 있다고 해보자.
struct Person {
let name: String
var age: Int
let temperature: Float
init(_name: String, _age: Int, _temperature : Float) {
name = _name
age = _age
temperature = _temperature
}
mutating func addAge() {
age += 1
}
}
위 struct를 이용해 age가 29인 person1을 만들고 person2를 person1에 할당한다. 그러면 person2에는 person1의 struct를 복사한 struct가 생성된다. 즉, person1과 person2는 독립적이 된다. 따라서 person1에 addAge를 하더라도 person2의 age는 그대로 29가 된다.

이번에는 위의 Person을 Class로 바꾸어보자.
class Person {
let name: String
var age: Int
let temperature: Float
init(_name: String, _age: Int, _temperature : Float) {
name = _name
age = _age
temperature = _temperature
}
func addAge() {
age += 1
}
}
person2는 person1의 주소값을 참조하기 때문에 person2와 person1은 같은 객체가 된다. 따라서 person1에 age를 하나 더하면 person2는 person1의 주소값을 참조하므로 person1과 똑같이 나오게 된다.

가변성
Struct는 기본적으로 Immutable하다. 하지만 Class는 Mutable하다. 때문에 Struct의 func에서 내부 속성을 바꾸기 위해서는 mutating 을 붙여햐 한다.
struct Person {
let name: String
var age: Int
let temperature: Float
init(_name: String, _age: Int, _temperature : Float) {
name = _name
age = _age
temperature = _temperature
}
mutating func addAge() {
age += 1
}
}
반대로 클래스는 기본적으로 Mutable하다. 따라서 속성을 바꾸기 위해 func 앞에 mutating을 붙일 필요가 없다.
class Person {
let name: String
var age: Int
let temperature: Float
init(_name: String, _age: Int, _temperature : Float) {
name = _name
age = _age
temperature = _temperature
}
func addAge() {
age += 1
}
}
상속성
Class는 상속할 수 있다. 하지만 struct는 상속이 불가능하다.
만약 Person을 struct로 선언후 상속하려고 하면 다음의 오류가 생긴다.

'IOS > Swift' 카테고리의 다른 글
[Swift] 함수형 프로그래밍 알아보기 : 클로저(Closures), 일급객체 (0) | 2021.12.25 |
---|---|
[Swift] protocol이란 무엇인가? (0) | 2021.12.22 |
[Swift] struct 내부에서 변수값 변경하기 (0) | 2021.12.19 |
[Swift] struct 한 번에 정리하기 (1) | 2021.12.19 |
[Swift 제어문] switch case 사용해 다중 조건 처리하기 (0) | 2021.12.19 |