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에서 변수에 마우스 커서를 두면 타입이 나오는 걸 이용해 맞는지 확인했다.
위 사진에서 v에 마우스 커서를 두고 있는데 이 때 오른쪽 아래에 v는 dynamic 타입이라고 나와있다.
이 땐 dynamic타입이므로 어떤 값을 넣어도 문제없이 동작한다.
참고
'개발 > Dart' 카테고리의 다른 글
Built-in Type (0) | 2022.07.26 |
---|---|
dot(.) 개수에 따른 의미 (2개와 3개) (0) | 2022.06.07 |
factory 키워드 (싱글턴 패턴) (0) | 2022.05.26 |