포스트

[Dart] 데이터 타입

Dart 언어가 어떠한 내장 타입들을 지원하는지 알아보자!

Dart는 기본적으로 정적 타입 언어이지만, 타입 추론 또한 지원한다.

1. 데이터 타입

1.1 Numbers

Dart의 숫자는 두 가지 유형으로 존재한다.

int

64비트 이하로 표현된다.

Native-Platform일 경우 $-2^{63}$ ~ $2^{63} - 1$까지 표현할 수 있으며

웹에서는 $-2^{53}$ ~ $2^{53} - 1$까지 표현할 수 있다.

1
2
var x = 1;
var hex = 0xDEADBEEF;

double

64비트 부동 소수점 표현을 사용한다.

1
2
var x = 1;
var hex = 0xDEADBEEF;

num

이때 intdouble 모두는 num의 서브 타입이다.

이는 num이 두 클래스의 상위 클래스이기 때문이다.

1
2
num x = 1;
x += 0.5;

1.2 String

작은 따옴표, 큰 따옴표를 사용하여 문자열을 사용한다.

1
2
3
4
var str1 = 'I hate cucumber';
var str2 = "I hate eggplant";
var str3 = 'I\'m a big fan of icecream';
var str4 = "I'm a big fan of icecream";

${ 표현식 } 을 통해 표현식 안에 값을 나타낼 수 있다.

단 표현식이 식별자일 경우 { }를 생략 가능하다.

TIP

assert()는 조건식이 거짓일 경우 오류 메세지를 출력한다.

== 연산자는 두 객체가 동일한지 조사한다.

1
2
3
4
var s = 'World';

assert('Hello, $s' == 'Hello, World');
assert('Hello, ${s.toLowerCase()}' == 'Hello, world');

+ 연산자를 통해 문자열을 합칠 수 있다.

1
2
3
var s = 'Hello';

print(s + 'World');

'''"""를 통해 multiline 문자열1을 만들 수 있다.

1.3 Boolean

당연히 Dart에서도 Boolean 타입을 지원한다.

1
2
var isTrue1 = 5 > 3;
bool isTrue2 = true;

2. var 와 dynamic 타입

2.1 var

var는 변수를 초기화하는 시점에 타입을 결정하며, 다른 타입의 값을 할당할 수 없다.

1
2
var x = 1;
x = 'ERROR!';

2.2 dynamic

dynamic은 런타임에 타입을 결정한다.

즉, 모든 타입의 데이터를 대입할 수 있다.

1
2
dynamic x = 1;
x = 'GOOD!';
 vardynamic
변수 선언 시 초기화OO / X
다른 타입의 값 할당XO
타입 결정변수 초기화 시점런타임

이 외에도 vardynamic은 Dart 언어의 Null 안전성 특성 상 또 다른 차이점이 존재한다.
자세한 내용은 이 포스트를 참고하자.


3. 상수 변수

3.1 final

final은 런타임 상수 변수이다.

따라서 변수를 선언할 때와 초기값을 대입할 때가 일치할 필요는 없다.

타입 어노테이션은 생략해도 좋다.

1
2
3
4
5
final name = 'Joe';
final bar = 1000000;
final double atm = 1.01325 * bar;
final mol;
mol = 6.02e23;

3.2 const

const는 컴파일 타임 상수 변수이다.

따라서 변수를 선언함과 동시에 초기값을 지정해 주어야 한다.

마찬가지로 타입 어노테이션은 생략 가능하다.

한편 클래스 내부에서는 static 변수로만 선언될 수 있다.

1
2
3
4
5
const name = 'Joe';
const bar = 1000000;
const double atm = 1.01325 * bar;
// const mol;
// mol = 6.02e23;

4. 컬렉션 타입

4.1 List

Dart에서 배열 (Array)와 리스트는 구분하지 않는다.

1
2
3
4
5
6
7
List lst1 = ['a', 'B', 'C', 'D'];
lst1[0] = 'A';       // ['A', 'B', 'C', 'D']
lst1.add('E');       // ['A', 'B', 'C', 'D', 'E']

List<int> lst2 = [1, 2, 3, 4, 5];
// lst2[0] = 'A';    // ERROR
lst2.removeAt(0);    // [2, 3, 4, 5]

4.2 Set

Python의 그것과 유사하다.

중복 데이터를 허용하지 않으며, index 값을 통해 자료에 접근한다.

1
2
3
4
5
6
7
8
9
10
11
Set<int> set1 = {10, 20, 30, 40};
set1.add(50);

Set<int> set2 = Set();
set2.add(0);

var set3 = <int>{};
set3.add(0);

// Set이 아닌 Map을 생성한다.
var notSet = {};

4.3 Map

C++의 Map 혹은 Python의 Dictionary와 유사하다.

다만 C++처럼 자료를 정렬해주지는 않는다.

Key와 Value의 형태로 자료를 저장하며 Key를 통해 Value에 접근한다.

1
2
3
4
5
6
7
8
9
10
11
12
Map<String, int> map1 = {'apple': 5, 'banana': 2};
map1['cherry'] = 4;

var map2 = {
  // Key:  Value:
  'first': 'apple',
  'second': 'banana',
  'third': 'cherry'
};

var map3 = Map<String, int>();
map3['apple'] = 0;

TIP

독자가 Java에 익숙하다면 Map() 대신 new Map()을 기대했을 것이다.
Dart에서 new 사용은 선택 사항이다.

Reference

Dart Document

  1. Multi-line 문자열에는 개행문자 ( \r \n \r\n) 이 포함된다. ↩︎

이 게시물은 저작권자의 CC BY 4.0 라이센스를 따릅니다.