DART

[DART] Dart의 변수와 초기화 - Variables in Dart

예나부기 2022. 4. 8.

참고 : 아래의 설명은 타 개발 언어(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(); 라고 하는 함수도 호출되지 않는다.

댓글