개발/Dart

Object dynamic var 차이

leebera_ 2022. 8. 2. 16:02

Object

모든 타입의 공통 부모이다.

다른 타입을 대입 할 수 있다.

void main() {
  Object obj = 10;
  print(obj.runtimeType);

  obj = '이십';
  print(obj.runtimeType);

  obj = TestObj();
  print(obj.toString());
}

class TestObj {
  @override
  String toString() {
    return 'obj';
  }
}

// 출력 결과
// int
// String
// obj

 

dynamic

컴파일 시간에 오류를 잡아내는 static checking을 하지 않는다.

컴파일 시간에 오류를 잡아내지 않으므로 어떤 값이 들어오는지 정확히 알 때만 사용해야 한다.

void main() {
  dynamic v = {'a': 1, 'b': [1, 3.4]};
  print(v.runtimeType);
  
  v = 'str';
  print(v.runtimeType);
  
  v.printString();
}

class TestClass {
  void printString() {
    print('this is TestClass');
  }
}
  
// 출력 결과
// JsLinkedHashMap<String, Object>
// String
// Uncaught TypeError: "str".printString$0 is not a functionError: TypeError: "str".printString$0 is not a function

v의 마지막 타입은 String인데 v와는 전혀 상관없는 TestClass의 printString을 호출해도 컴파일 에러는 발생하지 않고 실행한 후에 런타임 에러로 Uncaught TypeError가 발생한다.

 

JsLinkedHashMap<String, Object>는 Map<String, Object>를 의미한다.

 

var

자바스크립트 또는 C#을 다루던 사람이라면 알고있을 이름의 타입이다.

자바스크립트와는 다르고 C#과 거의 비슷한데 모든 타입이 될 수 있지만 초기화 값에 따라 타입이 정해진다. (다른 점은 C#에선 초기화하지 않으면 에러가 발생한다.)

var v = 10;
print(v.runtimeType);
  
v = 'str';
print(v.runtimeType);

// 출력 결과
/* 컴파일 에러 발생
Error: A value of type 'String' can't be assigned to a variable of type 'int'.
  v = 'str';
      ^
Error: Compilation failed.
*/

위 코드는 이미 int값 10으로 초기화되었으므로 v의 타입은 int로 정해졌는데 String 값을 대입해서 컴파일 에러가 발생한 것이다.

 

만약 초기화하지 않으면 dynamic으로 정해진다.

DartPad에서 변수에 마우스 커서를 두면 타입이 나오는 걸 이용해 맞는지 확인했다.

var 테스트 코드

위 사진에서 v에 마우스 커서를 두고 있는데 이 때 오른쪽 아래에 v는 dynamic 타입이라고 나와있다.

이 땐 dynamic타입이므로 어떤 값을 넣어도 문제없이 동작한다.

 


 

참고

 

Differences Between var and dynamic type in Dart | Flutter Agency

Learn about the two type in Dart. Learn the difference between Var and dynamic type in Dart.

flutteragency.com