












age, weight 둘 다 (모두) 초기화 시키는 생성자를 designate initializer 라고 한다




종류가 굉장히 많다



swift 에서 상속을 받을 땐 부모가 하나만 있고, 나머지는 모두 프로토콜이다





중요! 부모와 자식 간에서 같은 메서드를 쓸 때 자식을 우선으로 한다는 override 키워드를 사용해야 함
name 부분에 값이 "김소프" 를 대입했는데 코드에는 빠져있음
에러문구 : "오버라이딩 선언에는 'override' 키워드가 필요합니다"
수정 후




위 코드로 실행하면 에러가 남
해결 방법은 아래 참조

1번, 2번 추천
3, 4번 비추천 (정상적일 때는 문제가 없으나 값이 nil일 때 문제 발생)

age가 0이면 nil을 반환함
뤼튼 활용 주석설명
class Man {
var age: Int = 0 // 나이를 저장하는 변수
var weight: Double = 0.0 // 몸무게를 저장하는 변수
// 초기화 메서드, age와 weight를 매개변수로 받음
init?(age: Int, weight: Double) {
// 나이와 몸무게가 0 이하일 경우 nil을 반환하여 초기화 실패
if age <= 0 || weight <= 0.0 {
return nil
} else {
// 유효한 값일 경우, 인스턴스 변수에 값을 할당
self.age = age
self.weight = weight
}
// 중복된 코드: 이미 위에서 값을 할당했으므로 이 부분은 불필요
self.age = age
self.weight = weight
} // 지정 초기화자
// 인스턴스의 나이와 몸무게를 출력하는 메서드
func display() {
print("나이: \(age), 몸무게: \(weight)")
}
}
// Man 클래스의 인스턴스를 생성, age가 5이고 weight가 10.3인 경우
if let dong = Man(age: 5, weight: 10.3) { // age가 0이면 nil을 반환
// 인스턴스가 성공적으로 생성되면 display 메서드를 호출
dong.display()
}
질문 : swift로 class를 만들려고 해. 상속, overriding, failable initialize을 모두 활용한 코드를 하나 만들어줘
// 부모 클래스 Vehicle
class Vehicle {
var speed: Int
init(speed: Int) {
self.speed = speed
}
func description() {
print("This vehicle moves at \(speed) km/h")
}
}
// 자식 클래스 Car, Vehicle을 상속받음
class Car: Vehicle {
var model: String
// 실패 가능한 초기화 (Failable Initializer)
init?(speed: Int, model: String) {
if speed < 0 || model.isEmpty {
return nil // 속도 음수 또는 모델명이 비어있으면 초기화 실패
}
self.model = model
super.init(speed: speed) // 부모 클래스의 초기화 호출
}
// 오버라이딩된 메서드
override func description() {
print("This \(model) car moves at \(speed) km/h")
}
}
// Car 객체를 초기화해 봄
if let myCar = Car(speed: 120, model: "Tesla") {
myCar.description() // 출력: "This Tesla car moves at 120 km/h"
} else {
print("Failed to initialize Car")
}
// 실패하는 경우
if let myCar = Car(speed: -10, model: "BMW") {
myCar.description()
} else {
print("Failed to initialize Car") // 출력: "Failed to initialize Car"
}