참고 : 아래의 설명은 타 개발 언어(C, Java 등)를 이미 숙지한 상태라고 가정 후 설명하는 것이다.
필자는 Java에 익숙하므로, 대부분의 설명이 Java와 비교하여 이루어 질 것이다.
모든 설명은 https://dart.dev/guides/language/language-tour 를 참고하며 개인적인 해석을 덧붙인 것이다.
틀린 부분이나 부족한 부분의 보충이 필요할 시 언제든 댓글을 달아주시길!!
1) 변수 Variables
먼저 변수란, 하나의 값을 저장할 수 있는 저장 공간이다. 쉽게 말하자면, '상자'라고 생각하면 된다.
아래의 코드는, 변수를 생성하고 초기화하고 있다.
(Dart에서 var 타입은 타입 유추를 사용하는 것이다. 무엇이 담기느냐에 따라 상자의 타입이 달라지는 것
- 심지어 nullable과 non-nullable도 자동 유추!)
var name = 'Bob';
다른 객체나 값에 대한 별명을 붙여주는 행위를 reference (참조) 라고 하는데,
name이라는 변수는 "Bob"이라는 값을 가진 String 객체의 참조 변수이다.
데이터 타입을 String이라고 명시하지 않아도, Dart는 String 데이터 타입이라고 추론/유추해낼 수 있다. (똑똑하다.)
물론 이렇게 명시할 수도 있겠다.
String name = 'Bob';
만약 한 객체가 하나의 데이터 타입으로 제한되지 않는다면, Object 타입의 변수를 생성할 수 있다.
Object name = 'Bob';
2) 초기화 / 기본 값 Default value
만약 여러분이 변수를 선언만 해 놓고, 초기화 하지 않는다면, 그 변수의 기본 값은 null 이다.
저번 포스팅에서 Dart의 특징 중 하나가 모든 것을 Object 객체 취급한다고 하였기 때문에,
숫자 형 데이터 타입 변수일지라도 기본 값은 null이다.
(Dart에는 'null safety'라는 중요한 개념이 존재합니다.
기본적으로 Dart는 null을 허용하지 않습니다. 이처럼 Nullable과 Non-Nullable을 구분하여
개발되는 코드가 Null 안전성을 보장한 상태로 개발되게 하고자 하는 개념이라고 합니다.
변수를 선언할 때 nullable 인지, non-nullable인지를 명확히 하여
컴파일러가 알아서 non-nullable 변수에 null이 대입되는 상황에 에러를 발생시킵니다.
nullable 변수의 구분은 물음표(?)로 합니다. -저번 포스팅 참조)
모든 변수를 객체로 보면 > 초기값을 null로 보기 때문에 >
null safety 하다면, non-nullable인 변수는 선언과 동시에 초기화를 해야한다.
int lineCount = 0;
하지만 이 법칙은, Top-level 변수 또는 class 변수에만 적용되며,
지역변수(Local Variables)- 함수 내에서 선언된 변수 에서는 적용되지 않는다.
즉, 지역변수를 선언할 때는 non-nullable 변수를 선언과 동시에 초기화 하지 않아도 된다.
하지만, 그 변수를 사용하기 전에는 꼭 초기화를 해준다. (값이 없으면 어떻게 사용하겠는가)
int lineCount;
if (weLikeToCount) {
lineCount = countLines();
} else {
lineCount = 0;
}
print(lineCount);
println() 함수에 들어가기 전, non-nullable 함수에 값을 대입해 주었기 때문에, 위의 코드는 가능한 코드이다.
3) Late 키워드 Late Variables
Dart 2.12부터 late 키워드가 추가되었다.
변수 선언과 동시에 초기화 할 수 없는 경우에 사용하는 키워드이다.
1) non-nullable 변수를 초기화 하지 않은 경우
- Dart는 모든 것을 객체로 보기 때문에, 초기 값은 null이라고 위에서 설명했다. 만약 non-nullable 함수를
선언 해 놓고, 초기화 하지 않은 경우 Dart는 null인 채로 더이상 초기화 되지 않을까봐 에러를 던진다.
나중에 값을 넣어주겠다고 약속하는 의미라고 생각하자.
late String description;
void main() {
description = 'Feijoada!';
print(description);
}
2) 변수의 초기화 시점을 늦추는 경우 (Lazily initializing)
- 쓸지 안 쓸지 모르는 변수여서 초기화 하는 것이 낭비일 때
// 이부분이 _readThermometer() 함수를 호출하는 유일한 부분이라고 할 때
late String temperature = _readThermometer(); // Lazily initialized.
> 이 경우 temperature 라고 하는 변수를 사용하지 않는다면, _readThermometer(); 라고 하는 함수도 호출되지 않는다.
'DART' 카테고리의 다른 글
[DART] Dart의 기본 데이터 타입(1) (int, double, String) Built-in Types in Dart (0) | 2022.04.13 |
---|---|
[DART] 상수와 final / const 키워드에 대하여 - Final and const (0) | 2022.04.11 |
[DART] Dart의 중요 개념 - 항상 숙지할 것! - Important Concepts of Dart (0) | 2022.04.07 |
[DART] Dart 프로그래밍의 기본 - A Basic Dart Program (2) | 2022.04.07 |
[DART] Dart를 공부하기에 앞서 - What is Dart Programming Language? (1) | 2022.04.07 |
댓글