[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
이때 int
와 double
모두는 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!';
var | dynamic | |
---|---|---|
변수 선언 시 초기화 | O | O / X |
다른 타입의 값 할당 | X | O |
타입 결정 | 변수 초기화 시점 | 런타임 |
이 외에도
var
과dynamic
은 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
Multi-line 문자열에는 개행문자 (
\r
\n
\r\n
) 이 포함된다. ↩︎