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

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 영상

채널 보기
스칼라 곱셈과 내적의 기하학적 의미 | 선형대수학
내적의 기하학적 의미와 코사인 유사도 원리 | 선형대수학
트라이(Trie) 자료구조: 파이썬으로 삽입(Insert) 연산 구현하기 | Trie 자료구조 이야기
벡터의 정의와 덧셈 연산 | 선형대수학
인공지능은 세상을 어떻게 숫자로 읽는가? - 이미지, 소리 그리고 텍스트가 행렬이 되는 원리 | 선형대수학
AI 추천 시스템의 원리, 벡터 사이의 각도와 코사인 유사도 | 선형대수학
AI를 위한 선형대수학 - 소개 | 선형대수학
행렬의 기본 연산 - 행렬 덧셈, 스칼라 곱, 전치 | 선형대수학