안녕하세요 골드입니다. 이번 글은 키워드의 차이점에 대해서 정리한 글입니다. 그중 자바의 void와 코틀린의 Unit에 차이점을 살펴보고 추가로 Nothing에 대해서도 작성하도록 하겠습니다. 결론부터 이야기하면 코틀린의 Unit은 자바의 void와 비슷합니다.
1. void와 Void
먼저 자바의 void는 반환 타입이 없으므로 생략한다는 의미입니다. 흔히 자바로 메소드를 생성할 때 반환 타입이 없으면 void를 사용합니다. 매번 사용하는 main메소드도 void를 사용합니다. 반환 값이 존재하지 않기 때문입니다.
그리고 Void가 있습니다. void와 Void는 다릅니다. int와 Integer가 같지만 다르듯이 void와 Void도 이와 같습니다. 비유하자면 void는 기본형이고 Void는 참조형입니다. 제네릭을 사용할 때 반드시 반환 타입을 명시해야 하는데, void는 제네릭에서 사용될 수 없기 때문에 Void를 사용해야 합니다. 제네릭의 반환 값이 존재하지 않을 때 이를 나타내기 위해 Void를 사용한다는 뜻입니다. 정리하면 void는 반환 값이 존재하지 않음. Void는 인스턴스 생성 불가 혹은 참조값이 존재하지 않음.
2. Unit
코틀린은 Unit으로 위에 void와 Void 두 마리 토끼를 잡을 수 있습니다. Unit은 아무것도 반환하지 않는 반환 타입입니다. 함수의 반환 타입이 없을 땐 Unit으로 설정함으로써 반환 값이 존재하지 않는다고 표현할 수 있습니다. 이러한 이유로 코틀린의 Unit은 자바의 void와 비슷하다고 이야기합니다. Unit은 Unit이라는 값 단 하나만을 갖습니다. 그렇기 때문에 Unit?은 존재할 수 없습니다. 또한 Unit은 제네릭 함수에서도 사용될 수 있습니다. 이러한 점은 불필요한 형 변환이 필요하지 않다는 장점이 있습니다. 자바는 기본형과 참조형으로 나뉘어 있지만 코틀린은 모두 참조형이라는 점과 연결 지어 생각할 수도 있을 것 같습니다.
3. Nothing
Nothing 타입도 Unit 타입처럼 값을 반환하지 않는 함수를 나타낼 때 사용합니다. Unit과의 차이점은 Nothing 타입은 함수의 실행이 끝나도 호출 코드로 복귀하지 않는다는 점과 의도적으로 예외를 발생시킨다는 점입니다. 대표적으로 코틀린 라이브러리에 있는 TODO함수가 있습니다. TODO는 예외를 발생시키며 Nothing 타입을 반환합니다. 존재 이유가 궁금할 수 있습니다. 예를 들어 필요한 기능이 아직 완성되지 않아서 구현을 보류하고 나중에 할 일을 알 수 있도록 메모처럼 사용할 수 있습니다.
보시는 바와 같이 Unreachable code라고 컴파일러가 알려줍니다. 호출 코드로 복귀하지 않기 때문입니다. Nothing?은 null입니다.
여기까지 골드였습니다.
감사합니다.
참고자료 : kotlinlang.org/docs/reference/functions.html#unit-returning-functions
kotlinlang.org/docs/reference/exceptions.html#the-nothing-type
stackoverflow.com/questions/55953052/kotlin-void-vs-unit-vs-nothing
빅 너드 랜치의 코틀린 프로그래밍 제이펍 조시 스킨 데이비드 그린핼프 지음 2019년 발행
피드백을 주시면 참고하겠습니다.
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 초기화 방법과 순서 (0) | 2020.12.25 |
---|---|
[Kotlin] lateinit과 lazy 차이점 (0) | 2020.12.23 |
[Kotlin] var, val 그리고 const val (0) | 2020.12.16 |
[Kotlin] Collections Map 사용법 (0) | 2020.08.31 |
[Kotlin] Collections Set 사용법 (List 중복제거) (0) | 2020.08.29 |