[Kotlin] Type

👻·2022년 12월 23일
0

Kotlin

목록 보기
2/2
post-thumbnail

📌 기본 타입

Java에서 Primitive type인 int와 long을 연산해보자.

int num1 = 5;
long num2 = num1;

System.out.println(num1 + num2);

num2 = num1 이부분을 보면 (int) 등을 사용하여 형변환을 한 다음 연산하지 않아도 동작한다.
이 말은 둘 중 한쪽으로 타입이 변경되었다고 볼 수 있다.

실제로 num1 + num2의 결과값은 int가 아닌 long 타입이다.
더 큰 쪽으로 암묵적으로 변경이 된다는 말이다.


IDE에서 직접 확인해보자.
int로 쓰려 해보아도 int 형태로 cast 하라고 경고해준다.

그럼 이제 Kotlin에서 확인해보자.

val num1 = 5
val num2: Long = num1 // Type mismatch ERROR!

println(num1 + num2)

num1은 타입을 명시하지 않았기 때문에 Int 타입으로 들어가있다.
Long 타입인 num2에 num1을 넣으려 하자마자 바로 에러가 난다.
애초에 암묵적으로 변환을 시켜주지 않는다는 말이다.

Kotlin에서는 toLong(), toDouble(), toString()... 이런 것들을 사용하여 명시적으로 변환해주어야 한다.

val num1 = 5
val num2: Long = num1.toLong()

println(num1 + num2)

참고로 변수가 Nullable이면 따로 처리하지 않을 시 컴파일단에서 에러가 난다.


컴파일러의 입장에서 num1이 null일 가능성이 있는데,
toLong() 메소드를 호출하면 NullPointerException이 발생할테니까 안된다고 하는 것이다.

따라서 SafeCall과 Elvis 연산자를 통해 처리를 해주어야 한다.

📌 Type Casting

Java부터 예시를 들어보자.
메소드의 매게변수로는 Object로 받고, Object가 Animal이면 객체에서 어떤 동물인지를 추출해보자.

private String getNameIfAnimal(Object obj) {
	if(obj instanceof Animal) {
    	Animal animal = (Animal) obj;
        return animal.getName();
    }
}

Java에서 Object는 모든 객체들의 최상위 타입이다.

매개변수로 받은 Object가 어떤 타입에 해당하는지에 대한 조건은 instanceof를 사용한다.
변수가 주어진 타입이면 true, 그렇지 않을 경우 false를 반환해준다.

Object가 Animal인지 알기 위해서 instanceof를 사용했고,
Object를 (Animal)로 캐스팅하여 animal 객체의 메소드를 사용할 수 있다.

그럼 Kotlin과 비교해보자.

fun getNameIfAnimal(obj: Any): String {
	return if(obj is Animal) {
    	val animal = obj as Animal
        animal.getName();
    } else {
    	"Is not Animal"
    }
}

Kotlin에서는 instanceof를 사용하지 않고, is를 사용한다.
또한 (Animal)형태로 캐스팅하는 것이 아니라 as를 사용하여 캐스팅한다.
심지어 as Animal은 생략 가능하다.
Java에서는 캐스팅하지 않으면 해당 객체로 인식하지 못하지만, Kotlin에서는 인식가능하다.

fun getNameIfAnimal(obj: Any): String {
	return if(obj is Animal) {
        obj.getName();
    } else {
    	"Is not Animal"
    }
}

캐스팅 없이도 obj.getName을 사용할 수 있다는 말이다.
이 것을 Smart Cast라고 부른다.
물론 해당 객체인지 타입 체크를 해주어야 가능한 일이다.

또 다른 차이점은 Any이다.
Java의 Object 역할이라 생각하면 된다.

profile
Software Developer

0개의 댓글