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

311자
4분

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

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

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

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

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

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

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

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

YouTube 영상

채널 보기
인터셉터와 RxJS로 캐시 시스템 구축하기 | NestJS 가이드
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
입력을 전처리하는 Functor - Contravariant와 contramap 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 인터셉터란? | NestJS 가이드
NestJS 커스텀 데코레이터 인자 전달 및 파이프 검증 활용법 | NestJS 가이드
함수 객체의 보편적 구성 | 프로그래머를 위한 카테고리 이론
관점 지향 로깅 인터셉터 구현 및 전역 바인딩 전략 | NestJS 가이드
매번 ValidationPipe 복붙하세요? NestJS 전역 파이프로 한 번에 해결하기 | NestJS 가이드