🔥 타입 서브스크립트

329자
5분

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

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

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

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

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

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

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

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

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

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