Class란?
Class는 Swift에서 참조 타입으로 객체의 상태와 동작을 정의하는 설계 도구입니다.
- 동일한 객체를 여러 변수에서 참조할 수 있음.
- 상위 클래스를 확장하여 새로운 클래스 설계가 가능.
- 참조 횟수를 추적하여 메모리 해제를 자동으로 관리(ARC를 통한 메모리 관리).
- 상속이 필요하거나 다형성을 구현해야 하는 경우에 사용함.
- 간단한 데이터 구조에서는 struct가 더 적합함.
Class와 Struct 한 눈에 비교하기
특성 | Class | Struct |
참조 타입 vs 값 타입 | 참조 타입 (Reference Type): 동기화됨 | 값 타입 (Value Type) |
상속 가능 여부 | 상속 가능 | 상속 불가능 |
deinit 지원 여부 | 지원 | 미지원 |
변경 가능 여부 | var로 선언 시 변경 가능 | 모든 프로퍼티가 기본적으로 불변(let) |
상속(inheritance)란?
클래스 간에 공통된 기능과 속성을 재사용하고, 기존 Class를 확장하여 새로운 기능을 추가할 수 있도록 설계된 것을 의미합니다.
Class에서의 초기화(Initialization)와 init() 호출
Swift는 모든 저장 프로퍼티가 초기화되도록 강제합니다.
따라서 class의 init() method가 인스턴스를 생성할 때 모든 저장 프로퍼티에 유효한 값을 설정합니다. init()을 통해 매개변수를 가진 생성자 method를 만들어야 매개변수를 넣어 그 값을 가진 객체를 만들 수 있습니다.
class YoutuberClass {
var name: String
var subscribersCount: Int
// init() method call
init(name: String, subscribersCount: Int){
self.name = name
self.subscribersCount = subscribersCount
}
}
self라는 구조체의 인스턴스를 사용하여 name와 subscribersCount라는 매개변수를 가진 생성자 method를 호출하였습니다.
상속 시, 서브클래스는 반드시 super.init() 을 호출하여 상위 클래스의 초기화를 완료해야 합니다.
class Animal {
var name: String
init(name: String){
self.name = name
}
}
class Dog: Animal {
var breed: String
init(name: String, breed: String) {
self.breed = breed
super.init(name: name) // 상위 클래스 초기화 호출
}
}
Class 사용 시 주의할 점
- 참조 타입으로 인해 강한 참조 순환 문제(Strong Reference Cycle)이 발생할 수 있음.
강한 참조 순환 문제란?
객체 간의 강한 참조로 인해 메모리가 해제되지 않는 문제를 말하며, 이로 인해 메모리 누수(더 이상 필요하지 않은 메모리가 해제되지 않고 계속 점유된 상태로 남아있는 현상)가 발생할 수 있습니다.
Swift는 ARC를 사용하여 메모리를 관리합니다. 두 객체가 서로를 강하게 참조하고 있으면 ARC는 참조 카운트를 0으로 만들지 못하므로 메모리를 해제하지 않습니다.
class Person {
var pet: Pet?
}
class Pet {
var owner: Person?
}
var person: Person? = Person()
var pet: Pet? = Pet()
person?.pet = pet
pet?.person = person
이를 해결하기 위해 weak나 unowned 키워드로 순환 참조를 방지합니다.
- weak: 참조 카운트를 증가시키지 않습니다. 옵셔널로 선언해야 하며, 참조 대상이 해제되면 자동으로 nil이 됩니다.
- unowned: 참조 카운트를 증가시키지 않습니다. 옵셔널이 아니며 참조 대상이 항상 존재한다고 가정할 때 사용합니다.
'App Development > Swift' 카테고리의 다른 글
Swift의 매개변수(parameter) 정리하기 (0) | 2024.11.30 |
---|---|
Swift에서의 completion (0) | 2024.11.26 |
Swift의 Closure 란? (0) | 2024.11.25 |
Swift의 ARC (Automatic Reference Counting) (0) | 2024.11.24 |
Swift 분기 처리 정의와 종류 (0) | 2024.11.23 |