[Swift] 소수와 정수를 더할 수 없나요?!

Ujeon 🍵
4 min readJul 11, 2021

--

Swift에는 문자열, 불리언, 배열 등으로 데이터를 저장합니다. 하지만 그 중에서도 특히 숫자를 다룰 때에는 데이터를 저장하는 방식이 세분화 되어 있는데요. Int , Float , Double 이 대표적이죠.

물론 세가지 방식 이외에도 여러 방식이 존재하지만, 이 세가지 방식이 가장 보편적으로 사용됩니다.

숫자를 저장할 때 세가지 방식으로 구분하는 이유는 저장 방식이 다르기 때문인데요, 예를 들어 DoubleInt 는 숫자를 저장할 때 동일한 메모리 공간을 차지하지만 Int 는 전체 숫자를 저장하는 반면 Double 은 소수점 이하 자릿수 뒤에 값을 저장할 수 있습니다.

Double 타입의 숫자와 Int 타입의 숫자를 서로 덧셈하는 것이 좋은 방법이 아니라는 것을 알고 계실거에요. 왜냐하면 Double 타입은 Int 타입이 저장할 수 없는 것들을 저장하기 때문에 둘을 합친다면 잃어버리는 데이터가 발생하기 때문이죠.

그렇다면, “ IntDouble 을 더해서 새로운 Double 을 반환하면 되지 않을까?” 라는 생각이 듭니다.

앞서 말한 것처럼 DoubleInt 가 동일한 메모리 공간을 차지하는 것은 맞지만 Double 은 데이터를 저장하는 방식이 살짝 미묘합니다. Double 은 작은 숫자에 대해서는 정확도가 높지만 큰 숫자를 다루기 시작하면 정확도가 떨어지거든요. 사실 Double 이 다룰 수 없는 숫자가 있는데, 어떻게든 다루기 위해서 조금 다른 값으로 데이터를 저장합니다.

다행히 Swift 가 경고를 해주는데, 일단 한 번 보시죠! :

Double 타입 변수에 90000000000000001 를 저장하려고 하는데 다른 값으로 저장된다는 경고가 뜹니다.

Swift는 다음과 같은 경고를 표시합니다 : ‘90000000000000001’ is not exactly representable as ‘Double’; it becomes ‘90000000000000000’.

Int 타입은 소수를 저장하는 능력을 내어 준 대신 정확한 값을 저장하는 능력을 얻었습니다. 그말인 즉, 위 숫자를 Int 에는 충분히 저장할 수 있다는 것이죠.

이러한 차이 때문에 Double 타입을 Int 타입과 덧셈하는 것은 소숫점 아래의 숫자를 잃어버리게 되는 것이고, IntDouble 과 덧셈하는 것은 정확도를 잃게 된다는 것이죠.

물론 “그렇다면 IntDouble 을 덧셈하는 것이 안전하다는 것이 증명되면 충분히 덧셈이 가능한게 아닐까?!” 와 같은 추가적인 궁금증이 생길 수 있죠. 왜냐하면 90000000000000001와 같은 큰 숫자를 다룰 경우는 드문 경우니깐요.

물론 그렇긴 하지만, Swift는 여러분의 코드를 빌드할 때 어떤 숫자가 될지 확신할 수 없기 때문에 결국 다시 안정성 문제로 귀결됩니다. 물론, 대부분의 경우는 안전한 숫자를 다루는 상황이 많겠지만, Swift는 위험을 감수하도록 설계되지 않았다는 점이 중요하죠.

결국 Swift는 다양한 숫자를 상호간에 자동으로 타입을 바꿔주는 것을 거부하기 때문에 IntDoubleFloatInt 등등을 더하거나 곱셈할 수 없습니다.

참고 자료

100 Days Of Swift : Why can’t Swift add a Double to an Int?

--

--

Ujeon 🍵

Hi there, this is Ujeon. I want to be a developer who passes on value through development :)