티스토리 뷰
내장 타입
다트 언어는 다음과 같은 내장 타입을 지원한다.
- 숫자 - int, double
- 문자열 - String
- 불리언 - bool
- 레코드 - ()
- 리스트 - List
- 집합 - Set
- 맵 - Map
- 룬 - Runes
- 심볼 - Symbol
- 널 - null
내장 타입은 리터럴을 사용하여 객체를 생성하는 기능이 포함된다. 예를 들어, 'name'은 문자열 리터럴이고, true는 불리언 리터럴이다.
다트는 모든 값은 객체(클래스의 인스턴스)가 된다. 따라서 생성자를 사용하여 값을 만들 수 있다. 예를 들어, Map() 생성자를 사용하여 맵을 만들 수 있다.
다른 일부 타입도 다트 언어에서 특별한 역할을 한다.
- Object: null을 제외한 모든 다트 클래스의 슈퍼클래스
- Enum : 모든 열거형의 슈퍼클래스
- Future와 Stream : 비동기 지원에 사용
- Iterable : for-in 루프와 동기 생성자 함수에서 사용
- Never : 표현식이 절대 성공적으로 평가를 마칠 수 없음을 나타냄, 주로 항상 예외를 던지는 함수에 사용됨\
- dynamic : 정적 검사를 비활성하기 위해 사용함, 보통 Object나 Object?를 대신 사용해야 한다.\
- void : 값이 절대 사용되지 않음을 나타냄, 주로 반환 타입에 사용됨
Object, Object?, Null, 그리고 Never 클래스는 클래스 계층 구조에서 특별한 역할을 한다. 이러한 역할에 대해 더 알고 싶다면 Understanding null safety를 참조한다.
숫자
다트의 숫자는 두 종류가 있다.
- int
- double
int는 플랫폼에 따라 64비트 이하의 정숫값이 된다. 네이티브 플랫폼에서는 -2^63부터 2^63-1이 된다. 웹에서 정숫값은 자바스크립트 numbers로 표현되며 -2^53에서 2^53-1이 된다.
double은 IEEE754 표준에 지정된 64비트 부동 소수점 숫자가 된다.
int와 double은 모두 num의 하위 타입이다. num 타입은 +, -, /, *와 같은 기본 연산자를 포함하며 abs(), ceil(), floor()와 같은 메서드를 제공한다.
정수는 소수점이 없는 숫자이다.
다음은 정수 리터럴을 사용하여 int 타입을 정의하는 예제이다.
var x = 1;
var hex = 0xDEADBEEF;
var exponent = 8e5;
리터럴에 소수점이 포함되면 double 타입이 된다.
var y = 1.1;
var exponents = 1.42e5;
num 타입으로 선언하면 정수와 실숫값을 가질 수 있다.
num x = 1;
print(x.runtimeType); // int
x += 2.5;
print(x.runtimeType); // double
정수 리터럴은 double 타입에 할당 시 자동으로 double로 변환된다.
하지만 실수 리터럴을 int 타입에 할당하면 에러가 발생한다.
double a = 1; // OK
int b = 1.0; // Error!
다음은 문자열을 숫자로, 숫자를 문자열로 바꾸는 예제 코드이다.
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
int 타입은 비트 연산이 가능하다.
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000
리터럴 숫자는 컴파일-타임 상수이다.
피연산자가 컴파일-타임 상수로 평가되는 숫자라면 산술 표현식도 컴파일 타임 상수가 된다.
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
문자열
다트 문자열(String)은 UTF-16 코드 유닛의 연속이다.
문자열은 작은따옴표와 큰따옴표로 묶어서 만들 수 있다.
var s1 = 'Single quotes';
var s2 = "Double quotes";
var s3 = 'I\'m a body';
var s4 = "I'm a body";
${표현식} 을 사용해서 문자열에 표현식의 값을 넣을 수 있다. 표현식이 식별자라면 $식별자로 사용할 수 있다. 다트는 객체에 상응하는 문자열을 가져오기 위해 객체의 toString() 메서드를 호출한다.
var s = 'string`
assert('Dart has $s' == 'Dart has ' + s);
assert('Dart has ${s.toUpperCase()}' == 'Dart has ' + 'STRING');
문자열을 합치기 위해서 인접한 문자열 리터럴(adjacent string literals)나 +연산자를 사용하면 된다.
// +연산자 사용
var s1 = 'Str' + 'ing';
// 인접한 문자열 리터럴 사용
var s2 = 'str'
'in'
"g";
assert(s1 == s2);
// s3는 s2와 다른 방식으로 만들어졌지만 결과는 같다.
var s3 = 'st'
'ring';
assert(s2 == s3);
여러 줄 문자열을 만들려면, 3개의 작은따옴표나 쌍따옴표를 사용하면 된다.
var s1 = '''
You can create
multi-line string.
''';
var s2 = """
Yiou can create
multi-line string.
""";
여러 줄 문자열을 만들 때, 처음 줄바꿈은 없는 것이 된다.
다음 예제에서 s3과 s4는 동일한 문자열이 된다.
var s3 = """1
2"""
var s4 = """
1
2"""
마지막 줄 바꿈은 포함이 된다.
다음 예제에서 s5는 2 뒤에 줄바꿈이 포함되므로, s5는 s4와 동일한 문자열이 아니다.
var s5 = """
1
2
""" // 2 뒤에 줄바꿈이 포함됨
raw 문자열을 만들려면 r 접두사를 사용한다.
일반 문자열은 특수문자가 적용되어서 \n은 줄바꿈으로 변환된다.
하지만 raw 문자열은 특수문자가 적용되지 않고 \n도 문자로 포함된다.
var s = r'In a raw string. not even \n gets special treatment.';
const 문자열은 컴파일-타임 상수이므로, 보간 표현식에 사용되는 값들도 const 여야 한다.
// 다음 변수들은 const 문자열에 사용할 수 있다.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
const validConstString = '$aConstNum $aConstBool $aConstString'; // 가능
// 다음 변수들은 const 문자열에 사용할 수 없다.
var aNum = 0;
var aBool = true;
var aString = 'a string';
var aConstList = [1, 2, 3];
const invalidConstString = '$aNum $aBool $aString $aConstList'; // 에러 발생
// var 변수나, final 변수는 에러가 발생하지 않는다.
var validString = '$aNum $aBool $aString $aConstList'; // 가능
final validFinalString = '$aNum $aBool $aString $aConstList'; // 가능
불리언
다트는 bool 타입으로 불리언을 지원한다. bool은 true와 false, 두 가지 값이 된다. 이 값은 컴파일-타임 상수이다.
bool isTrue = true;
bool isFalse = false;
다트의 if 문과 assert 문은 bool 타입으로 평가되어야 한다.
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);
// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
// Check for null.
var unicorn;
assert(unicorn == null);
// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
룬과 그래프 클러스터
다트에서 룬은 문자열 유니코드 코드 포인트를 나타낸다.
사용자가 인식하는 그래프 클러스터를 보기 위해서는 characters 패키지를 사용할 수 있다.
다트 문자열은 UTF-16 코드 유닛의 연속이므로 문자열 내에서 유니코드 코드 포인트를 표현하기 위해 특별한 구문이 필요하다.
유니코드 코드 포인트를 표현하는 일반적인 방법은 \uXXXX 형식으로, XXXX는 4자리 16진수 값이다.
4자리 이상 또는 이하의 16진수를 지정하려면 값을 중괄호 안에 넣는다.
개별 유니코드 문자를 읽거나 쓰려면 characters 패키지에서 String에 정의된 characters getter를 사용한다.
import 'package:characters/characters.dart';
void main() {
var hi = 'Hi 🇩🇰';
print(hi);
print('문자열의 끝: ${hi.substring(hi.length - 1)}');
print('마지막 문자: ${hi.characters.last}');
}
출력은 환경에 따라 다를 수 있지만, 다음과 비슷하게 보일 것이다.
Hi 🇩🇰
문자열의 끝: ???
마지막 문자: 🇩🇰
심볼
Symbol 객체는 다트 프로그램에서 선언된 연산자 또는 식별자로 나타낸다. 심볼을 사용할 필요가 없을 수도 있지만, 이름으로 식별자를 참조하는 API에서 매우 유용하다. 왜냐하면 식별자 이름은 축소되지만, 식별자 심벌은 변하지 않기 때문이다.
식별자 심볼을 얻으려면 Symbol 리터럴을 사용한다. # 뒤에 식별자를 붙이면 된다.
#radix
#bar
Symbol 리터럴은 컴파일-타임 상수이다.
'다트 공식 문서 번역' 카테고리의 다른 글
다트] 레코드 - 구문, 필드, 타입, 동등성, 집합 반환 (0) | 2024.07.22 |
---|---|
다트] 함수, 화살표 구문, 매개변수, 익명 함수, 렉시컬 스코프, 렉시컬 클로저, tear-off, 반환 값, 제너레이터, 외부 함수 (0) | 2024.07.20 |
다트] 키워드 (0) | 2024.07.20 |
다트] 라이브러리 사용법 (0) | 2024.07.20 |
다트] metadata - 메타 데이터 (0) | 2024.07.20 |