Kotlin Any, Unit, Nothing / Java void

min0505·2021년 12월 12일
0

Java void

void는 반환하는 객체가 아무것도 없다.

void function(){
	
}

Any

모든 객체의 조상
코틀린의 모든 타입은 Any를 상속한다. Java의 Object와 같은 개념이다.
Kotlin은 Any - Class
Java는 Object - Class
이렇게 된다.

Unit

kotlin의 Unit은 자바의 void형과 대응하지만 특수한 객체를 반환한다.

fun printSum(a: Int, b: Int): Unit{
	println(a+b)
}

위와 같이 쓸 수 있지만 Unit을 아래와 같이 생략할 수 있다.

fun printSum(a: Int, b: Int){
	println(a+b)
}

반환은 안하지만 특수한 객체를 반환한다..?
그러니까 Unit은 아무것도 반환하지 않는 반환 타입이다.

✔ Unit을 반환하는 함수는 return을 생략해도 암묵적으로 Unit 타입의 객체를 return한다.
단, 해당 Unit 객체는 싱글톤이기 때문에 매번 객체를 생성하지 않는다.

Nothing

kotlin의 Nothing은 Unit 타입 처럼 값을 반환하지 않는 함수를 나타낼 때 사용한다.
Unit과의 차이점은 Unit은 Unit 타입의 객체를 return 하지만, Nothing은 return 자체를 하지 않는다.
그렇다면 Nothing은 언제 사용될까? 무한루프, 예외처리같은 상황에 사용된다.

fun infinityLoop(): Nothing{
	while(true){
    	println("HELLO WORLD!")
    }
}

fun throwException(): Nothing{
	throw Exception()
}

return을 하는 함수에서 무한 루프가 발생하는 부분이 있으면 컴파일러에서 컴파일 에러가 발생한다.
코틀린 컴파일러에서 무한 루프이니 함수가 종료되지 않을 것이라는 것을 알아낸다.
함수에서 예외를 던지는 것또한 함수가 정상적으로 종료되지 않기 때문에 return이 발생하지 않는다는 것을 알 수 있다.

Nothing은 모든 타입의 서브 타입이다. 엘비스 표현식에 사용할 수 있다.

fun nullCheck(msg: String){
	throw Exception(msg)
}
val nullableString: String?= null
val string = nullableString ?: nullCheck("String Null")

위의 코드는 nullable한 변수에 null을 할당한 후 엘비스 연산자를 통해 예외로 msg를 던지는 코드이다.
여기까지 생각해보면 Nothing은 모든 타입의 서브 타입이니까
위 Any 부분에서 정리한 코틀린은 Any - Class에서 Any - Class - Nothing
으로 정리될 수 있을 거라고 생각한다..
Any는 모든 타입의 부모, Nothing은 모든 타입의 자손 이렇게 생각된다.

참고자료

https://readystory.tistory.com/143
https://kumgo1d.tistory.com/61

profile
do it kotlin

0개의 댓글