이번에는 Dart의 자료형에 대해 살펴보겠습니다.
역시나 다른 언어의 경험이 있으시다면 보기만 하셔도 쉽게 아실 수 있을거에요.
Dart는 type이 중요한 강타입 언어로 python등의 언어와 달리 type을 섞어서 사용할 수 없습니다.
다시 말해, 정수형으로 선언된 변수에 문자열을 할당할 수 없고, 정수형 리스트에 문자열을 요소로 넣을 수 없습니다.
Built-in Types
Dart의 모든 것은 object 입니다. 각 자료형 역시 class로 되어 있어 생성자를 사용하거나 literal 형태로 선언을 할 수 있어요.
먼저, 내장 자료형들 부터 살펴보겠습니다.
Numbers
- int
정수 타입으로 platform에 따라 다를 수 있지만, 최대 64bits의 정수를 표현할 수 있습니다.
- double
부동 소수점 타입으로 64bits의 double-precision를 표현할 수 있으며, IEEE-754 표준을 따릅니다.
- num
int와 double을 모두 포함하는 상위 타입입니다.
int n = 7;
double f = 3.14;
num x = 5;
Strings
- String
문자열 타입으로 UTF-16 code units의 sequence를 갖습니다.
Single quote 또는 double quote으로 정의할 수 있습니다.
3개의 single quote 혹은 double quote으로 multi-line 문자열을 정의할 수 있습니다.
$ 기호를 사용하여 string interpolation을 만들 수 있고, {}를 함께 사용하면 expression을 evaluate할 수 있습니다.
r을 사용하여 raw 문자열을 정의할 수 있습니다.
var name = 'HoYa';
var age = 18;
print("Hello, $name!\nYou will be ${age + 1} soon.");
var mStr = '''Multi-line
string.
'''
var path = r'C:\Windows\System32';
Booleans
- bool
true와 false 값을 가지며, 둘 다 compile-time 상수입니다.
Dart는 type safe하므로, if나 assert 문 등에서 명시적으로 boolean checking을 해야 합니다.
bool b1 = true;
bool b2 = false;
var test = 0;
assert(test >= 0);
// if (test) print(hitPoints); // Error!
Lists
- List
List literal []를 사용하여 정의할 수 있으며, 각 요소는 중복 가능하고 순서가 있는 자료형입니다.
var nums1 = [1, 2, 3];
List<int> nums2 = [1, 2, 3];
const를 사용하여 compile-time 상수를 만들 수 있습니다.
var constantList = const [1, 2, 3];
Sets
- Set
{}를 사용한 set literal로 정의할 수 있으며, 각 요소는 중복될 수 없으며 순서를 갖지 않습니다.
var nums1 = {1, 2, 3};
Set<int> nums2 = {1, 2, 3};
Empty set을 정의하려면 반드시 type을 명시해야합니다. {}만 사용한다면 empty map으로 인식이 됩니다.
var emptySet = <String>{};
Maps
- Map
Map literal {}을 사용하여 정의할 수 있으며, key:value pair를 갖는 자료형입니다.
Key와 value는 어떤 type의 object이든 가능합니다.
Key는 유일해야하며, value는 중복될 수 있습니다.
var persons = { 'name': 'HoYa', 'age': 18 };
Map<List<int>, bool> test = {
[1, 2]: true,
[3, 4]: false
};
Map constructor를 사용하여 정의할 경우 다음과 같습니다.
var persons = Map<String, int>();
persons['HoYa'] = 18;
const를 사용하여 compile-time 상수를 만들 수 있습니다.
final persons = const {
'HoYa': 18
};
Rune and Grapheme Clusters
runes는 string의 Unicode code 값을 보여줍니다.
var test1 = '♥'; // \u2665
print(test1.runes); // (9829)
var test2 = '\u{1f606}'; // 😆
Symbol
- Symbol
Identifier 앞에 #을 붙여 Symbol을 얻을 수 있습니다.
Symbol은 compile-time 상수입니다.
다음의 방법으로 Symbol을 만들 수 있습니다.
Symbol s1 = Symbol('symbol1');
Symbol s2 = #symbol2;
Collection if and for
List, Set, Map과 같은 collection 객체를 정의할 때, if와 for를 사용할 수 있습니다.
Collection if
조건에 따라 요소를 정의할 수 있습니다.
var nums = [1, 2, if (true) 3];
Collection for
다른 collection의 요소를 순회하여 정의할 수 있습니다.
var list1 = ['three', 'four'];
var list2 = ['one', 'two', for (var el in list1) "$el"];
Dynamic
dynamic keyword로 변수를 선언하면, 여러 type의 값을 담을 수 있다.
다시 말하면, 해당 변수에 대해 type checking을 하지 않습니다.
보통 Object 혹은 Object?를 대신하여 사용됩니다.
var n = 5;
// n = 3.14; Error!
dynamic d = 3.7;
d = 4;
Null Safety
Dart의 변수는 기본적으로 non-nullable입니다.
nullable 변수를 정의하고 싶으면, type에 ? 를 붙여 nullable을 명시해야 합니다.
nullable일 수 있는 변수를 사용 시, 변수에 ? 를 붙여 null이 아닐 때만 동작하도록 합니다.
nullable 변수의 사용 시, null value가 아님이 확실할 경우 변수에 ! 를 붙여 null이 아님을 명시할 수 있습니다.
String? name = 'HoYa';
print(name!.length);
name = null;
print(name?.length);
Aliasing
typedef keyword를 사용하여 data type에 별칭을 붙일 수 있습니다.
typedef NumbersList = List<int>;
void main() {
NumbersList nums = [1, 2, 3];
print(nums);
}
Convert Data Types
Object의 toString() method를 사용하여 String type으로 변환할 수 있고, parse() method를 사용하여 num type으로 변환할 수 있습니다.
// int -> String
String str = 1.toString();
// double -> String
String str = 3.14159.toStringAsFixed(2); // '3.14'
// String -> int
var num = int.parse('1');
// String -> double
var num = double.parse('1.2');
Get Types
디버깅 등을 위해 object의 runtimeType property를 사용하여 type 정보를 얻을 수 있습니다.
int test = 5;
print(test.runtimeType); // int
Object의 type을 판별하는 코드가 필요할 경우 is의 사용이 권장됩니다.
int test = 5;
if (test is int) {
print('test is an int type');
}
Wrap Up
지금까지 Dart의 자료형에 대해 기본적으로 알고 있으면 좋은 내용들을 살펴보았습니다.
어려운 내용은 전혀 없으므로 다른 언어의 사용 경험이 있으시다면 바로 이해하실 수 있을 거에요.
'Dart (Flutter)' 카테고리의 다른 글
[Dart] Control Flow Statements (0) | 2023.02.03 |
---|---|
[Dart] Operators (0) | 2023.02.02 |
[Dart] Variables (0) | 2023.01.30 |
[Flutter] Desktop Application using Flutter (0) | 2023.01.25 |
[Flutter] Animation (0) | 2022.04.03 |
댓글