본문 바로가기

안드로이드/Kotlin

2. Effective Kotlin - Inferred, Exception

Inferred 타입을 가급적 제한하라.

코틀린은 타입 추론을 지원한다. 타입 추론은 매우 편리하지만, 엄격해야 될 필요성이 있다. 예를 들어 다음과 같은 경우를 고려해야 된다.

open class Animal()

class Zebra : Animal()


var zebra = Zebra()
zebra = Animal() // --> Error 발생, zebra의 타입은 Zebra이다.

//방지하기 위한 코드
var zebra: Animal = Zebra()
zebra = Animal()

예외를 활용해 코드를 제한하라.

확실하게 어떤 형태로 동작해야되는 코드가 있다면, 예외를 활용하여 제한을 걸어두는 것이 좋다. 코틀린은 require, check 등을 지원한다.

제한을 걸면 다음과 같은 이점이 있다.

  • 문서를 읽지 않은 개발자도 문제를 확인할 수 있다.
  • 문제가 있을 경우 함수가 예상치 못한 동작을 수행하는 것인 예외를 throw한다.
  • 코드가 자체적으로 검사된다
  • 스마트 캐스트 기능을 활용할 수 있어, 캐스트를 적게 할 수 있다.

require

인자(argument)를 받을 때, 인자에 제한을 걸 수 있다. require은 조건을 만족하지 않으면 무조건 IllegalArgumentException을 발생시킨다.

ex. 함수가 숫자를 인자로 받아서 팩토리얼을 계산해야한다면, 인자는 양의 정수여야 한다.

fun factorial(n: Int) {
    require(n >= 0)
    ...
}

check

어떤 구체적인 조건을 만족할 때만 함수를 사용할 수 있게 해야 할 때가 있다. check는 조건을 만족하지 않으면 IllegalStateException을 발생시킨다.

ex. 사용자가 로그인했을 때만 처리를 하게 하고 싶은 함수

fun getUserInfo(): UserInfo {
    checkNotNull(userToken)
}

스마트 캐스트

require, check 등을 통해 조건을 체크할 경우, 뒤 따르는 구문은 해당 조건이 만족했을 것이라고 가정하여 스마트 캐스팅이 진행된다. 예를들어, null 체크를 진행했다면, 이후는 null 조건 확인을 수행할 필요가 없다.