Kotlin에서의 타입
Kotlin에서는 선언된 기본값을 보고 타입을 추론한다.
val number1 = 1 // Int
val number2 = 1L // Long
val number3 = 1.0f // Float
val number4 = 1.0 // Double
Kotlin에서의 타입 변환
Java에서는 더 작은 Byte를 가진 타입에서 더 큰 Byte를 가진 타입으로 변환할 때에는
명시적으로 작성하지 않아도 변환에 문제가 생기지 않았다.
하지만 Kotlin에서는 기본 타입간 변환은 명시적으로 이루어져야만 한다.
val number1 = 4
val number2: Long = number1 // Type mismatch (Error)
val number2: Long = number1.toLong() // 변환 처리를 해줘야 한다.
// 변수에 null이 가능하면 nullable 처리를 해줘야 한다.
val number1 : Int? = 3
val number2: Long = number1?.toLong() ?: 0L (null 처리 확실하게 해줘야한다.)
Kotlin에서의 타입 확인
Java에서 타입을 확인할 때에는 instanceOf를 사용하여 타입을 확인하였다.
또한 다운캐스팅을 할 때에는 (String) 형식으로 했어야했다.
하지만 Kotlin에서는 간단하게 is 를 사용하면 된다.
또한 다운캐스팅 시에는 as를 사용하면 된다.
/*
만약 Person이라는 객체가 있다고 하면
아래와 같이 타입을 확인하고 다운캐스팅이 가능하다.
*/
if(obj is Person) {
val person = obj as Person // as Person 생략 가능하다.
println(person.name)
}
Kotlin에서만 존재하는 특이한 타입 세 가지
Any : Java의 Object 역할. Any 자체로는 null을 포함할 수 없어 null 처리를 위해서는 Any?로 표현해줘야 한다.
Any에 equals, hashCode, toString이 존재한다.
Unit : Java의 void와 동일. void와는 다르게 Unit은 그 자체로 타입 인자로 사용 가능하다.
함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미.
즉, Kotlin의 Unit은 실제 존재하는 타입이라는 것을 표현
Nothing : 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할. 무조건 예외를 반환하는 함수 / 무한 루프 함수에서 사용
Kotlin에서는 아래와 같이 사용 가능하다.
val person = Person(name: "홍길동", age: 29)
val log = "이 사람의 이름은 ${person.name}이고 나이는 ${person.age}세 입니다."
또한 Kotlin에서 비교 연산자를 사용할 때 객체도 비교가 가능한데
비교 연산자가 자동으로 compareTo 메소드를 호출하기 때문이다.
동등성을 판단할 때에는 '==', 동일성을 판단할 때에는 '===' 을 사용한다.