🔥 기본 클래스 정의하기
상속을 사용하기 위해서는 먼저 기본이 되는 클래스를 정의해야겠죠? 다른 클래스로부터 상속받지 않는 클래스를 기본 클래스(base class)
라고 합니다.
아래 예제에서는 Vehicle
이라는 기본 클래스를 정의하고 있어요. 이 기본 클래스에는 currentSpeed
라는 저장 속성이 있는데, 기본값으로 0.0
을 가지고 있답니다. (타입 추론에 의해 Double
타입으로 결정됩니다.) currentSpeed
속성의 값은 description
이라는 읽기 전용 계산 속성에서 사용되어 차량의 설명을 만들어내요.
또한 Vehicle
기본 클래스에는 makeNoise()
라는 메서드도 정의되어 있습니다. 이 메서드는 기본 Vehicle
인스턴스에서는 실제로 아무 작업도 하지 않지만, 나중에 Vehicle
의 서브클래스에서 커스터마이징될 거예요.
class Vehicle { var currentSpeed = 0.0 // 현재 속도를 나타내는 저장 속성 var description: String { // 차량 설명을 제공하는 읽기 전용 계산 속성 return "traveling at \(currentSpeed) miles per hour" } func makeNoise() { // 차량 소음을 나타내는 메서드 // do nothing - an arbitrary vehicle doesn't necessarily make a noise } }
swift
Vehicle
의 새 인스턴스를 만들 때는 이니셜라이저 문법
을 사용하는데, 이는 타입 이름 뒤에 빈 괄호를 쓰는 형태랍니다.
let someVehicle = Vehicle() // Vehicle 인스턴스 생성
swift
새로운 Vehicle
인스턴스를 생성한 후에는 description
속성에 접근하여 현재 속도에 대한 사람이 읽을 수 있는 설명을 출력할 수 있어요.
print("Vehicle: \(someVehicle.description)") // Vehicle: traveling at 0.0 miles per hour
swift
Vehicle
클래스는 임의의 차량에 대한 공통적인 특성을 정의하고 있지만, 그 자체로는 큰 쓸모가 없어 보이네요. 더 유용하게 만들려면 더 구체적인 종류의 차량을 설명할 수 있도록 세분화해야 할 것 같아요.
예를 들어 다음과 같이 Vehicle
을 상속받는 Bicycle
클래스를 정의할 수 있겠죠?
class Bicycle: Vehicle { // Vehicle 클래스를 상속받는 Bicycle 클래스 var hasBasket = false // 자전거 바구니 유무를 나타내는 속성 }
swift
이렇게 상속을 활용하면 코드의 재사용성을 높이고, 계층적 구조를 통해 더욱 구체적이고 세분화된 개념을 표현할 수 있게 됩니다.
위 다이어그램은 Vehicle
과 Bicycle
클래스 간의 상속 관계를 보여주고 있어요. 이런 식으로 상속을 활용하여 코드를 구성하면 더욱 유연하고 확장 가능한 구조를 만들 수 있답니다.