Contents

변수

아래는 변수를 생성하고 초기화하는 예제입니다:

var name = 'Bob';

변수는 레퍼런스를 저장합니다. name이라는 변수는 “Bob”이라는 값을 가지고 있는 String 객체의 레퍼런스를 포함합니다.

name의 타입은 String으로 추론되지만, 구체적으로 명시하여 타입을 변경 할 수 있습니다. 만약 객체가 단일 타입으로 제한되지 않는다면, Object 타입으로 명시하세요 (필요하다면 dynamic 사용).

Object name = 'Bob';

추론될 타입으로 명시하여 선언하는 방법도 있습니다:

String name = 'Bob';

디폴트 값

Nullable 타입을 가지는 초기화되지 않은 변수는 초기 값으로 null을 가질 수 있습니다. Dart의 다른 모든 것과 마찬가지로 숫자도 객체이기 때문에, 숫자 타입의 변수도 처음에는 null 입니다.

int? lineCount;
assert(lineCount == null);

Null 안전성을 활성화 했다면, non-nullable 변수를 사용하기 전에 값들을 초기화해야만 합니다:

int lineCount = 0;

지역 변수를 선언과 동시에 초기화 할 필요는 없지만, 사용하기 전에 값을 할당해야 합니다. 예를 들어, 다음 코드는 lineCountprint()로 전달될 때까지 null이 아님을 알 수 있기 때문에 유효합니다:

int lineCount;

if (weLikeToCount) {
  lineCount = countLines();
} else {
  lineCount = 0;
}

print(lineCount);

최상위, 클래스 변수는 지연 초기화 됩니다; 변수가 처음 사용 될 때, 초기화 코드가 실행됩니다.

Late 변수

‘late’ 수식어의 용례는 2가지가 있습니다:

  • 선언 이후에 초기화되는 non-nullable 변수를 선언하는 것
  • 변수를 초기화를 지연하는 것

종종 Dart의 제어 흐름 분석기는 non-nullable 변수가 non-null 값으로 설정되어 있는지 사용하기 전에 알아챌 수 있지만, 가끔 실패할 때도 있습니다. 가장 흔히 사용되는 두 가지 케이스는 최상위 변수와 인스턴스 변수입니다: Dart는 종종 그 변수들이 설정되었는지 판단할 수 없기 때문에, 시도하지 않습니다.

변숫값의 설정이 사용 전에 보장되지만 Dart가 동의하지 않는다면, 해당 변수를 late로 표시하여 에러를 해결할 수 있습니다:

late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

late로 표시한 변수를 선언과 동시에 초기화하면, 변수가 처음 사용될 때 이니셜라이저가 실행됩니다. 지연 초기화는 다음과 같은 상황에 유용합니다:

  • 변수가 당장 필요하진 않지만, 초기화 비용이 비쌀 때.
  • 인스턴스 변수를 초기화에 이니셜라이저가 this에 대한 접근이 필요할 때.

다음 예제에서, temperature 변수가 사용되지 않으면, 비싼 함수인 readThermometer()가 호출되지 않습니다:

// 이 프로그램에서 readThermometer()에 대한 유일한 호출입니다.
late String temperature = readThermometer(); // 지연 초기화.

Final, const

변수를 변경할 생각이 없다면, var 대신 final이나 const를 사용하거나, 지정한 타입에 추가하여 사용하세요. final 변수는 오직 한 번만 설정될 수 있습니다; const 변수는 컴파일 타임 상수입니다 (const 변수는 내부적으로 final입니다).

다음은 final 변수를 생성, 설정하는 예제입니다:

final name = 'Bob'; // 타입 어노테이션이 없음
final String nickname = 'Bobby';

final 변수의 값은 변경할 수 없습니다:

name = 'Alice'; // 에러: final 변수는 한 번만 설정될 수 있습니다.

컴파일 타임 상수인 변수를 생성할 때 const를 사용하세요. const 변수가 클래스 레벨의 변수라면, static const로 표시하세요. 변수를 선언할 때, 숫자, 문자열 리터럴, 상수 변수, 또는 상수 숫자에 대한 산술 연산의 결과 같은 값들은 컴파일 타임 상수로 선언하세요:

const bar = 1000000; // 압력의 단위 (dynes/cm2)
const double atm = 1.01325 * bar; // 표준 대기

const 키워드는 상수 변수를 선언할 때만 쓰이는 것이 아닙니다. 상수 을 만드는 데 사용할 수 있을 뿐만 아니라, 상수 값을 만드는 생성자를 선언할 수도 있습니다. 모든 변수는 상수 값을 가질 수 있습니다.

var foo = const [];
final bar = const [];
const baz = []; // `const []`와 동일

위의 baz처럼, const 선언의 초기화 식에 const를 생략해도 됩니다. 더 자세히 알고 싶다면, const를 불필요하게 사용하지 마십시오를 참고하세요.

이전에 const 값을 가지고 있었더라도, non-final, non-const 변수의 값을 변경할 수 있습니다.

foo = [1, 2, 3]; // const [] 였음

const 변수의 값은 바꿀 수 없습니다:

baz = [42]; // 에러: 상수 변수는 값이 할당될 수 없습니다.

타입 체크와 캐스트 (is 그리고 as), 컬렉션 if, 그리고 전개 연산자 (... 그리고 ...?)를 사용하는 상수 정의가 가능합니다:

const Object i = 3; // i는 정수 값을 가지는 const Object입니다.
const list = [i as int]; // 타입 캐스트를 사용하세요.
const map = {if (i is int) i: 'int'}; // is와 컬렉션 if를 사용하세요.
const set = {if (list is List<int>) ...list}; // ...를 사용하여 전개.

상수 값을 만들 때 const를 사용하는 방법에 대한 더 자세한 내용은 Lists, Maps, 그리고 Classes를 참고하세요.