코틀린을 사용하다 보면 특이한 타입을 만나게 된다.
물론 자바 베이스로 만들어진 언어답게 자바와 비슷한 부분도 있지만, 전체적으로 자바에서 불편한 부분들을 해결해주는 타입들이라고 생각해서 소개해본다.
1. Any
Any는 최상위 타입으로, 코틀린에 모든 타입은 Any를 상속한다.
자바로 치면 Object와 같은 개념이고 실제로 자바 바이트코트로 컴파일 됐을 때 Object로 컴파일된다.
val greeting: Any = "Hello, World!"
public final Object greeting = "Hello, World!"
Hello, World! 라는 값은 String 타입이지만 String 또한 Any 타입의 하위 타입이니 대입이 가능하다.
위와 같이 list의 값이 String, Int, Float, Boolean 등 여러 타입의 값이 있을 때 Any 타입을 사용하면 편리하다.
물론 자바의 Object와 같이 상위 타입을 사용하면 유연성이 너무 높아 타입 체크 등 버그의 위험성, 직관성에 있어서 좋지 않으니 사용을 자제해야 한다.
그래서 본인은 서버에서 받아온 데이터 타입이 확실치 않지만 사용하지 않는 값일 경우에 주로 사용하고 있다.
2. Unit
Unit 타입은 자바의 void와 비슷한 개념이다.
자바에서 함수의 리턴 타입이 없을 경우 void를 사용하듯이 코틀린에서는 Unit을 지정하게 되면 리턴 값이 없는 함수가 된다.
fun functionA(): String {
return "hello"
}
fun functionB(): Unit {
println("unit!")
}
fun functionC() {
println("unit!")
}
FunctionA()는 확실하게 String 타입을 반환하는 함수이다. 하지만 반환 값이 없을 때는 FunctionB()와 FunctionC()처럼 Unit을 반환하면 된다.
코틀린의 특징으로 함수는 반환 값을 무조건 가지는 것이 특징이다. 따라서 모든 함수의 반환값은 기본이 Unit이기 때문에 타입 지정을 하지 않으면 알아서 Unit을 반환한다.
이러한 코틀린의 특징 덕분에 반환 값이 없는 함수를 고차함수에 사용할 수 있게 된다.
실제로 안드로이드에서는 고차함수에 Unit을 사용해 반환 타입이 없는 함수에 값을 넘길 수 있다.
checkAddress 함수는 반환 값이 없어 Unit 타입 함수이기에, 리스트뷰의 아이템 클릭 시 해당 부분의 정보를 상위 클래스에서 다른 함수에 파라미터를 전달해주고 있다.
void를 사용하지 않고 코틀린에서 Unit 타입을 따로 만든 이유를 알고싶다면 다음 글을 참조하자..
3. Noting
Noting은 어떠한 값도 포함하지 않는 타입이다. 생성자도 접근할 수 없고 어떠한 값도 얻을 수 없다.
fun throwException(): Nothing {
throw IllegalStateException()
}
그러면 Unit과 다른점이 뭘까?
리턴 값이 없을 때 사용한다는 것은 Unit과 동일하다.
하지만 Unit은 아무런 값도 리턴하지 않는다라는 의미라서 리턴의 대상이 없을 뿐 리턴이라는 행위는 한다.
반면에 Nothing은 리턴이라는 행위 자체를 하지 않는다.
그래서 함수가 비정상적으로 종료가 되는 예외 처리 함수같은 곳에서 사용하기 적절하다.
'Kotlin' 카테고리의 다른 글
[kotlin] 코틀린 기본 문법(3) - 코틀린 객체지향 프로그래밍, 상속과 서브클래싱 (0) | 2023.06.02 |
---|---|
[Kotlin] 코틀린 기본 문법(2) - 코틀린 연산자와 표현식, 제어 흐름, 함수와 람다 (0) | 2023.05.28 |
[Kotlin] 코틀린 기본 문법(1) - 코틀린 데이터 타입, 변수, 널 허용 (0) | 2023.05.22 |