본문 바로가기

개발관련

[Dart] Dart 언어의 Built-in types 관련 정리

최근 Flutter로 작업을 하다가 Type 관련하여 에러가 났는데, 이해가 부족한 부분이 있다고 느끼게 되어 작업을 완료한 후, 나름 한가해진 지금(?) Dart의 Type 관련하여 공부를 해보고자 한다.

 

1. Built-in types

https://dart.dev/language/built-in-types 을 보고 정리한 내용이다. 읽으면서 흥미로운 부분만 언급하였다. 자세한 내용은 문서를 직접 보기를 바란다.

 

- Numbers (int, double)

- Strings (String)

- Booleans (bool)

- Records ((value1, value2))

- Lists (List, also known as arrays)

- Sets (Set)

- Maps (Map)

- Runes (Runes; often replaced by characters API)

- Symbols (Symbol)

- null (Null)

 

다트에서는 위의 타입들에 대해 특별한 기능들을 제공해준다. Literal을 사용하여 객체를 생성하는 것이 그 중 하나다. 'this is a string' 과 같은 문자열 리터럴, true와 같은 불리언 리터럴 등으로 객체를 생성하는 것이 예시이다.

 

Dart의 모든 변수들은 객체(클래스의 인스턴스)를 가리키기 때문에, 일반적으로 생성자를 이용하여 변수를 초기화하게 된다. 몇몇 빌트인 타입들은 자신의 생성자를 가진다. 예를 들면 Map() 생성자가 있다.

 

이외의 다른 타입들도 Dart에서 특별한 역할을 수행한다.

 

- Object: Null을 제외한 모든 다트 클래스들의 슈퍼클래스

- Enum: 모든 enum들의 슈퍼클래스

- Future and Stream: 비동기처리 지원에 사용됨

- Iterable: for-in loops 와 동기 제네레이터 함수에서 사용됨

- Never: 절대 evaluate되지 않는 expression의 타입을 나타낼 때 사용됨. 주로 예외를 던지기만 하는 함수에 사용됨.

- dynamic: static checking을 하지 않고 싶을 때 사용함. 일반적인 상황에선 Object나 Object? 를 사용하는 것이 추천됨.

- void: 값이 절대 쓰이지 않음을 나타냄. return type을 기술할 때 자주 사용됨.

요런 문장도 에러가 나지 않는다. 뒤에서 a라는 변수를 사용하지만 않는다면...

## Numbers

num 은 int, double의 superclass이다. num에는 abs(), ceil(), floor() 등의 함수가 있다. 숫자 리터럴 들은 컴파일 타임 상수이다. 컴파일 타임 숫자형 상수로만 이루어진 식(expression)도 컴파일 타임 상수이다. (예를 들자면 1+2 라는 식도 컴파일 타임 상수다)

 

 

## Strings

 

Dart의 string은 UTF-16 code unit들의 시퀀스이다. (흠.. 왜 UTF-8을 안 쓴거지? 호기심이 생기는데 시간 나면 나중에 한번 찾아봐야겠다) double quote나 single quote 둘 중 아무거나 골라서 사용할 수 있다. ${expression}을 통해 문자열 안에 식을 넣을 수도 있다. 이 경우, 다트가 해당 식의 toString() 메소드를 호출하게 된다. multiline string을 써야할 때는 triple quote with either single or double quotation marks을 유용하게 사용 가능하다.

triple quote를 쓰는 경우 첫번째 라인을 빈칸으로 둬도 개행문자가 들어가지 않는 듯 하다. s1 == s2가 true로 나온다.

문자열 리터럴도 interpolated expression(${expression}을 사용해 문자열 중간에 넣은 것들)이 숫자, 문자열, 불리언, 널의 컴파일 타임 상수로 evaluate된다면 컴파일 타임 상수이다.

1: compile 타임 상수이다, 2: s4가 컴파일 타임 상수가 아니라서 컴파일 타임 상수가 아니다. 3: s5가 컴파일 타임 상수라서 컴파일 타임 상수이다. 4: p가 컴파일 타임 상수지만 타입이 Person 타입이여서 cs3는 컴파일 타임 상수가 되지 못한다.

Runes 타입은 Unicode code point를 처리할 때 사용된다고 한다. 특별한 일이 아니면 쓸일은 없을 것 같다. 유니코드에서 여러개의 코드 포인트가 합쳐져서 하나의 글자로 표시되는 글자들도 있는데 그런 경우를 처리할 때는 characters 패키지를 이용하면 유용하다고 한다. 아래의 예시에서도 덴마크의 국기 이모지가 두개의 유니코드 코드 포인트로 이루어져있는데 잘 처리되는 것을 볼 수 있다. 이모지가 섞여있는 경우 같이 유니코드 U+10000 이상의 글자가 있거나, 여러개의 유니코드 코드 포인트가 합쳐져서 하나의 글자가 생기는 경우 등의 상황에서는 string으로만 연산했을 때, 잘못된 결과가 나올 수 있는 것에 주의하도록 하자.

덴마크 국기 이모지 처리

## Symbol

Symbol 타입은 operator나 identifier를 나타내기 위해 사용되는 타입이라고 한다. 언어를 사용하는 입장에선 크게 사용될 일은 없는 듯 하다. minification 과정에서 identifier 들의 이름이 바뀔 수 있어서 해당 상황에서 identifier들을 참조하기 위해 사용된다는 듯 하다.

 

 

흠. 읽고 있다보니 내가 좀 더 보고 싶었던 부분은 Type system이 아니였나라는 생각이 드는데... 그래도 읽으면서 컴파일 타임 상수 관련 부분은 흥미로웠다. Type system에 대해서도 정리해보아야겠다.

 

참고

- Dart 공식 문서: https://dart.dev/language/built-in-types