TIL

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

picel 2024. 6. 7. 15:15

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

 

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

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

// 소수 넷제자리까지 나타내기
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:))