🔥 하위 클래스 정의 및 멤버 오버라이딩
Swift에서는 현재 접근 컨텍스트에서 접근할 수 있고 하위 클래스와 같은 모듈에 정의된 모든 클래스를 하위 클래스로 지정할 수 있습니다. 또한 다른 모듈에 정의된 모든 open 클래스를 하위 클래스로 지정할 수 있죠. 하지만 하위 클래스는 상위 클래스보다 높은 접근 수준을 가질 수 없습니다. 예를 들어, internal 상위 클래스의 public 하위 클래스를 작성할 수는 없어요.
또한 같은 모듈에 정의된 클래스의 경우, 특정 접근 컨텍스트에서 보이는 모든 클래스 멤버(메서드, 속성, 이니셜라이저 또는 서브스크립트)를 오버라이드할 수 있답니다. 다른 모듈에 정의된 클래스의 경우에는 모든 open 클래스 멤버를 오버라이드할 수 있어요.
오버라이드는 상속된 클래스 멤버를 상위 클래스 버전보다 더 접근 가능하게 만들 수 있습니다. 아래 예제에서 클래스 A
는 someMethod()
라는 file-private 메서드를 가진 public 클래스입니다. 클래스 B
는 A
의 하위 클래스이며, 접근 수준이 "internal"로 낮아졌어요. 그럼에도 불구하고 클래스 B
는 someMethod()
의 오버라이드를 "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
가 동일한 소스 파일에 정의되어 있기 때문에, B
의 someMethod()
구현에서 super.someMethod()
를 호출하는 것이 유효하답니다.
이처럼 Swift에서는 접근 제어와 관련된 다양한 규칙들이 존재하며, 이를 잘 이해하고 활용한다면 코드의 캡슐화와 모듈화를 효과적으로 달성할 수 있을 거예요. 하위 클래스를 정의하고 상위 클래스의 멤버를 오버라이드할 때에도 이러한 접근 제어 규칙을 염두에 두는 것이 중요합니다.