🔥 제네릭 접근 수준

261자
3분

Swift에서 제네릭 타입이나 제네릭 함수의 접근 수준은 해당 제네릭 타입 또는 함수 자체의 접근 수준과 해당 제네릭의 타입 매개변수에 적용되는 타입 제약의 접근 수준 중 최소 접근 수준으로 결정됩니다.

이게 무슨 말일까요? 예제 코드를 통해 하나씩 살펴보도록 하죠.

swift
public struct Stack<T> {
    // 내부 속성과 메서드의 접근 수준은 public입니다.
    public var items = [T]()
    public mutating func push(_ item: T) {
        items.append(item)
    }
    public mutating func pop() -> T {
        return items.removeLast()
    }
}
swift
public struct Stack<T> {
    // 내부 속성과 메서드의 접근 수준은 public입니다.
    public var items = [T]()
    public mutating func push(_ item: T) {
        items.append(item)
    }
    public mutating func pop() -> T {
        return items.removeLast()
    }
}

위 코드에서 Stack 구조체는 public 접근 수준으로 선언되어 있습니다. 그리고 Stack 내부의 속성과 메서드들도 모두 public으로 선언되어 있네요. 이 경우, Stack 구조체의 타입 매개변수 T에는 어떤 타입 제약도 적용되어 있지 않기 때문에, Stack 구조체의 접근 수준은 public이 됩니다.

그런데 만약 다음과 같이 타입 매개변수 Tprivate 접근 수준의 타입을 타입 제약으로 적용하면 어떻게 될까요?

swift
private protocol PrivateElement {
    var value: Int { get set }
}
 
public struct Stack<T: PrivateElement> {
    public var items = [T]()
    public mutating func push(_ item: T) {
        items.append(item)
    }
    public mutating func pop() -> T {
        return items.removeLast()
    }
}
swift
private protocol PrivateElement {
    var value: Int { get set }
}
 
public struct Stack<T: PrivateElement> {
    public var items = [T]()
    public mutating func push(_ item: T) {
        items.append(item)
    }
    public mutating func pop() -> T {
        return items.removeLast()
    }
}

이 경우, Stack 구조체 자체는 public으로 선언되었지만, 타입 매개변수 T에 적용된 타입 제약인 PrivateElement 프로토콜이 private 접근 수준을 가지고 있습니다. 따라서 Stack 구조체의 실제 접근 수준은 private이 되는 거예요.

이렇게 제네릭 타입이나 함수의 접근 수준은 해당 제네릭의 타입 매개변수에 적용되는 타입 제약의 접근 수준에 의해서도 영향을 받는답니다.

실제로 위 코드에서 Stack 구조체를 다른 모듈에서 사용하려고 하면, PrivateElementprivate 접근 수준을 가지고 있기 때문에 컴파일 에러가 발생합니다.

이처럼 제네릭을 설계할 때는 타입 매개변수에 적용하는 타입 제약의 접근 수준도 함께 고려해야 한다는 점, 꼭 기억해 두시기 바랍니다!

YouTube 영상

채널 보기
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
Trie(트라이) 자료구조 원리와 파이썬 클래스 설계 및 구현 | Trie 자료구조 이야기
마지막편, 트라이 노드를 50% 이상 줄이는 방법? 압축 트라이 성능 분석 | Trie 자료구조 이야기
BTree 노드의 구조는?
내적의 기하학적 의미와 코사인 유사도 원리 | 선형대수학
마지막편, 10억 개 데이터 검색이 0.3ms면 끝나는 이유와 LSM-Tree의 등장
트라이(Trie) 자료구조: 파이썬으로 삽입(Insert) 연산 구현하기 | Trie 자료구조 이야기
트라이(Trie)에서 단어를 삭제하는 방법 | Trie 자료구조 이야기