🔥 기본 클래스 정의하기

297자
4분

상속을 사용하기 위해서는 먼저 기본이 되는 클래스를 정의해야겠죠? 다른 클래스로부터 상속받지 않는 클래스를 기본 클래스(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

이렇게 상속을 활용하면 코드의 재사용성을 높이고, 계층적 구조를 통해 더욱 구체적이고 세분화된 개념을 표현할 수 있게 됩니다.

lecture image

위 다이어그램은 VehicleBicycle 클래스 간의 상속 관계를 보여주고 있어요. 이런 식으로 상속을 활용하여 코드를 구성하면 더욱 유연하고 확장 가능한 구조를 만들 수 있답니다.