
현재 코드가 오류가 나는 이유를 설명해드릴게요!
class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class Collie: Dog {
// ❌ 여기서 오류 발생!
}
Dog 클래스에는 designated initializer가 있음Collie는 Dog를 상속받았지만, 부모의 초기화 메서드를 호출하지 않음Swift의 초기화 규칙:
1. 모든 저장 프로퍼티는 초기화되어야 함
2. 자식 클래스는 부모 클래스의 초기화 메서드를 호출해야 함
3. designated initializer가 있으면 반드시 호출해야 함
class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class Collie: Dog {
// ✅ 부모 클래스의 초기화 메서드 호출
init(name: String) {
super.init(name: name, breed: "Collie")
}
}
// 사용 예시
let myCollie = Collie(name: "래시")
print("\(myCollie.name)는 \(myCollie.breed) 품종입니다.")
// 출력: 래시는 Collie 품종입니다.
class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class Collie: Dog {
var intelligence: Int // 콜리 특유의 지능 점수
init(name: String, intelligence: Int) {
self.intelligence = intelligence // 1. 자신의 프로퍼티 먼저 초기화
super.init(name: name, breed: "Collie") // 2. 부모 초기화 호출
}
}
// 사용 예시
let smartCollie = Collie(name: "래시", intelligence: 95)
print("\(smartCollie.name)의 지능: \(smartCollie.intelligence)점")
class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
self.name = name
self.breed = breed
}
}
class Collie: Dog {
var intelligence: Int
// 기본 초기화 (지능 점수 기본값)
init(name: String) {
self.intelligence = 80 // 기본 지능 점수
super.init(name: name, breed: "Collie")
}
// 상세 초기화 (지능 점수 직접 설정)
init(name: String, intelligence: Int) {
self.intelligence = intelligence
super.init(name: name, breed: "Collie")
}
// 완전 커스텀 초기화
init(name: String, breed: String, intelligence: Int) {
self.intelligence = intelligence
super.init(name: name, breed: breed)
}
}
// 다양한 사용 방법
let collie1 = Collie(name: "래시") // 기본 지능
let collie2 = Collie(name: "보더", intelligence: 95) // 지능 설정
let collie3 = Collie(name: "믹스", breed: "Border Collie", intelligence: 90) // 완전 커스텀
class Dog {
var name: String
var breed: String
init(name: String, breed: String) {
print("🐕 Dog 초기화: \(name), \(breed)")
self.name = name
self.breed = breed
}
}
class Collie: Dog {
var intelligence: Int
init(name: String, intelligence: Int) {
print("🧠 Collie 프로퍼티 초기화 시작")
self.intelligence = intelligence // 1️⃣ 자신의 프로퍼티 먼저
print("📞 부모 클래스 초기화 호출")
super.init(name: name, breed: "Collie") // 2️⃣ 부모 초기화
print("✅ Collie 초기화 완료")
}
}
// 테스트
let collie = Collie(name: "래시", intelligence: 95)
출력 결과:
🧠 Collie 프로퍼티 초기화 시작
📞 부모 클래스 초기화 호출
🐕 Dog 초기화: 래시, Collie
✅ Collie 초기화 완료
super.init() 호출super.init() 이후에만 가능