Skip to content

Latest commit

 

History

History
89 lines (73 loc) · 2.83 KB

타입을변환하는방법.md

File metadata and controls

89 lines (73 loc) · 2.83 KB

타입을 변환하는 방법

  • Dart에서 타입을 변환하는 방법은 아래 두가지 방법이 있다.

타입변환(conversion) 컴파일러나 인터프리터에 의해 자동으로 데이터 타입이 바뀌는 것.
타입 캐스팅(casting) 프로그래머가 직접 캐스팅연산자로 의도적으로 명시 데이터 타입을 바꾸는 것.

1. 타입변환(conversion)

double f = 2; 
  • 여기선 타입을 double로 정의했으나 정수를 대입하였다. 이때는 f라는 변수는 타입추론을 통해서 자동으로 int로 타입변환(conversion)된다.
  • 타입변환(conversion) 이 문서에서는 double + int 를 하면 결과가 double로 나온다는 등의 이야기를 해주고있다.
  • 하지만 나는 타입 변환 중 타입캐스팅을 더 심도있게 보고싶다.


2. 타입캐스팅(typeCasting)

타입 캐스팅 메소드 활용하기

someInt.toDouble() // int -> double
someDouble.toInt() // double -> int

int.parse(someString) // String -> int
double.parse(someString) // String -> double
  • dart에서는 타입캐스팅 메소드가 제공된다.
  • toList() 등의 메서드도 존재하는 것 같은데 이는 사용시에 알아보자.

타입 캐스팅 as연산자**

  • 수업 중에 이 연산자가 위험 할 수 있다고 했다.
  • 예상되는 위험은 아래와 같아보인다.

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");
}