본문 바로가기
FullStack/23. Dart

Dart(다트) - 변수

by nakanara 2023. 4. 14.
반응형

var 변수, 기본 값

Dart는 객체 지향 프로그래밍 언어이며, 변수는 값을 저장하는 데 사용됩니다. 변수는 다음과 같이 선언됩니다.

var 변수명 = 값;

여기서 var 키워드는 변수가 자동으로 형을 추론하도록 해줍니다.

var name = 'John';  
var age = 30;  
var isStudent = true;  

name 변수는 문자열 값을 저장하고, age 변수는 정수 값을 저장하며, isStudent 변수는 불리언 값을 저장합니다.

Dart에서 기본적으로 변수의 초기화를 생략할 수 없으며, 필요하다면 명시적으로 선언해야 합니다.
Dart에서 변수는 지역 변수와 전역 변수로 구분됩니다. 지역 변수는 특정 블록 내에서만 사용할 수 있으며, 전역 변수는 전체 프로그램에서 사용할 수 있습니다.

final, const

Dart에서는 변수의 final 및 const 키워드를 사용하여 불변 변수를 선언할 수 있습니다.
final 키워드는 변수가 한 번 초기화되면 그 값이 변경되지 않도록 합니다.
const 키워드는 변수가 컴파일 시간에 상수로 평가됩니다. 이러한 변수는 실행 중에 값이 변경될 수 없습니다.

final name = 'John';  
const pi = 3.14;  

name 변수는 한 번 초기화되면 변경될 수 없으며, pi 변수는 컴파일 시간에 상수로 평가됩니다.

명시적 타입 선언

Dart에서는 변수의 타입을 명시적으로 선언할 수도 있습니다. 이러한 변수는 해당 타입의 값만 저장할 수 있습니다.

숫자: int, double
문자열: String
Booleans: bool
Lists: List, Array(배열)
Sets: Set
Maps: Map
Runes: Runes)
Symbols: Symbol

String name = 'John';
int age = 30;
bool isStudent = true;
name = 'Alice'; // Error: a final variable can only be set once.

name 변수는 문자열 값만 저장할 수 있으며, age 변수는 정수 값만 저장할 수 있으며, isStudent 변수는 불리언 값만 저장할 수 있습니다.

유효 범위(Scope)

Dart에서는 변수의 유효 범위(scope)가 중요합니다. 변수가 선언된 블록 안에서만 유효합니다. 예를 들어, 함수 내에서 선언된 변수는 함수 안에서만 사용할 수 있습니다.

void main() {
  var name = 'John';
  if (true) {
    var age = 30;
    print(name); // 출력: John
  }
  print(age); // 에러: age 변수는 유효하지 않습니다.
}

age 변수는 if 블록 안에서만 유효하며, print(age)는 에러가 발생합니다.

Dart에서는 변수명을 지을 때 camelCase 규칙을 따릅니다. firstName, lastName, isStudent와 같은 변수명을 사용합니다.

변수 초기화, Null-Safety

변수의 초기화를 생략할 수 없습니다. 모든 변수는 선언과 동시에 초기화되어야 합니다.
초기화되지 않은 변수는 사용할 수 없습니다.

변수를 다른 변수나 상수의 값으로 초기화할 수도 있습니다.

var name = 'John';
var greeting = 'Hello, $name!';
print(greeting); // 출력: Hello, John!

greeting 변수는 name 변수를 참조하여 문자열을 초기화합니다. 이러한 변수 초기화를 통해 코드를 간결하고 가독성 있게 작성할 수 있습니다.

변수의 값이 null일 수 있다는 것을 인식하여 Null-Safety 기능을 제공합니다. Null-Safety는 변수가 null이 될 수 있는지 여부를 명시적으로 선언합니다. 이를 통해 null에 대한 예기치 않은 동작을 방지할 수 있습니다. Null-Safety를 사용하려면 변수의 타입 이름 뒤에 물음표(?)를 추가합니다.

String? name = null; // Null-Safety

위 코드에서 name 변수는 문자열 또는 null 값을 저장할 수 있습니다.

Private 변수

변수명 앞에 언더스코어(_)를 붙여서 변수를 private으로 만들 수 있습니다. private 변수는 클래스 외부에서 직접 접근할 수 없습니다.

class Person {
  String _name = 'John';

  String getName() {
    return _name;
  }

  void setName(String name) {
    _name = name;
  }
}

var person = Person();
print(person._name); // 에러: _name은 private 변수입니다.
print(person.getName()); // 출력: John
person.setName('Jane');
print(person.getName()); // 출력: Jane

위 코드에서 _name 변수는 private으로 선언되어 있으므로 클래스 외부에서 직접 접근할 수 없습니다. 대신 getName() 및 setName() 메서드를 사용하여 _name 변수에 접근할 수 있습니다.

late 늦은 초기화 변수

Dart 2.12 버전 이상부터는 late 키워드를 사용하여 나중에 초기화될 변수를 선언할 수 있습니다. late 키워드를 사용하면 변수를 선언할 때 초기화를 생략할 수 있습니다. 이러한 변수를 '늦은 초기화 변수'라고 합니다.

늦은 초기화 변수는 선언 후 나중에 값을 할당할 수 있습니다. 할당 이전에 변수를 사용하면, 런타임에 LateInitializationError가 발생합니다.

late String name;

void main() {
  name = 'John';
  print(name); // 출력: John
}

name 변수는 late 키워드를 사용하여 늦은 초기화 변수로 선언되었습니다. name 변수의 초기값을 생략하였습니다. name 변수는 main() 함수에서 초기화되고, 값을 출력합니다.

late String name;

void main() {
  print(name); // 에러: LateInitializationError 발생
}

name 변수를 초기화하지 않고, main() 함수에서 출력하면, LateInitializationError가 발생합니다. 따라서 늦은 초기화 변수를 사용할 때는 반드시 변수를 초기화한 후에 사용해야 합니다.

늦은 초기화 변수는 null 안정성(Null-Safety) 기능과 함께 사용할 수 있습니다. null 안정성 기능을 사용하면 늦은 초기화 변수의 값을 null로 지정할 수 없으며, 컴파일러가 변수의 null 여부를 확인합니다. 따라서 런타임에 null 값을 사용하여 발생할 수 있는 예외를 사전에 방지할 수 있습니다.

반응형