본문 바로가기
Flutter for Beginners

Dart의 dynamic 변수 타입

by Andrew's Akashic Records 2025. 2. 18.
728x90

Dart

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