🔥 Extension으로 서브스크립트 추가하기

295자
4분

Extension을 사용하면 기존 타입에 새로운 서브스크립트를 추가할 수 있습니다. 이 예제는 Swift의 내장 타입인 Int에 정수 서브스크립트를 추가합니다. 이 서브스크립트 [n]은 오른쪽에서부터 n번째 자리에 있는 10진수를 반환합니다:

  • 123456789[0]9를 반환합니다.
  • 123456789[1]8을 반환합니다.

이런 식으로 계속됩니다:

extension Int {
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10  // 10의 거듭제곱을 계산
        }
        return (self / decimalBase) % 10  // 해당 자리의 숫자를 반환
    }
}
 
746381295[0]
// 5를 반환합니다.
746381295[1]
// 9를 반환합니다.
746381295[2]
// 2를 반환합니다.
746381295[8]
// 7을 반환합니다.
swift

이 서브스크립트 구현에서는 먼저 decimalBase라는 변수를 1로 초기화합니다. 그런 다음 digitIndex만큼 반복하면서 decimalBase를 10씩 곱합니다. 이렇게 하면 digitIndex에 해당하는 10의 거듭제곱을 얻을 수 있죠.

예를 들어 digitIndex가 2이면 decimalBase는 100이 됩니다. 이는 오른쪽에서 세 번째 자리의 숫자를 얻기 위해 필요한 값이죠.

그 다음, 전체 숫자를 decimalBase로 나눈 몫을 10으로 나눈 나머지를 반환합니다. 이렇게 하면 해당 자리의 숫자를 얻을 수 있습니다.

만약 요청된 인덱스에 대해 Int 값의 자릿수가 충분하지 않으면, 서브스크립트 구현은 마치 숫자가 왼쪽에 0으로 채워진 것처럼 0을 반환합니다:

746381295[9]
// 0을 반환합니다. 마치 다음과 같이 요청한 것과 같죠:
0746381295[9]
swift

이 예제는 서브스크립트의 강력함을 잘 보여줍니다. 우리는 단순히 [] 문법을 사용하여 숫자의 특정 자릿수에 접근할 수 있게 되었죠. 이는 코드의 가독성과 표현력을 크게 향상시킵니다.

또한 이 예제는 Extension이 기존 타입에 새로운 기능을 추가하는 데 얼마나 유용한지를 보여줍니다. 우리는 Int 타입 자체를 수정하지 않고도 새로운 서브스크립트를 추가할 수 있었죠.

이처럼 Extension과 서브스크립트를 함께 사용하면 타입의 기능을 매우 유연하고 직관적인 방식으로 확장할 수 있습니다. 이는 코드의 가독성과 사용성을 향상시키는 강력한 도구입니다.

서브스크립트의 동작을 시각화하기 위해 다음과 같은 다이어그램을 그려볼 수 있습니다:

lecture image

이 다이어그램은 서브스크립트를 통해 숫자의 각 자리에 어떻게 접근하는지를 명확하게 보여줍니다. Extension과 서브스크립트의 조합은 정말 강력하고 표현력 있는 코드를 작성할 수 있게 해주는 도구라 할 수 있겠네요!