1. 변수 선언
Dart에서 모든 변수는 실제 값을 직접 저장하는 것이 아니라, 객체를 가리키는 참조(reference)를 저장한다.
var name = 'Bob';
즉, 위 코드에서 name은 직접 "Bob"이라는 문자열을 저장하는 것이 아니라, "Bob"이 저장된 객체의 메모리 주소를 가리키고 있다.
1) 타입 추론
var로 선언하면 name에 할당된 값이 "Bob"이라는 문자열이므로, 자동으로 String 타입이 된다.
2) 명시적인 타입 지정
var로 선언하지 않고 명시적으로 String 타입이라는 것을 알려주는 변수 선언을 할 수도 있다.
String name = 'Bob';
3) 타입 제한 없이 변수 선언
변수가 하나의 타입으로 제한되지 않은 경우에는 여러 타입의 객체를 저장할 수도 있다.
Object name = 'Bob';
dynamic value = 10;
Object는 Dart에서 모든 클래스의 최상위 부모 클래스이다.
즉, Dart의 모든 클래스는 Object를 상속받는다.
때문에 모든 타입의 객체를 저장할 수 있다.
Object로 선언하면, 호출하거나 접근할 때 컴파일 타입에서 타입 체크가 이루어진다.
즉, 코드에서 허용되지 않은 메서드나 필드에 접근하면 컴파일러에서 오류가 발생한다.
주로 정확한 타입은 모르지만 여러 타입의 객체를 저장해야 하고,
형변환과 타입 체크를 통해 타입 안정성을 유지하고 싶을 때 사용한다.
dynamic은 타입 체크를 생략하는 특별한 타입이다.
컴파일 시점에 타입 체크를 하지 않고, 실행 시점(런타임)에 타입을 검사하기 때문에
존재하지 않는 메서드를 호출하면 실행 시점에 오류가 발생할 수 있다.
주로 외부에서 들어오는 데이터를 처리할 때, 정확한 타입을 미리 알 수 없고, 런타임에만 타입 검사를 하고자 할 때 사용한다.
2. 특징
1) Null safety
Dart에서는 null값으로 인해 발생할 수 있는 런타임 오류를 컴파일 시점에 방지한다.
String? name // Nullable type. Can be `null` or string.
String name // Non-nullable type. Cannot be `null` but can be string.
String?은 null을 허용하는 타입으로, 값이 null이 될 수도 있다.
String은 null을 허용하지 않는 타입으로, 반드시 값을 가지고 있어야 한다.
또한, 모든 변수는 초기화해야 하며, nullable 변수는 기본적으로 null이 자동으로 설정된다.
마지막으로 nullable 타입은 직접 메서드를 호출하거나 속성에 접근할 수 없다.
물론, toString(), hashCode 같은 메서드는 null에서도 호출이 가능하다.
이를 해결하려면 null-safe 연산자를 사용해야 한다.
print(name?.length); // 정상 실행 (name이 null이면 null 반환, null이 아니면 length 값 반환)
print(name ?? "Unknown"); // null이면 "Unknown" 출력
print(name!.length); // name이 null이 아니라는 것을 명시(만약 null일 경우, 런타임 에러 발생)
참고자료
https://dart.dev/language/variables
Variables
Learn about variables in Dart.
dart.dev
'Flutter' 카테고리의 다른 글
[Dart] 조건문 (if, if-else, switch) (0) | 2025.03.10 |
---|---|
[Dart] 연산자 (Operators) (0) | 2025.03.10 |
[Dart] 데이터 타입 (0) | 2025.03.10 |
[Dart] 반복문(for, for-in, while, do while) (0) | 2025.03.07 |