Dart Language Tour #2

t0dd·2020년 8월 14일
0

Dart Language Tour

목록 보기
2/6
post-thumbnail

변수

변수는 다음과 같이 선언합니다.

var name = 'Bob'; 

String 타입의 값인 'Bob'을 name 변수에 넣어줍니다.
타입이 String 이지만 충분히 유추가능하기 때문에, 명시해주지 않았습니다.
변수가 유동적이거나 하나의 타입에 국한되어있지 않다면, Objectdynamic 타입으로 명시해주면 됩니다.

dynamic name = 'Bob';

아니면, String 타입으로 명시해줄 수도 있습니다.

String name = 'Bob';

초기값 설정

Dart에서 초기값 설정이 안된 변수는 null의 초기값을 가지게 됩니다.

int lineCount;
assert(lineCount == null); // development 모드에서만 실행되는 구문 (예외를 throw)

FinalConst

변수를 변경하지 않으려는 경우, var대신에 final이나 const 타입을 사용합니다.
final 타입의 변수는 초기값만 설정할 수 있습니다.
const 타입의 변수는 컴파일 타입 상수입니다. (상수 변수는 암시적으로 final입니다.)
최상위 final 또는 클래스 변수는 처음 사용될 때 초기화됩니다.

final name = 'Bob'; // 타입이 없어도 선언 가능
final String nickname = 'Bobby'; 

name = 'Alice'; // Error: a final variable can only be set once.
// final 변수는 한 번만 값을 가질 수 있음.

컴파일 타임 상수가 될 변수에는 const를 사용합니다.
const 변수가 클래스 수준에 있으면 static const로 표기합니다.

변수를 선언하는 경우 값을 숫자 또는 문자열 상수, const 변수 또는 숫자 상수에 대한 산술 연산의 결과와 같은 컴파일타임 상수로 설정합니다.

const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere

const 키워드는 상수 변수를 선언하기 위한 것이 아닙니다.
이를 이용하여 상수 값을 생성하고, 상수 값을 생성하는 생성자를 선언할 수도 있습니다.
모든 변수는 상수 값을 가질 수 있습니다.

var foo = const [];
final bar = const [];

const baz = []; 
// 결국 []는 const [] 와 똑같기 때문에, 초기화 표현식에서 const를 생략함 (중복사용 방지)

foo 는 상수 값을 가졌었지만, const 타입의 변수가 아니기 때문에 값 변경이 가능합니다.

foo = [1, 2, 3]; // Was const []

bazconst 타입 변수이기 때문에, 값 변경이 불가능합니다.

baz = [42]; // Error: Constant variables can't be assigned a value.

Dart 2.5버전 부터 유형검사 및 캐스트 (isas), 컬렉션 if 및 스프레드 연산자 (......?)를 사용하는 상수를 정의할 수 있습니다.

// Valid compile-time constants as of Dart 2.5.
const Object i = 3; // Where i is a const Object with an int value...
const list = [i as int]; // Use a typecast.
const map = {if (i is int) i: "int"}; // Use is and collection if.
const set = {if (list is List<int>) ...list}; // ...and a spread.

빌트-인 타입

Dart는 아래와 같은 타입들을 지원합니다.

  • numbers
  • strings
  • booleans
  • lists (also known as arrays)
  • sets
  • maps
  • runes (for expressing Unicode characters in a string)
  • symbols

상수를 사용하여 이러한 타입들의 개체를 초기화할 수 있습니다.
예를 들어 'this is a string'은 문자열 상수이고, true 는 부울 상수입니다.

Dart의 모든 변수는 객체 (클래스의 인스턴스)를 참조하기 때문에, 일반적으로 생성자를 사용하여 변수를 초기화할 수 있습니다. 일부 내장 타입에는 자체 생성자가 있습니다.

예를 들어, Map() 생성자를 사용하여 Map 객체를 만들 수 있습니다.

Numbers

Dart에서 숫자 타입은 두 가지로 나뉩니다.

int

플랫폼에 따라 64비트 이하의 정수 값입니다. Dart VM에서 값은 263-2^{63} ~ 26312^{63}-1 까지 가능합니다. Javascript로 컴파일된 Dart는 Javascript 숫자를 사용하며, 253-2^{53} ~ 25312^{53}-1의 값을 허용합니다.

double

IEEE 754 표준에 지정된 64비트 (배정 밀도) 부동 소수점 값을 허용합니다.

num

intdouble 모두 num의 하위 타입입니다. num 타입에는 +, -, /, * 같은 기본 연산자가 포함되며, 다른 메소드 중에서도 abs(), ceil(), floor()를 찾을 수 있습니다. (>>와 같은 비트 연산자는 int 클래스에 정의되어 있습니다.)

num 및 해당 하위 타입에 원하는 항목이 없는 경우 dart:math 라이브러리에 있을 수 있습니다.

var x = 1;
var hex = 0xDEADBEEF;

// 상수 int 예시
var y = 1.1;
var exponents = 1.42e5;

// 상수 double 예시

Dart 2.1 이후에서는 double 타입에 int 상수를 넣으면 자동으로 double로 변환됨.

double z = 1;

아래와 같이 문자열을 숫자로, 숫자를 문자로 바꿀 수 있습니다.

// 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 타입은 기존 비트 Shift(<<, >>), And(&), Or(|) 연산자를 지원합니다.

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111

상수 숫자는 컴파일 타임 상수입니다. 피연산자가 숫자로 평가되는 컴파일 타임 상수로 인한 많은 산술식도 컴파일타임 상수입니다.

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

String

Dart에서의 문자열은 일련의 UTF-16 코드 단위입니다. 작은 따옴표 또는 큰 따옴표를 사용하여 문자열을 만들 수 있습니다.

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";

${expr} 를 사용하여 문자열 안에 표현식의 값을 넣을 수 있습니다.

표현식이 식별자인 경우, {}를 건너뛸 수 있습니다. 객체에 해당하는 문자열을 얻기위해 Dart는 객체의 toString() 함수를 호출합니다.

var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, ' +
        'which is very handy.');
assert('That deserves all caps. ' +
        '${s.toUpperCase()} is very handy!' ==
    'That deserves all caps. ' +
        'STRING INTERPOLATION is very handy!');

==연산자는 두 개체가 동일한 지 테스트합니다. 동일한 코드 단위 시퀀스를 포함하는 두 문자열은 동일합니다.

인접한 문자열 리터럴 또는 + 연산자를 사용하여 문자열을 연결할 수 있습니다.

var s1 = 'String '
    'concatenation'
    " works even over line breaks.";
assert(s1 ==
    'String concatenation works even over '
        'line breaks.');

var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');

여러 줄의 문자열을 만드는 또 다른 방법으로, 작은 따옴표 또는 큰 따옴표로 삼중따옴표를 사용합니다.

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

r을 접두사로 붙여 Raw String을 만들 수 있습니다.

var s = r'In a raw string, not even \n gets special treatment.';

문자열에 유니코드 문자를 표현하는 방법에 대한 자세한 내용은, 여기를 참조하세요.

리터럴 문자열은 보간된 표현식이 null 또는 숫자, 문자열 또는 부울 값으로 평가되는 컴파일 타임 상수

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';

Boolean

Dart에는 부울값을 나타내기 위해 true, false 값만을 가지는 bool 타입이 있습니다. 두 값 모두 컴파일타임 상수입니다.

Dart의 유형 안정성은 if(nonbooleanValue) 또는 assert(nonbooleanValue)와 같은 코드를 사용할 수 없음을 의미합니다. 대신 아래와 같이 명시적으로 값을 확인하십시오.

// 빈 문자열 검사.
var fullName = '';
assert(fullName.isEmpty);

// 숫자 0 검사.
var hitPoints = 0;
assert(hitPoints <= 0);

// null 인지 검사.
var unicorn;
assert(unicorn == null);

// 계산 결과 값이 NaN인지 검사.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

List

거의 모든 프로그래밍 언어에서 가장 일반적인 컬렉션은 배열 또는 정렬된 객체 그룹일 것입니다. Dart에서 배열은 List 객체입니다.

Dart List 리터럴은 Javascript Array 리터럴처럼 보입니다.

var list = [1, 2, 3];
// Dart 배열 객체 선언

Dart는 배열에 List<int> 유형이 있다고 추론합니다. 이 배열에 정수가 아닌 개체를 추가하려고하면 분석기 또는 런타임에서 오류가 발생합니다. 자세한 내용은 유형추론을 참조하세요.

배열은 0부터 시작하는 인덱싱을 사용합니다. 0은 첫 요소의 인덱스이고, list.length - 1은 마지막 요소의 인덱스입니다. Javascript에서와 마찬가지로, 배열의 길이를 가져오고 목록 요소를 참조할 수 있습니다.

var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);

컴파일타임 상수인 배열을 만들려면 배열 리터럴 앞에 const를 추가합니다.

var constantList = const [1, 2, 3];
// constantList[1] = 1; // Error! 컴파일타임 상수배열의 요소를 변경할 수 없음.

Dart 2.3은 배열에 여러 요소를 삽입하는 간결한 방법을 제공하는 스프레드 연산자 ...null 인식 확산 연산자 ...?를 도입했습니다.

예를 들어 스프레드 연산자 ...를 사용하여 목록의 모든 요소를 다른 목록에 삽입 할 수 있습니다.

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

스프레드 연산자 오른쪽에 있는 식이 null일 수 있는 경우, null인식 스프레드 연산자 ...? 를 사용하여 예외를 피할 수 있습니다.

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

스프레드 연산자 사용에 대한 자세한 내용과 예는 스프레드 연산자 제안을 참조하세요.

Dart 2.3은 또한 조건부 if 및 반복 for을 사용하여 배열 구축하는 데 사용할 수 있는 collection ifcollection for를 도입했습니다.

다음은 3개 또는 4개의 항목이있는 목록을 만드는 경우 배열을 사용하는 예시입니다.

var nav = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];

다음은 배열 사용하여 목록의 항목을 다른 배열에 추가하기 전에 변경하는 예시입니다.

var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');

배열 사용에 대한 자세한 내용과 예제는 제어 흐름 컬렉션 제안을 참조하세요.

배열 유형에는 배열을 조작하는 여러 가지 편리한 방법이 있습니다. 배열에 대한 자세한 내용은 제네릭컬렉션을 참조하세요.

Sets

Dart의 Set는 순서가 지정되지 않은 고유한 아이템 모음입니다. 집합에 대한 Dart 지원은 Set 리터럴과 Set 타입에 의해 제공됩니다.

Set 유형은 항상 Dart의 핵심 부분 이었지만 Set 리터럴은 Dart 2.2에서 도입되었습니다.

간단한 Set의 예시입니다.

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

Dart는 halogens의 타입이 Set<String>이라고 추론합니다. Set에 잘못된 타입의 값을 추가하려고하면 분석기 또는 런타임에서 오류가 발생합니다. 자세한 내용은 유형 추론을 참조하세요.

Set을 만들려면 타입 인수 앞에 {}를 사용하거나 {}를 Set 타입의 변수에 할당합니다.

var names = <String>{};
// Set<String> names = {}; // 이렇게 써도 됩니다.
// var names = {}; // Map을 만듭니다.

Set 또는 Map?
Map 리터럴의 구문은 Set 리터럴의 구문과 유사합니다. Map 리터럴이 먼저 왔기 때문에 {}는 기본적으로 Map 유형입니다. {}의 타입 주석 또는 할당 된 변수를 잊어 버린 경우 Dart는 Map <dynamic, dynamic> 타입의 개체를 만듭니다.

add () 또는 addAll () 메서드를 사용하여 기존 Set에 항목을 추가합니다.

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);

.length를 사용하여 Set의 항목 수를 가져옵니다.

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);

컴파일타임 상수 인 Set을 만들려면 Set 리터럴 앞에 const를 추가합니다.

final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// constantSet.add('helium'); // Uncommenting this causes an error.

Dart 2.3부터 SetList과 마찬가지로 스프레드 연산자 (......?)와 collection ifcollection for를 지원합니다. 자세한 내용은 List 스프레드 연산자List 수집 연산자 토론을 참조하세요.

Set에 대한 자세한 내용은 제네릭Set을 참조하십시오.

Maps

일반적으로 Map은 키와 값으로 이루어진 객체입니다. 키와 값은 모든 유형의 객체가 될 수 있습니다. 각 키는 한 번만 발생하지만 동일한 값을 여러 번 사용할 수 있습니다. Map에 대한 Dart 지원은 Map 리터럴과 Map 타입에 의해 제공됩니다.

다음은 Map 리터럴을 사용하여 만든 몇 가지 간단한 Dart Map입니다.

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

//Javascript Object와 유사함.

Dart는 gifts의 타입이 Map <String, String>이고 nobleGases의 유형이 Map <int, String>이라고 추론합니다. 잘못된 타입의 값을 Map에 추가하려고하면 분석기 또는 런타임에서 오류가 발생합니다. 자세한 내용은 유형 추론을 참조하세요.

Map 생성자를 사용하여 동일한 객체를 만들 수 있습니다.

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

Map () 대신 new Map ()이 표시 될 것으로 예상 할 수 있습니다. Dart 2에서 new 키워드는 선택 사항입니다. 자세한 내용은 생성자 사용을 참조하세요.

Javascript에서와 같이 기존 Map에 새로운 키-값 쌍을 추가할 수 있습니다.

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

JavaScript 에서와 같은 방식으로 Map에서 값을 검색합니다.

var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

Map에 없는 키를 찾으면 null이 반환됩니다.

var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

.length를 사용하여 Map에서 키-값 쌍의 수를 가져옵니다

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

컴파일타임 상수 인 Map을 만들려면 Map 리터럴 앞에 const를 추가합니다.

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// constantMap[2] = 'Helium'; // Uncommenting this causes an error.

Dart 2.3부터 MapList 마찬가지로 스프레드 연산자 (......?) 및 수집을 지원합니다. 자세한 내용과 예시는 스프레드 운영자 제안제어 흐름 수집 제안을 참조하십시오.

Map에 대한 자세한 내용은 제네릭Map을 참조하십시오.

Runes and grpheme clusters

Dart에서 Rune은 문자열의 유니코드 코드포인트를 노출합니다. Dart 2.6부터는 문자 패키지를 사용하여 유니 코드 (확장) 자소 클러스터라고도하는 사용자 인식 문자를 보거나 조작합니다.

유니코드는 전 세계의 모든 문자 체계에서 사용되는 각 문자, 숫자 및 기호에 대해 고유 한 숫자 값을 정의합니다. Dart 문자열은 일련의 UTF-16 코드 단위이므로 문자열 내에서 유니코드 코드포인트를 표현하려면 특수 구문이 필요합니다. 유니코드 코드포인트를 표현하는 일반적인 방법은 \uXXXX입니다. 여기서 XXXX는 4 자리 16진수 값입니다. 예를 들어 하트 (♥)는 \u2665입니다. 4자리 이하의 16진수를 지정하려면 값을 중괄호 안에 넣으십시오. 예를 들어 웃는 이모티콘 (😆)은 \u{1f606}입니다.

개별 유니 코드 문자를 읽거나 써야하는 경우 characters 패키지에 의해 String에 정의 된 문자 getter를 사용하십시오. 반환 된 Characters 객체는 문자 소 클러스터의 시퀀스로서의 문자열입니다. 다음은 characters API 사용의 예입니다.

import 'package:characters/characters.dart';
...
var hi = 'Hi 🇩🇰';
print(hi);
print('The end of the string: ${hi.substring(hi.length - 1)}');
print('The last character: ${hi.characters.last}\n');

환경에 따라 출력은 다음과 같습니다.

문자 패키지를 사용하여 문자열을 조작하는 방법에 대한 자세한 내용은 문자 패키지의 예제API 참조를 참조하십시오.

Symbols

Symbol 객체는 Dart 프로그램에서 선언 된 연산자 또는 식별자를 나타냅니다. 기호를 사용할 필요는 없지만 이름으로 식별자를 참조하는 API에는 매우 유용합니다. 축소화는 식별자 이름을 변경하지만 식별자 기호는 변경하지 않기 때문입니다.

식별자에 대한 기호를 얻으려면 기호 리터럴을 사용하십시오. 기호 리터럴은 # 뒤에 식별자가옵니다.

#radix
#bar
// Symbol 리터럴은 컴파일 타임 상수입니다.
profile
Javascript로 많은 것을 쉽고 빠르고 재밌게 만드는 것을 좋아합니다.

0개의 댓글