본문 바로가기

TIL

[TIL] 숫자 타입 소수점 나타내기(feat. 디테일 설명)

오늘 포스팅은 숫자의 소수점을 일정 자리까지 나타내는 법에 대해 작성하고자 합니다.

 

생각보다 굉장히 간단합니다. 바로 아래 코드처럼 작성해주시면 되는데요.

아래 코드는 정확히 묘사하면 소수 다섯재짜리에서 반올리하여 나타내준 것입니다.

// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928

 

이렇게 끝맺음을 하면 아쉽기 때문에 조금 더 깊이 있게 들어가보겠습니다.

 

조금 더 깊이 들어가보자

LocalizedStringKey

 

SwiftUI의 Text 뷰에 대한 정의를 들어가보면 위와 같이 정의되어 있는 것을 확인해보실 수 있습니다.

여기서 눈에 띄는 타입이 바로 LocalizedStringKey인데요.

 

애플 공식문서에 따르면 LocalizedStringKey는 기본적으로 string 리터럴(literal)이 주어졌을 때 암시적(implicitly)으로 현지화된 string을 조회한다고 합니다.

 

하지만 위의 Text 예시를 잠시 다시 빌려와 살펴보자면, "\()"라는 문자열 보간법 구문(String Interpolation Syntax)가 사용되었기 때문에 LocalizedStringKey 타입을 받는 initializer가 실행되지는 않았을 것 같습니다.

// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928

 

그렇다면 과연 어떤 initializer가 실행되었을까요?

Text 뷰의 다른 initializer 정의에 대해 살펴보도록 하겠습니다.

StringInterpolation

 

Text 뷰의 다른 intializer까지 살펴보니 StringInterpolation을 파라미터로 받는 initializer도 있었습니다. 

 

자 그럼 여기서 StringInterpolation가 무엇이냐?!?!

정말 간단히 말해서 "\()" 문법을 의미합니다. 바로 이 문법을 String Interpolation 즉, 문자열 보간법이라고 합니다.

이 문자열 보간법을 이용하면 다른 string literal과 함께 사용이 가능해 개발시 더욱 가독성을 높일 수 있다는 장점이 있죠.

StringInterpolation과 LocalizedStringKey.init(stringInterpolation:)와 상관관계

 

자 그러면 우리가 살펴보았던 위의 LocalizedStringKey의 initializer와 무슨 상관관계이냐

 

애플 공식문서를 살펴보면 LocalizedStringKey에서 "\()" 문법이 사용되면 LocalizedStringKey.init(stringInterpolation:)가 호출되고, 그러면서 Swift는 표현식의 매개변수 유형을 LocalizedStringKey.StringInterpolation의 AppendInterpolation 메소드 중 하나와 일치시킨다고 합니다.

 

자 또 다른 키워드가 등장 했습니다. appendInterpolation 메소드. 과연 이것은 또 무엇일까요?

appendInterpolation 메소드

appendInterpolation 메소드는 StringInterpolation의 내장 메소드로 위에서 설명했던 것처럼 "\()" 문법 내부에 사용된 문법에 따라 일치할 때, 호출되는 메소드입니다.

 

// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928

 

위에서 살펴보았던 처음 예제를 살펴보자면 위의 경우에는 appendInterpolation 메소드들 중 appendInterpolation(_:specifier:)가 호출되었을 것입니다.

 

추가적으로 appendInterpolation 메소드들 컴파일러가 알아서 호출해준다고 하니 왠만하면 직접 호출해서 사용하지 말아달라고 애플 공식 문서에서 주의를 주고 있습니다.

정리해보기

자 모든 키워드는 해제되었습니다. 이제 총 정리를 해보겠습니다.

// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928

 

위와 같이 구문이 작성되면 

 

 

위와 같이 LocalizedStringKey의 intializer중 LocalizedStringKey.init(stringInterpolation:)가 호출되고,

 

 

이 때 컴파일러는 위와 같이 작성된 것처럼 StringInterpolation의 appendInterpolation(_:specifier:)가 호출되게 됩니다.

 

마무리

이상 마무리하겠습니다.

여기까지 읽어주시기 쉽지 않으셨을텐데 혹시 읽어주셨다면 정말로 대단하십니다. 왜냐하면 이 글 작성하기가 개인적으로 쉽지 않았거든요 ㅎ

아무튼 비루한 글이지만 끝까지 읽어주셔서 정말 감사합니다!

 

참고 사이트

https://developer.apple.com/documentation/swiftui/localizedstringkey (애플 공식문서 - LocalizedStringKey)

https://developer.apple.com/documentation/swiftui/localizedstringkey/stringinterpolation?changes=latest_minor (애플 공식문서 - LocalizedStringKey.StringInterpolation)

https://developer.apple.com/documentation/swiftui/localizedstringkey/init(stringinterpolation:)?changes=latest_minor (애플 공식문서 - LocalizedStringKey.init(StringInterpolation:))

https://developer.apple.com/documentation/swiftui/localizedstringkey/stringinterpolation/appendinterpolation(_:specifier:) (애플 공식문서 - LocalizedStringKey.StringInterpolation.appendInterpolation(_:specifier:))