🔥 하위 클래스 정의 및 멤버 오버라이딩

311자
4분

Swift에서는 현재 접근 컨텍스트에서 접근할 수 있고 하위 클래스와 같은 모듈에 정의된 모든 클래스를 하위 클래스로 지정할 수 있습니다. 또한 다른 모듈에 정의된 모든 open 클래스를 하위 클래스로 지정할 수 있죠. 하지만 하위 클래스는 상위 클래스보다 높은 접근 수준을 가질 수 없습니다. 예를 들어, internal 상위 클래스의 public 하위 클래스를 작성할 수는 없어요.

또한 같은 모듈에 정의된 클래스의 경우, 특정 접근 컨텍스트에서 보이는 모든 클래스 멤버(메서드, 속성, 이니셜라이저 또는 서브스크립트)를 오버라이드할 수 있답니다. 다른 모듈에 정의된 클래스의 경우에는 모든 open 클래스 멤버를 오버라이드할 수 있어요.

오버라이드는 상속된 클래스 멤버를 상위 클래스 버전보다 더 접근 가능하게 만들 수 있습니다. 아래 예제에서 클래스 AsomeMethod()라는 file-private 메서드를 가진 public 클래스입니다. 클래스 BA의 하위 클래스이며, 접근 수준이 "internal"로 낮아졌어요. 그럼에도 불구하고 클래스 BsomeMethod()의 오버라이드를 "internal" 접근 수준으로 제공하는데, 이는 someMethod()의 원래 구현보다 높은 접근 수준이지요.

public class A {
    fileprivate func someMethod() {
        // file-private 메서드 구현
    }
}
 
internal class B: A {
    override internal func someMethod() {
        // internal 메서드로 오버라이드
    }
}
swift

심지어 하위 클래스 멤버가 상위 클래스 멤버보다 낮은 접근 권한을 가지고 있더라도, 상위 클래스 멤버 호출이 허용된 접근 수준 컨텍스트 내에서 이루어지는 한 하위 클래스 멤버에서 상위 클래스 멤버를 호출하는 것이 유효합니다. (즉, file-private 멤버 호출의 경우 상위 클래스와 동일한 소스 파일 내에서, internal 멤버 호출의 경우 상위 클래스와 동일한 모듈 내에서 말이죠.)

public class A {
    fileprivate func someMethod() {
        // file-private 메서드 구현
    }
}
 
internal class B: A {
    override internal func someMethod() {
        super.someMethod() // 상위 클래스의 file-private 메서드 호출
    }
}
swift

상위 클래스 A와 하위 클래스 B가 동일한 소스 파일에 정의되어 있기 때문에, BsomeMethod() 구현에서 super.someMethod()를 호출하는 것이 유효하답니다.

이처럼 Swift에서는 접근 제어와 관련된 다양한 규칙들이 존재하며, 이를 잘 이해하고 활용한다면 코드의 캡슐화와 모듈화를 효과적으로 달성할 수 있을 거예요. 하위 클래스를 정의하고 상위 클래스의 멤버를 오버라이드할 때에도 이러한 접근 제어 규칙을 염두에 두는 것이 중요합니다.