🔥 Extension으로 계산 속성 추가하기

342자
4분

Extension을 사용하면 기존 타입에 계산 인스턴스 속성과 계산 타입 속성을 추가할 수 있습니다. 아래 예제는 Swift의 내장 타입인 Double에 다섯 개의 계산 인스턴스 속성을 추가하여 거리 단위를 다루는 기본적인 기능을 제공합니다:

extension Double {
    var km: Double { return self * 1_000.0 }  // 킬로미터로 변환
    var m: Double { return self }             // 미터로 변환
    var cm: Double { return self / 100.0 }    // 센티미터로 변환
    var mm: Double { return self / 1_000.0 }  // 밀리미터로 변환
    var ft: Double { return self / 3.28084 }  // 피트로 변환
}
 
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// "One inch is 0.0254 meters" 출력
 
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
// "Three feet is 0.914399970739201 meters" 출력
swift

이 계산 속성들은 Double 값이 특정 길이 단위로 고려되어야 함을 나타냅니다. 비록 계산 속성으로 구현되었지만, 이러한 속성의 이름은 점 문법을 사용하여 부동 소수점 리터럴 값에 덧붙일 수 있습니다. 이는 해당 리터럴 값을 사용하여 거리 변환을 수행하는 방법이 됩니다.

예를 들어, 1.0Double 값은 "1미터"를 나타내는 것으로 간주됩니다. 이것이 m 계산 속성이 self를 반환하는 이유죠. 즉, 표현식 1.m1.0Double 값을 계산하는 것으로 간주됩니다.

다른 단위는 미터로 측정된 값으로 표현하기 위해 일부 변환이 필요합니다. 1킬로미터는 1,000미터와 같기 때문에 km 계산 속성은 미터로 표현된 수로 변환하기 위해 값에 1_000.00을 곱합니다. 유사하게 1미터에는 3.28084피트가 있으므로 ft 계산 속성은 기본 Double 값을 3.28084로 나누어 피트에서 미터로 변환합니다.

이 속성들은 읽기 전용 계산 속성이므로 간결성을 위해 get 키워드 없이 표현됩니다. 반환 값의 타입은 Double이며, Double이 허용되는 수학적 계산 내에서 사용될 수 있습니다:

let aMarathon = 42.km + 195.m
print("A marathon is \(aMarathon) meters long")
// "A marathon is 42195.0 meters long" 출력
swift

이렇게 계산 속성을 사용하면 코드의 가독성과 표현력을 크게 높일 수 있습니다. 기존 타입에 의미 있는 속성을 추가함으로써 도메인에 특화된 용어를 사용할 수 있게 되죠. 예를 들어, 거리를 다루는 코드에서 Double 값을 직접 사용하는 대신 km, m, ft 등의 계산 속성을 사용하면 코드의 의도가 훨씬 더 명확해집니다.

또한 이런 방식은 타입 안전성도 향상시킵니다. 거리 값을 잘못된 단위로 혼동하는 실수를 컴파일 타임에 방지할 수 있기 때문이죠.