[Day 10]
@ Day 10 | 클래스와 구조체의 5가지 차이
# 클래스는 이니셜라이저가 필수
- 구조체와 달리 memberwise initializer 사용 불가
class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
let jaerong = Dog(name: "Jaerong", breed: "Maltese")
# 클래스는 다른 클래스로부터 상속 가능
- 상속의 대상이 되는 클래스는
부모 클래스
혹은 슈퍼 클래스
, 상속한 클래스는 자식 클래스
단일 상속
만 가능, 다중 상속 불가
- 상속 방법 :
Class childClass: parentClass { //somecode }
class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class Maltese: Dog {
init(name: String) {
super.init(name: name, breed: "Maltese")
}
}
메서드 오버라이딩(Overriding)
- 자식 클래스는
override
키워드를 통해 부모 클래스의 메서드를 수정할 수 있음
class Dog {
func makeNoise() {
print("Woof!")
}
}
class Maltese: Dog {
override func makeNoise() {
print("Mung Mung!")
}
}
let jaerong = Maltese()
jaerong.makeNoise()
파이널 클래스
- 어떤 클래스를
final class
로 선언하면 다른 클래스가 해당 클래스를 상속하는 것을 금지 가능
final class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class finalDog: Dog {}
# 클래스의 복사본들은 모두 동일한 데이터를 가리킴
- 따라서
한 복사본에서 프로퍼티를 변경
하면 해당 인스턴스의 모든 복사본이 변경
됨
구조체
의 경우 각각의 복사본은 독립적
으로 존재하므로 한 복사본에서 프로퍼티를 변경하더라도 다른 복사본과는 무관
class Singer {
var name = "Taylor Swift"
}
var singer = Singer()
print(singer.name)
var singerCopy = singer
singerCopy.name = "Justin Bieber"
print(singer.name)
# 클래스에는 디니이셜라이저(deinitializer)가 있음
디이니셜라이저
: 클래스의 인스턴스가 파괴될 때 실행되는 코드
- 클래스 인스턴스의 마지막 복사본이 삭제될 때 해당 인스턴스가 파괴됨
class Person {
var name = "John Doe"
init() {
print("\(name) is alive!")
}
func printGreeting() {
print("Hello, I'm \(name)")
}
deinit {
print("\(name) is no more!")
}
}
for _ in 1...3 {
let person = Person()
person.printGreeting()
}
# 클래스는 상수로 선언했어도 프로퍼티가 변수로 선언되었다면 수정 가능
- 구조체는 인스턴스를 상수로 선언했다면 프로퍼티가 변수로 선언되었더라도 값 변경 불가
class Singer {
var name = "Taylor Swift"
}
let swift = Singer()
swift.name = "Justin Bieber"
print(swift.name)