Swift를 접한지 몇 달이 지났지만, 그래도 클래스와 구조체의 차이점이 뭔지 잘 모르겠고 헷갈린다.
이번 기회에 강의를 들은 내용 바탕으로 정리해봤다.
클래스와 구조체의 차이뿐만 깊은복사와 얕은복사의 차이점도 제대로 짚고가게 되었다.
Class
- 변수 선언시 값을 초기 값을 지정해줘야 함
// 생성자를 만들어서 이 클래스 사용시 매개변수 입력받게 class Enemy { var health: Int var attackStrength: Int init(health: Int, attackStrength: Int){ self.health = health self.attackStrength = attackStrength } func takeDamage(amount: Int){ health = health - amount } }
//변수를 직접 지정 class Enemy { var health: Int = 100 var attackStrength: Int = 10 func takeDamage(amount: Int){ health = health - amount } }
- 생성자 선언 시 클래스 사용
let Tom = Enemy(health: 100, attackStrength: 30)
Class 사용
- 얕은복사 : 같은 객체를 가리켜 sk1, sk2 중 하나를 수정해도 동시에 둘 다 변수 값이 변경됨.
let sk1 = Enemy(health: 100, attackStrength: 30)
//얕은 복사 -> 같은 객체를 가리킴
let sk2 = sk1
sk1.takeDamage(amount: 10)
sk1.takeDamage(amount: 10)
sk2.takeDamage(amount: 10)
print(sk1.health) //70
print(sk2.health) //70
👉 값을 줄이는 메소드를 사용해서 두 객체의 health를 줄이고 출력하면
같은 객체를 참조 하기 때문에 값은 모두 70이 나올 것이다. 10씩 3번 줄었으므로

Struct
- Class에서 Struct로 변경해보자
- Struct는 immutable(불변)하다.
- 그래서 mutating method로 바꾸라는 에러가 뜬다. 왜냐하면 변수 값이 해당 메소드에 의해 업데이트 되기 때문이다.

struct Enemy {
var health: Int
var attackStrength: Int
init(health: Int, attackStrength: Int){
self.health = health
self.attackStrength = attackStrength
}
mutating func takeDamage(amount: Int){
health = health - amount
}
Struct 사용
- 구조체를 사용할 때 let 키워드로 썼기 때문에 error 발생한다. var로 바꿔줘야 된다. (var은 mutable 하므로)
- 깊은 복사 : 구조체를 사용해서 복사하면 객체의 껍데기만 복사되어 새로운 객체를 생성한 후 변수에 그 껍데기를 복사한다. 그러면 서로다른 2개의 객체가 생성되는 것이다.

👉 서로 다른 두개의 객체 값을 변경 했으므로 독립적으로 계산되어 값도 다르게 나온다.

클래스 정리
- 참조에 의해 전달
- ex) 컴퓨터 파일에 사용하고 있는 폴더의 참조폴더를 만들어두고 참조폴더를 삭제하면 기존의 폴더까지 영향끼쳐 삭제된다.
- 원본에 영향을 끼침
- Inheritance( 상속성 )
구조체 정리
- 값에 의해 전달된다.
- ex) 하나의 사진을 구조체는 똑같은 걸 복사 복사본을 해서 전달하므로 복사본에 낙서하거나 손상시켜도 원본에 영향을 끼치지 않는다.
- 애플에서는 default로 Struct(구조체) 사용을 권고하고 있다.

👍🏻 참고하면 좋을 자료
Swift 공식 Reference : Structures and Classes
'Swift' 카테고리의 다른 글
[Swift] 접근제어자 (Access Control) (0) | 2022.05.16 |
---|---|
[Swift] inout parameter (0) | 2022.01.05 |
[Swift] 타입 캐스팅(Type Casting) - in / as 키워드 (0) | 2021.11.27 |
[Swift] Optinoal이란? Wrapping/Unwrapping (0) | 2021.10.02 |
[Swift] 구조체(struct) 공부하기! (0) | 2021.08.29 |