상속 (Inheritance) - 기본 클래스 정의 (Defining a Base Class) / 하위 클래스 (Subclassing)

00yhsp·2024년 5월 2일

기능을 추가 또는 재정의 하기 위한 하위 클래스이다.

클래스는 다른 클래스에서 메서드, 프로퍼티, 그리고 다른 특성을 상속 (inherit)할 수 있다. 클래스가 다른 클래스로 부터 상속될 때 상속하는 클래스를 하위 클래스 (subclass) 라고 하고 상속된 클래스를 상위 클래스 (superclass) 라고 합니다. 상속은 Swift에서 다른 타입과 클래스를 구분하는 기본적인 동작이다.

Swift에서 클래스는 상위 클래스에 속하는 메서드, 프로퍼티, 그리고 서브 스크립트를 호출하고 접근할 수 있으며 메서드, 프로퍼티, 그리고 서브 스크립트를 동작을 수정하기위해 재정의한 버전을 제공할 수 있다. Swift는 재정의에 일치하는 상위 클래스 정의가 있는지 확인하고 재정의가 올바른지 확인하는데 도움을 준다.

클래스는 프로퍼티의 값이 변경될 때 알려주기 위해 상속된 프로퍼티에 프로퍼티 관찰자를 추가할 수도 있다. 프로퍼티 관찰자는 기존 프로퍼티가 저장된 프로퍼티 또는 계산된 프로퍼티로 정의되었는지 상관없이 프로퍼티에 추가될 수 있다.

기본 클래스 정의 (Defining a Base Class)

다른 클래스에서 상속하지 않은 클래스를 기본 클래스 (base class)라고 한다.

Note
Swift 클래스는 범용 기본 클래스를 상속하지 않는다.
상위 클래스 지정 없이 정의한 클래스는 자동적으로 빌드할 때 기본 클래스가 된다.

아래 예제는 Vehicle이라는 기본 클래스를 정의한다. 이 기본 클래스는 Double의 프로퍼티 타입으로 유추되는 0.0의 기본값을 가지는 currentSpeed라는 저장된 프로퍼티를 정의한다. currentSpeed 프로퍼티의 값은 탈 것의 설명을 생성하기 위해 description이라는 읽기 전용 계산된 String 프로퍼티에 사용된다.

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
    }
}

타입 이름 뒤에 빈 소괄호를 작성한 초기화 구문으로 Vehicle의 새로운 인스턴스를 생성한다:

let someVehicle = Vehicle()

새로운 Vehicle 인스턴스를 생성하면 탈 것의 현재 속도의 설명을 출력하기 위해 description 프로퍼티에 접근할 수 있다.

print("Vehicle: \(someVehicle.description)")

Vehicle 클래스는 임의의 탈 것에 대한 공통 특성을 정의하지만 그 자체로는 많이 사용되지 않는다.
더 유용하게 사용하기 위해 더 구체적인 탈 것 종류를 설명하기 위해 수정이 필요하다.

하위 클래스 (Subclassing)

하위 클래스 (Subclassing)는 기존 클래스를 기반으로 새로운 클래스를 만드는 작업이다. 하위 클래스는 기존 클래스의 특성을 상속하므로 수정할 수 있다. 하위 클래스에 새로운 특성도 추가할 수 있다.

하위 클래스가 상위 클래스를 가지고 있다는 것을 나타내기 위해 하위 클래스 이름은 상위 클래스 이름 전에 콜론으로 구분하여 작성한다.

class SomeSubclass: SomeSuperclass {
	// subclass definition goes here
}

다음의 예제는 Vehicle을 상위 클래스로 가지는 Bicycle이라는 하위 클래스를 정의한다.

class Bicycle: Vehicle {
	var hasBasket = false
}

새로운 Bicycle 클래스는 currentSpeed와 description 프로퍼티와 makeNoise() 메서드와 같은 Vehicle의 모든 특성을 자동적으로 얻는다.
상속한 특성 외에도 Bicycle 클래스는 Bool 타입으로 유추되는 기본값 false인 hasBasket이라는 새로운 저장된 프로퍼티를 정의한다.
기본적으로 생성한 새로운 Bicycle 인스턴스는 바구니를 가지고 있지 않다. 인스턴스가 생성된 후에 특정 Bicycle 인스턴스의 hasBasket 프로퍼티를 true로 설정할 수 있다.

let bicycle = Bicycle()
bicycle.hasBasket = true

Bicycle 인스턴스의 상속된 currentSpeed 프로퍼티를 수정할 수 있고 상속된 description 프로퍼티를 조회할 수도 있다.

bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour

하위 클래스는 그 자체로 하위 클래스화 될 수 있다. 다음 예제는 "tandem" 이라는 2개의 안장을 가진 자전거를 위한 Bicycle의 하위 클래스를 생성한다:

class Tandem: Bicycle {
    var currentNumberOfPassengers = 0
}

Tandem 은 Bicycle 의 모든 프로퍼티와 메서드를 상속하고 차례로 Vehicle 의 모든 프로퍼티와 메서드를 상속한다. Tandem 하위 클래스는 기본값 0 인 currentNumberOfPassengers 라는 새로운 저장된 프로퍼티도 추가한다.

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
profile
iOS Dev

0개의 댓글