- Dart에서 타입을 변환하는 방법은 아래 두가지 방법이 있다.
타입변환(conversion)
컴파일러나 인터프리터에 의해 자동으로 데이터 타입이 바뀌는 것.
타입 캐스팅(casting)
프로그래머가 직접 캐스팅연산자로 의도적으로 명시 데이터 타입을 바꾸는 것.
double f = 2;
- 여기선 타입을 double로 정의했으나 정수를 대입하였다. 이때는 f라는 변수는 타입추론을 통해서 자동으로 int로 타입변환(conversion)된다.
- 타입변환(conversion) 이 문서에서는 double + int 를 하면 결과가 double로 나온다는 등의 이야기를 해주고있다.
- 하지만 나는 타입 변환 중 타입캐스팅을 더 심도있게 보고싶다.
someInt.toDouble() // int -> double
someDouble.toInt() // double -> int
int.parse(someString) // String -> int
double.parse(someString) // String -> double
- dart에서는 타입캐스팅 메소드가 제공된다.
- toList() 등의 메서드도 존재하는 것 같은데 이는 사용시에 알아보자.
- 수업 중에 이 연산자가 위험 할 수 있다고 했다.
- 예상되는 위험은 아래와 같아보인다.
1. 업캐스팅하는 경우
class Parent {}
class Child extends Parent{}
void main() {
Parent parent = Parent();
Child child = parent as Child;
}
//런타임 에러: 'Parent' is not a subtype of type 'Child'
- 슈퍼클래스를 서브클래스로 다운캐스팅 했을 때, 런타임에러가 발생한다.
- 그렇다면 거꾸로 서브클래스를 슈퍼클래스로 업캐스팅했을 때, 에러가 발생할까?
void main() {
Child child = Child();
Parent parent = child as Parent;
}
- 에러가 발생하지않는다. (그렇구나. 다트에서는 다운캐스팅은 지원하지 않는구나)
2. Null값을 캐스팅 하는 경우
var object = null;
String someText = object as String; // (x 런타임에러)
- 이를 조금 더 안전하게 표현하려면 try-catch문으로 처리하는 편이 나아보인다.
var object = null;
try {
String str = object as String;
print(str);
} catch(error) {
print('타입 캐스팅 도중 에러가 발생함: $error');
}
// 타입 캐스팅 도중 에러가 발생함: type 'Null' is not a subtype of type 'String' in type cast
- 이게 아니라면 is를 활용해서 미리 타입을 체크해보는 방법도 있더라 이 방법도 안전해보인다.
Child? child = null;
if (child is Parent) {
Parent parent = child as Parent;
} else {
print("child is not Parent");
}