728x90
Dynamic 변수
Dart에서 dynamic 타입은 모든 타입을 저장할 수 있는 동적 변수를 의미합니다.
이는 컴파일 타임에 타입이 정해지지 않고, 런타임에 타입이 결정되는 특징이 있습니다.
1. dynamic 변수 선언
void main() {
dynamic value = 10;
print(value); // 10
value = "Hello";
print(value); // Hello
value = true;
print(value); // true
}
dynamic 타입은 값이 변경될 때마다 타입이 변할 수 있습니다.
2. dynamic vs var vs Object
타입 | 특징 | 변경 가능 여부 |
var | 선언 시 타입이 자동 결정됨, 이후 변경 불가 | 한 번 타입이 결정되면 변경 불가능 |
dynamic | 모든 타입 저장 가능, 변경 가능 | 값을 변경하면 타입도 변경됨 |
Object | 모든 객체의 부모 타입 (그러나 특정 타입 연산 불가능) | 정적 타입 체크 |
void main() {
var a = "Hello";
// a = 123; // X 오류 발생 (한 번 String으로 결정되면 변경 불가능)
dynamic b = "Hello";
b = 123; // O 가능 (타입이 변경됨)
Object c = "Hello";
c = 456; // O 가능 (그러나 특정 연산을 하려면 형변환 필요)
}
dynamic과 Object 모두 모든 타입을 저장할 수 있지만, Object는 정적 타입 검사를 수행합니다.
3. dynamic 사용 시 주의점
(1) dynamic 변수의 타입 안정성 부족
void main() {
dynamic num = 100;
print(num + 50); // 150 (정상 동작)
num = "Hello";
// print(num + " World"); // 런타임 오류 발생 (String에는 + 연산 불가능)
}
dynamic은 컴파일 시 타입 검사를 하지 않으므로, 런타임 오류가 발생할 수 있음.
(2) 특정 타입으로 변환 (형변환)
dynamic 변수에 특정 연산을 수행하려면 명시적 형변환을 해야 합니다.
void main() {
dynamic value = "100";
// 형변환 없이 사용하면 오류 발생 가능
// print(value + 50); // 오류
int number = int.parse(value); // 명시적 변환
print(number + 50); // 150 (정상 작동)
}
int.parse(), double.parse()를 이용해 변환할 수 있음.
(3) is 연산자로 타입 확인
void main() {
dynamic value = 100;
if (value is int) {
print("value는 정수입니다.");
} else {
print("value는 정수가 아닙니다.");
}
}
is 키워드를 사용하면 런타임에서 타입을 확인할 수 있음.
4. 언제 dynamic을 사용해야 할까?
dynamic은 정말 필요할 때만 사용하는 것이 좋습니다.
사용할 때
- JSON 파싱 (동적 데이터 구조)
- API 응답 처리 (데이터 타입이 불확실한 경우)
- Reflection 활용 시
사용하지 않을 때
- 일반적인 변수를 선언할 때 (var, final, const가 더 안전함)
- 타입 안정성이 필요한 코드
5. dynamic과 함께 noSuchMethod() 활용
Dart에서는 dynamic을 사용하면 존재하지 않는 메서드 호출도 가능합니다.
class MyClass {
@override
dynamic noSuchMethod(Invocation invocation) {
print("존재하지 않는 메서드: ${invocation.memberName}");
return "메서드가 없습니다.";
}
}
void main() {
dynamic obj = MyClass();
print(obj.someUndefinedMethod()); // 존재하지 않는 메서드: Symbol("someUndefinedMethod")
}
존재하지 않는 메서드 호출 시 noSuchMethod() 를 통해 처리할 수 있음.
6. dynamic을 안전하게 사용하는 방법
1) is 키워드로 타입 확인
void main() {
dynamic value = "Hello";
if (value is String) {
print(value.length); // 안전한 접근
}
}
2) as 키워드로 명시적 변환
void main() {
dynamic value = "Dart";
String text = value as String;
print(text.length);
}
- dynamic은 모든 타입을 저장할 수 있지만, 타입 안정성이 부족합니다.
- var와 Object보다 유연하지만 런타임 오류 위험이 높음.
- 사용해야 하는 경우를 신중하게 판단하고, 가능한 경우 타입을 명확하게 지정하는 것이 좋습니다.
728x90
'Flutter for Beginners' 카테고리의 다른 글
Dart의 enum (0) | 2025.02.19 |
---|---|
Dart의 컬렉션(Collection) (0) | 2025.02.19 |
Dart 기초 문법 (0) | 2025.02.18 |
Dart 실습 환경 (0) | 2025.02.18 |
Dart 알아보기 (1) | 2025.02.17 |