클래스는 참조 타입입니다.
구조체와 쓰임이 비슷하지만, 구조체와는 다르게 상속할 수있고,
deinit를 사용할수 있으며, 참조횟수 계산도 가능합니다.
또한, 클래스의 인스턴스에 타입 캐스팅이 가능합니다.
기본 형태
class ClassName{
//구현부
}
예제
class Food{
//불변 프로퍼티
//가변 프로퍼티
var name: String
var price: Int
//타입 프로퍼티
final class var writer:String{
return "녹색하늘"
}
class var location: String{
return "안양"
}
//생성자
init(){
name = ""
price = 0
}
init(name: String, price: Int){
self.name = name
self.price = price
}
//소멸자 : 클래스가 역할을 다하고 메모리에서 사라질 때 호출
deinit{
print("소멸되었습니다.")
}
}
여기서, 생성자가 두종류입니다.
아이에 매개변수가 없는 생성자와 매개변수가 있는 생성자가 있죠?
이는 별도의 매개변수 없이도 인스턴스를 생성할 수 있게 해줍니다.
그리고 deinit 생소한 함수가 하나 있는데요,
해당 클래스의 인스턴스가 메모리 해제되기 직전 호출이 됩니다.
//init call
var food : Food? = Food(name: "스시",price: 4000)
//deinit call
food = nil //소멸되었습니다.
위 예제에 추가로 예시를 들어보겠습니다. Food 클래스 안에 아래의 메서드를 넣을 수 있을까요?
func print(){
Swift.print("\(Food.location)에 있는\(self.name)의 가격은 \(self.price)입니다.")
클래스안의 인스턴스 메서드 내에서 타입 프로퍼티에 self 사용 불가합니다.
왜냐하면, 인스턴스 매서드는
클래스의 인스턴스에서 호출할 수 있기 때문이죠.
타입 프로퍼티는 인스턴스에서 접근이 불가능했죠? ㅎㅎ
그럼 반대는 어떨까요? 타입 메서드 안에 타입 프로퍼티 외의 프로퍼티를 사용할 수 있을까요?
static func print(){
Swift.print("\(Food.location)에 있는\(Food.name)의 가격은 \(self.price)입니다.")
}
클래스 내부의 타입 메서드에서는 타입 프로퍼티 외에는 사용이 불가능합니다.
self가 아닌 Food를 참조해도 마찬가지입니다.
클래스 상속과 Override
상속은 자식클래스(서브클래스)가 부모클래스(슈퍼클래스)의
프로퍼티와 메소드를 그대로 이어받는 것 입니다.
Override는 부모클래스(슈퍼클래스)의 프로퍼티나 메소드를
자식메서드(서브클래스)가 재정의해서 사용하는것입니다.
위의 예제의 Food를 상속받는 detailFood 클래스를 만들어 보겠습니다.
상속 및 override
class DetailFood: Food{
var restaurantName : String
var phoneNumber : Int
//자식클래스의 프로퍼티먼저 초기화한 후 super.init를 사용해야 한다.
init(name : String, price : Int, restaurantName: String, phoneNumber: Int){
self.restaurantName = restaurantName
self.phoneNumber = phoneNumber
//부모클래스의 이니셜라이저 호출
super.init(name: name, price: price)
}
//class 타입 프로퍼티 override
override class var location: String{
return "강남"
}
/*
부모클래스에서 final로 override를 막아놓아 사용 불가
override class var writer: String{
return "푸른하늘"
}
*/
func print(){
Swift.print("\(restaurantName)의 전화번호는 \(phoneNumber)입니다.")
Swift.print("\(name)는 \(price)입니다.")
}
}
Food 클래스를 상속받아서 변수와 프로퍼티 메서드를 추가한 모습입니다.
이니셜라이저 또한 상속 및 override가 가능합니다.
print함수에서 detailFood에선 선언하지 않은 name과 price까지 사용한 것 보이시나요?
추가적으로, 클래스의 인스턴스는 참조타입이라 불변으로 선언되었어도
인스턴스 프로퍼티의 값 변경이 가능합니다.
var food : Food? = Food(name: "스시",price: 4000)
food.name = "불고기"
food.price = "6000"
공부에 도움이 된 사이트들
전체적인 공부 가이드라인
클래스와 구조체에 대한 상세한 설명 및 예시
https://minominodomino.github.io/devlog/2019/05/01/swift-class-struct/
프로퍼티 상속 예제
https://zeddios.tistory.com/251
이니셜라이저 상속 및 orverride
deinit에대한 자세한 내용
'Language > Swift' 카테고리의 다른 글
Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리] (0) | 2021.03.11 |
---|---|
Swift 사용자 정의 타입 - enum (0) | 2021.03.11 |
Swift 사용자 정의 타입 - Struct (0) | 2021.03.11 |
Swift 옵셔널 (0) | 2021.03.11 |
Swift 반복문 (0) | 2021.03.10 |