🔥 상속의 개념과 서브클래싱
객체 지향 프로그래밍에서 상속(Inheritance)은 매우 중요한 개념 중 하나입니다. 상속을 통해 기존 클래스의 특성을 물려받아 새로운 클래스를 만들 수 있죠. 이렇게 상속을 받은 클래스를 서브클래스(Subclass)라고 하고, 상속을 해준 클래스를 수퍼클래스(Superclass)라고 합니다.
서브클래싱(Subclassing)은 수퍼클래스를 기반으로 새로운 클래스를 만드는 것을 말해요. 서브클래스는 수퍼클래스의 특성을 상속받아 그대로 사용할 수도 있고, 필요에 따라 수정하거나 새로운 특성을 추가할 수도 있습니다.
서브클래스 정의하기
Swift에서 서브클래스를 정의할 때는 클래스 이름 뒤에 콜론(:)을 붙이고 수퍼클래스 이름을 적어주면 됩니다.
class SomeSubclass: SomeSuperclass { // 서브클래스 정의 }
swift
예를 들어, Vehicle
이라는 클래스를 수퍼클래스로 하는 Bicycle
서브클래스를 정의해볼까요?
class Bicycle: Vehicle { var hasBasket = false }
swift
Bicycle
클래스는 Vehicle
의 모든 특성을 자동으로 상속받습니다. 예를 들면 currentSpeed
와 description
속성, 그리고 makeNoise()
메서드 등이 있죠.
상속받은 특성 외에도 Bicycle
클래스는 hasBasket
이라는 새로운 저장 속성을 정의하고 있어요. 이 속성의 기본값은 false
이고, Swift는 타입 추론을 통해 Bool
타입으로 판단합니다.
서브클래스 인스턴스 사용하기
Bicycle
인스턴스를 생성하면 기본적으로 바구니가 없는 상태로 만들어집니다. 하지만 인스턴스 생성 후에 hasBasket
속성을 true
로 설정할 수 있죠.
let bicycle = Bicycle() bicycle.hasBasket = true
swift
또한 상속받은 currentSpeed
속성을 수정하거나 description
속성을 조회할 수 있습니다.
bicycle.currentSpeed = 15.0 print("Bicycle: \(bicycle.description)") // Bicycle: traveling at 15.0 miles per hour
swift
서브클래스의 서브클래싱
서브클래스 자체도 또 다른 클래스의 수퍼클래스가 될 수 있어요. 다음 예제는 Bicycle
을 수퍼클래스로 하는 2인용 자전거 Tandem
클래스를 만드는 코드입니다.
class Tandem: Bicycle { var currentNumberOfPassengers = 0 }
swift
Tandem
은 Bicycle
의 모든 속성과 메서드를 상속받고, Bicycle
은 Vehicle
의 모든 속성과 메서드를 상속받죠. 추가로 Tandem
클래스는 currentNumberOfPassengers
라는 새로운 저장 속성을 가지며, 기본값은 0
입니다.
Tandem
인스턴스를 생성하면 새로 추가된 속성과 상속받은 속성을 모두 사용할 수 있어요. 또한 Vehicle
로부터 상속받은 읽기 전용 description
속성도 그대로 사용 가능합니다.
let tandem = Tandem() tandem.hasBasket = true tandem.currentNumberOfPassengers = 2 tandem.currentSpeed = 22.0 print("Tandem: \(tandem.description)") // Tandem: traveling at 22.0 miles per hour
swift
이렇게 상속과 서브클래싱을 활용하면 코드의 재사용성을 높이고 클래스 간의 계층 구조를 만들 수 있습니다. 공통된 특성을 수퍼클래스에 정의하고, 서브클래스에서는 이를 상속받아 필요한 부분만 추가하거나 변경하는 식으로 말이죠.
상속 관계 이해하기
상속 관계를 이해하는 것은 매우 중요합니다. 다음 다이어그램은 Vehicle
, Bicycle
, Tandem
클래스 간의 상속 관계를 보여줍니다.
Vehicle
은 가장 상위의 수퍼클래스이고, Bicycle
은 Vehicle
을 상속받는 서브클래스입니다. 그리고 Tandem
은 Bicycle
을 상속받는 서브클래스죠.