자바의 기본 타입
이 중 가장 많이 쓰이는 Int, Long, Float, Double에 대해 알아보자
코틀린은 선언된 기본값을 보고 타입을 추론한다
val number1 = 3 // Int
val number2 = 3L // Long
val number3 = 3.0f //Float
val number4 = 3.0 //Double
자바에서 기본 타입간의 변환은 암시적으로 이루어질 수 있으나, 코틀린에서 기본 타입간의 변환은 명시적으로 이루어져야 한다.
int number1 = 4;
long number2 = number1;
/*
자바에서는 더 큰 타입으로 암시적으로 변경된다.
*/
System.out.println(number1 + number2); //int타입이 암시적으로 long타입으로 변환된다.
val number1 = 4
val number2: Long = number1.toLong() //Type mismatch
/*
코틀린에서는 암시적 타입 변경이 불가능하다.
*/
println(number1 + number2)
만약 변수가 Nullable하다면 적절한 처리를 해주어야 한다.
val number3: Int? = 3
val number4: Long = number3?.toLong() ?: 0
기본 타입이 아닌 일반 타입에 대한 캐스팅은 어떻게 해야할까
public static void printAgeIfPerson(Object obj) {
if (obj instanceof Person) {
Person person = (Person) obj;
System.out.println(person.getAge());
}
}
fun printAgeIfPerson(obj: Any) {
if (obj is Person) {
val person = obj as Person
println(person.age)
}
}
코틀린에서는 instanceof 대신에 is라는 키워드를 사용하며, (Person) 이라는 타입 캐스팅 키워드 대신 as 라는 키워드를 사용한다.
여기서 as Person은 생략이 가능하다. 코틀린이 자동으로 타입을 추론하여 캐스팅 하여 주는 것인데, 이를 스마트 캐스팅이라고 한다.
위 코틀린 코드에서 만약 ‘obj가 Person타입이 아니라면’ 으로 사용하려면 !is로 표현이 가능하다.
만약 obj가 Nullable한 객체라면,
fun printAgeIfPerson(obj: Any?) {
val person = obj as? Person
println(person?.age)
}
이렇게 as?로 표현이 가능하다. 그렇다면 person도 Nullable하기 때문에 person.age도 person?.age로 변경해주어야 한다.
Nothing은 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
무조건 예외를 반환하는 함수 / 무한 루프 함수 등
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}