[Flutter/Dart] 다트에서 숫자형(int, double, num) 이해하기

    다트는 플러터(Flutter)에서 새롭게 만든 언어이기 때문에 새로운 타입 형식을 만들고자 하였고, 다양한 호환 기능과 더불어 과감하게 불필요한 것들을 뺐습니다. 여기서는 숫자형에 대해서 좀 이해해 보고자 하는데요. 다트에서는 과연 다른 언어와 숫자형이 무엇이 다른지 확인해보도록 하겠습니다.

     

    [Dart] 다트에서 숫자형(int, double, num) 이해하기


    자바와 비교

    우선 다트가 가장 많은 영향을 받았다 생각하는 자바(Java) 언어에 대해서 한번 알아보도록 하겠습니다. 우선 자바 역시 다트언어처럼 정수형 타입과 실수형 타입으로 나뉘어져 있는데요.

     

    정수형 타입 메모리 크기
    byte 1 byte
    short 2 byte
    int 4 byte
    long 8 byte

     

    위와 같이 다양한 정수형 타입이 존재하며 또 음의 값을 표현하지 않는 unsined와 같은 형식도 지원합니다. 그리고 실수형은 아래처럼 2가지의 형식이 존재합니다.

     

    실수형 타입 메모리 크기
    float 4 byte
    double 8 byte

    이처럼 자바의 경우 기존의 언어들은 이와같은 다양한 형식의 숫자형 타입을 지원합니다만, 다트는 이전 포스팅에서 설명하듯 정수형은 int와 실수형은 double로 통일을 하였습니다.

     

    다트의 숫자형 형변환 문제

    자바가 위와 같이 복잡하다고 하지만, 장점이 한가지 있습니다. 바로 형변환이 비교적 자유롭다라는 것입니다. 물론 Long에서 Int와 같이 메모리가 더 적은 형식으로 형변환하기 위해서는 값도 체크해야 하고 다양한 방식이 필요하지만, 아무튼 형변환이 가능 하다는 것은 팩트입니다.

     

    그러나 다트의 경우 아래와 같이 정수형에서 실수형으로 변환하려고 하면 에러가 발생합니다. 일반적으로 자바에서는 나지 않는 에러가 발생한다는 것입니다.

     

    void main() {
      int a = 10;
      double b = (double)a;
      
      print(a);
      print(b);
    }

    자바에서 int의 경우 double로 형변환하는 것이 문제가 없지만, 플러터는 아래와 같이 에러를 뿌립니다.

     

    Error compiling to JavaScript:
    Info: Compiling with sound null safety
    lib/main.dart:3:21:
    Error: Expected ';' after this.
      double b = (double)a;
                        ^
    lib/main.dart:3:15:
    Error: A value of type 'Type' can't be assigned to a variable of type 'double'.
     - 'Type' is from 'dart:core'.
      double b = (double)a;
                  ^
    Error: Compilation failed.

     

    (double)과 같은 형변환이 없어서 그런가? 싶어서 (double)을 사용하지 않다 하더라도 아래와 같이 에러가 발생합니다.

    Error compiling to JavaScript:
    Info: Compiling with sound null safety
    lib/main.dart:3:14:
    Error: A value of type 'int' can't be assigned to a variable of type 'double'.
      double b = a;
                 ^
    Error: Compilation failed.

     

    모든 언어를 호환하는 언어가 다트라고 생각하는데 이렇게 타입간에 형변환이 안된다면 상당히 사용하기 귀찮아집니다. 그래서 이런 경우를 위해 다트는 새로운 숫자형 타입을 지원합니다.

     

     

    다트의 Num 타입

    다트의 숫자형은 궁극적으로 아래와 같이 되어 있습니다. 

     

    다트의 숫자형

     

    다트는 수많은 플랫폼을 호환하는 것이 목표입니다. 그러다보니, 모든 것을 완벽하게 대응하기 위해서 숫자형의 대표격인 타입이라는 것이 존재합니다. 마치 interface와 같은 것이라 생각하면 되는데요. 그것이 바로 num 타입입니다.

     

    결국 num에서 파생된 int와 double은 서로간에 형변환이 불가능하지만, num을 통해서는 가능하다는 의미인데요. 이렇게 형변환을 해야 하는 변수의 경우 첨부터 num으로 타입을 지정하면 됩니다.

     

    void main() {
      num a = 10;
      num b = 3.14;
      
      print(a);
      print(b);
      
      b = a;
      print(b);
    }

     

    위와 같이 a와 b 변수를 num으로 선언할 경우 아무런 문제가 발생하지 않습니다.

     

    숫자형 변환에 문제가 없는 모습

     

    즉, 다양한 숫자값을 받아야 되는 경우 int와 double보단 num을 쓰는 것을 권유하니 num을 포함하여 상황에 따라서 숫자 타입을 선언하는 것이 좋겠습니다.

     

    연관 포스팅

    [Dart] 다트의 기본 변수(variable)

     

    [Dart] 다트의 기본 변수(variable)

    이전 포스팅에서는 플러터(Flutter)에서 사용하는 언어인 다트의 변수에 대한 소개를 하였고, 몇가지 변수에 대해서 소개를 하였습니다. 이번 포스팅은 다트(Dart)에서 제공하는 변수들에 대해서

    needneo.tistory.com

    [Dart] 다트 변수 이해 및 변수 설정

     

    [Dart] 다트 변수 이해 및 변수 설정

    다트(Dart)는 다른 언어와 다른 독자적인 변수 설정 방식을 가지고 있습니다. 이는 다트가 플러터(Flutter)를 위해서 만들어졌기 때문인데요. 기본적으로 자바와 같은 전통적인 집단과 최신 트렌드

    needneo.tistory.com

     

    참고자료

    https://dart.dev/guides/language/numbers

     

    Numbers in Dart

    Learn how Dart numbers are slightly different on the web, when that might matter, and how you might adjust your code.

    dart.dev

     

    반응형

    댓글

    Designed by JB FACTORY