본문 바로가기
Dart (Flutter)

[Dart] Data Types

by llHoYall 2023. 2. 1.

이번에는 Dart의 자료형에 대해 살펴보겠습니다.

역시나 다른 언어의 경험이 있으시다면 보기만 하셔도 쉽게 아실 수 있을거에요.

 

Dart는 type이 중요한 강타입 언어로 python등의 언어와 달리 type을 섞어서 사용할 수 없습니다.

다시 말해, 정수형으로 선언된 변수에 문자열을 할당할 수 없고, 정수형 리스트에 문자열을 요소로 넣을 수 없습니다.

Built-in Types

Dart의 모든 것은 object 입니다. 각 자료형 역시 class로 되어 있어 생성자를 사용하거나 literal 형태로 선언을 할 수 있어요.

먼저, 내장 자료형들 부터 살펴보겠습니다.

Numbers

- int

정수 타입으로 platform에 따라 다를 수 있지만, 최대 64bits의 정수를 표현할 수 있습니다.

- double

부동 소수점 타입으로 64bits의 double-precision를 표현할 수 있으며, IEEE-754 표준을 따릅니다.

- num

intdouble을 모두 포함하는 상위 타입입니다.

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

truefalse 값을 가지며, 둘 다 compile-time 상수입니다.

Dart는 type safe하므로, ifassert 문 등에서 명시적으로 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 객체를 정의할 때, iffor를 사용할 수 있습니다.

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

댓글