🔥 타입 서브스크립트

329자
5분

앞서 설명한 것처럼, 인스턴스 서브스크립트는 특정 타입의 인스턴스에 대해 호출하는 서브스크립트예요. 하지만 타입 자체에 대해 호출되는 서브스크립트를 정의할 수도 있죠. 이런 종류의 서브스크립트를 타입 서브스크립트(type subscript)라고 해요. 타입 서브스크립트를 나타내려면 subscript 키워드 앞에 static 키워드를 작성하면 됩니다. 클래스의 경우에는 class 키워드를 사용하여 서브클래스가 슈퍼클래스의 해당 서브스크립트 구현을 재정의할 수 있도록 할 수 있죠. 아래 예제는 타입 서브스크립트를 정의하고 호출하는 방법을 보여줍니다.

swift
enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
 
    static subscript(n: Int) -> Planet {
        return Planet(rawValue: n)!
    }
}
 
let mars = Planet[4] // Planet.mars
print(mars) // mars
swift
enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
 
    static subscript(n: Int) -> Planet {
        return Planet(rawValue: n)!
    }
}
 
let mars = Planet[4] // Planet.mars
print(mars) // mars

위 예제에서는 Planet이라는 열거형을 정의하고 있어요. 이 열거형은 태양계의 행성들을 나타내며, 각 행성은 정수형 원시값을 가지고 있죠.

그리고 Planet 열거형에 static subscript를 정의하여 정수 값을 입력받아 해당하는 행성을 반환하도록 했어요. 이 서브스크립트는 입력된 정수 n을 원시값으로 사용하여 Planet 인스턴스를 생성하고 반환합니다.

이제 Planet[4]와 같이 열거형 이름 뒤에 대괄호와 정수 값을 붙여서 타입 서브스크립트를 호출할 수 있답니다. 위 예제에서 Planet[4]mars 케이스를 반환하죠.

타입 서브스크립트를 사용하면 타입과 관련된 유용한 기능을 간단하게 구현할 수 있어요. 예를 들면, 위 예제처럼 열거형의 원시값을 이용해 인스턴스를 생성하는 기능을 제공할 수 있겠죠?

또 다른 예시로, 문자열 타입에 대한 타입 서브스크립트를 정의하여 특정 패턴이나 정규식에 매칭되는 문자열을 반환하는 기능을 만들 수도 있을 거예요.

swift
extension String {
    static subscript(pattern: String) -> [String] {
        // 정규식을 사용하여 패턴에 맞는 문자열을 찾아 반환합니다.
        let regex = try! NSRegularExpression(pattern: pattern)
        let matches = regex.matches(in: self, range: NSRange(self.startIndex..., in: self))
        return matches.map { String(self[Range($0.range, in: self)!]) }
    }
}
 
let str = "Hello, world! Hello, Swift!"
let helloPattern = "Hello, [a-zA-Z]+!"
let matches = String[helloPattern]
print(matches) // ["Hello, world!", "Hello, Swift!"]
swift
extension String {
    static subscript(pattern: String) -> [String] {
        // 정규식을 사용하여 패턴에 맞는 문자열을 찾아 반환합니다.
        let regex = try! NSRegularExpression(pattern: pattern)
        let matches = regex.matches(in: self, range: NSRange(self.startIndex..., in: self))
        return matches.map { String(self[Range($0.range, in: self)!]) }
    }
}
 
let str = "Hello, world! Hello, Swift!"
let helloPattern = "Hello, [a-zA-Z]+!"
let matches = String[helloPattern]
print(matches) // ["Hello, world!", "Hello, Swift!"]

위 예제에서는 String 타입에 static subscript를 추가하여 정규식 패턴을 입력받아 해당 패턴에 매칭되는 문자열을 배열로 반환하도록 했어요. 이렇게 하면 String[helloPattern]과 같이 호출하여 간단하게 문자열 검색 기능을 사용할 수 있게 됩니다.

이처럼 타입 서브스크립트를 활용하면 타입 수준에서 유용한 기능을 제공하고, 코드의 가독성과 사용성을 높일 수 있답니다. 우리가 정의한 타입에 어떤 기능이 필요한지 고민해보고, 타입 서브스크립트를 적절하게 활용해보는 것이 좋겠죠?

YouTube 영상

채널 보기
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학
숫자 하나가 AI 모델의 운명을 바꾼다? | 선형대수학
우리가 매일 쓰는 맞춤법 검사기와 라우터 속에 숨겨진 알고리즘은? | Trie 자료구조 이야기
트라이(Trie) 자료구조: 파이썬으로 삽입(Insert) 연산 구현하기 | Trie 자료구조 이야기
마지막편, 트라이 노드를 50% 이상 줄이는 방법? 압축 트라이 성능 분석 | Trie 자료구조 이야기
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
트라이(Trie)에서 단어를 삭제하는 방법 | Trie 자료구조 이야기
직교성과 벡터 투영 | 선형대수학