티스토리 뷰

 

Java와 다른점이 보일때마다 쓰는 Kotlin - 2

 

자바에서는 매서드 파라미터나 return 값을 범용적으로 사용하고 싶을 때 Object로 타입을 지정한다.

(Object는 모든 객체의 최상위 부모 클래스이다.)

 

코틀린에서는 비슷한 의미로 Any를 쓴다.

 

Any도 코틀린의 최상위 클래스이다. Any를 타고 들어가보면 아래와 같은 설명이 있다.

The root of the Kotlin class hierarchy. Every Kotlin class has Any as a superclass.

 

따라서 Any는 Object와 사실상 큰 차이가 없다.

 

차이가 있다면 이후에 타입을 판별하는 부분인데, 코틀린에서는 스마트 캐스트라는 기능을 추가적으로 제공한다.

 

그리고 자바에서 Object를 사용할 때 어떤 객체인지 알기위해서 instanceof 를 사용한다.

if(o instanceof UserVo) {
    UserVo userVo = (UserVo) o;
    System.out.println(userVo.getUserName());
}
if(o instanceof AdminVo) {
    AdminVo adminVo = (AdminVo) o;
    System.out.println(adminVo.getAmdinName());
}
if(o instanceof AnonymousVo) {
    AnonymousVo anonymousVo = (AnonymousVo) o;
    System.out.println(anonymousVo.getAnonymousName());
}

그리고 어떤 객체인지 알기위해서 한번 더 타입 캐스팅이 필요하다.

 

하지만 코틀린에서 스마트캐스트라는 기능을 제공한다.

 

스마트 캐스트는 타입 캐스팅을 할 필요 없이 타입 체크만 하면 기존 변수를 타입 캐스팅 없이 그대로 사용 할 수 있다.

if(o is UserVo) {
    println(o.userName);
}
if(o is AdminVo) {
    println(o.adminName);
}
if(o is AnonymousVo) {
    println(o.anonymousName);
}

instanceof 대신 is를 통해 타입을 판별하고, 타입이 판별된 이후엔 자동으로 타입 캐스팅이 되어

 

Any로 들어온 변수명을 그대로 사용할 수 있다.

 

훨씬 간소화되었는데, 이 다중 조건문도 코틀린의 switch문인 when문으로 간소화할 수 있다.

when(o) {
    is UserVo -> o.userName
    is AdminVo -> o.adminName
    is AnonymousVo -> o.anonymousName
}

모든 면에서 나아진, 가독성과 코드 중복을 모두 해결된 결과물이지 싶다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함