# Kotlin Money - 돈 계산용 Kotlin 라이브러리

> Clean Markdown view of GeekNews topic #17149. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17149](https://news.hada.io/topic?id=17149)
- GeekNews Markdown: [https://news.hada.io/topic/17149.md](https://news.hada.io/topic/17149.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-10-09T09:45:28+09:00
- Updated: 2024-10-09T09:45:28+09:00
- Original source: [blog.eriksen.com.br](https://blog.eriksen.com.br/en/introducing-kotlin-money)
- Points: 8
- Comments: 1

## Summary

Kotlin Money 라이브러리는 금액 계산과 할당을 쉽게 처리할 수 있도록 설계되어, 반올림 문제를 방지하며 정확한 금액 처리를 지원합니다. 이 라이브러리는 306개의 통화와 2283개의 암호화폐를 지원하며, 다양한 사용 사례에 맞춰 금액의 수학적 연산과 퍼센트 계산을 제공합니다. 가장 큰 장점은 "할당" 기능으로 금액을 여러 부분으로 나누면서 원래 금액과 동일하게 보장합니다. ( 예를 들어, 100달러를 3개월로 할부 결제할 때, 반올림 문제가 없도록 잘 할당)

## Topic Body

- 화폐 금액 조작은 일반적인 컴퓨팅 작업이지만, 주류 프로그래밍 언어에는 금액을 표현하는 기본 데이터 타입이 없음  
- 이는 할부 결제, 외환 거래, 수수료 처리 및 세금 징수와 같은 작업에서 반올림 문제를 일으킬 수 있음  
- **Money** 는 금액 계산과 할당을 쉽게 할 수 있도록 돕는 Kotlin 라이브러리   
  - 금액의 수학적 연산, 퍼센트 계산, 할당을 지원하여 다양한 사용 사례를 모델링할 수 있음  
  - 암호화폐도 기본적으로 지원함  
- **할당 기능**  
  - 라이브러리의 가장 큰 장점 중 하나는 할당 기능임  
  - 금액을 여러 부분으로 나누면서 원래 금액과 동일하게 보장함  
  - 예를 들어, 고객이 USD 100.00의 구매를 세 번의 할부로 결제할 때, 반올림 문제로 인한 손실을 방지할 수 있음  
- **할당 방법**  
  - `allocate()` 메서드를 사용하여 원래 금액과 차이가 없도록 결과를 보장함.  
  - 비율에 따라 할당하려면 `Percentage` 값을 리스트로 전달함.  
  - 기본적으로 라이브러리는 차이를 자동으로 할당하지만, 원하는 할당 전략으로 조정 가능함.  
- **마무리**  
  - 이 글은 라이브러리의 기능을 간단히 소개한 것임.  
  - API를 간결하게 유지하고 안드로이드 개발 지원 및 지속성과 직렬화 기능을 점진적으로 확장할 계획임.  
  - 현재 버전이 Kotlin 프로젝트에서 금액을 조작하는 사람들에게 유용하기를 바람.  
  
### GN⁺의 정리  
- 금액을 다루는 것은 프로그래밍에서 흔한 작업이지만, 반올림 문제로 인해 복잡해질 수 있음.  
- Money 라이브러리는 이러한 문제를 해결하기 위해 설계된 Kotlin 라이브러리로, 금액의 정확한 할당과 계산을 지원함.  
- 이 라이브러리는 306개의 통화와 2283개의 암호화폐를 지원하며, Kotlin 프로젝트에서 금액을 다루는 데 유용함.  
- 비슷한 기능을 가진 다른 프로젝트로는 Java의 Joda-Money 라이브러리 등이 있음.

## Comments



### Comment 29846

- Author: neo
- Created: 2024-10-09T09:45:28+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41776878) 
- infix 함수 사용이 약간 이상하게 느껴짐
  - Kotlin에서 API를 설계할 때, 일반적인 확장 함수나 확장 속성을 사용할 것 같음
  - "increaseBy"와 "decreaseBy" 대신 `plus`와 `minus`를 오버로딩하지 않은 이유가 궁금함

- 라이브러리 축하와 공유에 감사함
  - F#이나 C#의 단위 시스템이 금전 계산과 유사할 수 있음
  - Rust에서 정확성에 중점을 둔 백테스터를 개발 중이며, 자산이 통화로 평가됨
  - 시뮬레이션 시 거래소가 항상 작동한다고 가정할 수 있는지 궁금함
  - 환율에 대한 공공 데이터가 있는지 궁금함
  - 거래 시 어떤 환율을 선택해야 하는지 궁금함
  - 반올림에 대한 최선의 방법이 있는지 궁금함
  - 세금을 즉시 공제하는 것이 좋은지 궁금함
  - 인플레이션을 모델링할지 고민 중이며, 현재는 무시하고 마지막에 조정할 계획임

- Rebol의 금전 타입의 사용성을 떠올리게 함
  - Rebol의 타입 시스템이 매우 표현력이 있었음
  - 이런 경험을 제공하는 라이브러리가 더 많아지길 바람

- 금전 처리 시 발생하는 엣지 케이스에 대한 질문
  - 서로 다른 통화의 값을 더할 때 런타임 예외가 발생할 것으로 기대함
  - $2.00을 3으로 나눌 때 반올림 규칙을 지정할 수 있는지 궁금함
  - 사용자 입력을 파싱할 때 추가 자릿수에 대한 처리가 궁금함
  - 자릿수 규칙을 벗어나는 경우에 대한 라이브러리의 처리 방법이 궁금함

- 사용자 정의 통화 지원을 좋아함
  - 통화 기호가 지역에 따라 다르므로 주의가 필요함
  - CLDR 데이터셋이 통화 표시를 다루는 대부분의 구현에 사용됨

- 스프레드시트 언어가 금전을 잘 지원하지 않는 것이 이상함
  - 스프레드시트를 사용한 자동화가 좋으며, 타입을 진지하게 다루는 언어에서 놀라운 결과를 얻을 수 있음

- C#의 decimal 타입이 금전 계산에 적합함

- 댓글에서 많은 것을 배웠으며, 라이브러리의 다음 반복에 도움이 될 것임

- 라이브러리보다 모든 엣지 케이스를 다루는 철저한 테스트 스위트를 원함
  - 엄격한 타입 사용에 대한 생각이 있음
  - 많은 저수준 프로그래밍 언어가 여전히 uint64, size_t 등을 사용하는 것이 이상하게 느껴짐

- 요구 사항을 모두 충족하는 것 같으며, 금전 처리의 주요 어려움에 대한 좋은 논의가 있음
