Kotlin ‐ 조건문: if, when, try, while[Effective Kotlin Item 5] - thought-corner/Backend-PlayGround GitHub Wiki
조건문: if, when, try, while
if문
- 코틀린의 if는 자바의 삼항 연산자(? :) 역할을 포함하며, 단순히 코드를 분기하는 문(Statement)이 아닌, 값(Value)을 반환하는 식(Expression)으로 사용된다.
if-else문이 삼항 연산자보다 길다는 이유로 코틀린에 삼항 연산자를 도입해야 한다고 하는 사람들이 많지만if-else방식이 가독성이 더 좋고 코드를 구조화하기 용이하니if-else문을 사용하도록 하자.
when문
- when은 코틀린에서 switch 문을 대체하는 강력한 구문이다. if와 마찬가지로 식(Expression)으로 활용 가능하다.
- 다양한 조건 지원
- 단순한 값 비교를 넘어, 범위(in), 타입 확인(is), 함수 호출 결과 등 다양한 조건을 검사할 수 있다.
- 식(Expression)으로서의 활용
- 모든 가능한 경우를 처리한다면 컴파일러가 else 절을 생략하도록 요구하기도 한다.
일반적으로 조건이 여러 개라면
if-else문 대신when문을 사용하도록 하자. 코드가 깔끔해지고 읽기 쉬워진다는 장점이 있다.
try식
- 코틀린에서는 예외 처리 구문인
try...catch...finally또한 값을 반환하는 식(Expression)으로 사용할 수 있다.
while문
- while 및 do-while 루프는 자바를 비롯한 대부분의 언어와 동일하게 작동하는 전통적인 문(Statement)이다.
- 동작 방식
- 특정 조건이 참인 동안 코드 블록을 반복 실행한다.
- 식(Expression)이 아님
- while은 if, when, try와 달리 값을 반환하지 않으며, 단지 반복 실행이라는 부수 효과(Side Effect)를 수행한다.
is 연산자
is연산자는 값이 특정 타입인지 확인한다.- 만약 값이 특정 타입이 아님을 확인할 때는
is연산자의 결과를 부정하는!is연산자를 사용한다.
명시적 캐스팅(up-casting & down-casting)
- 계층이 낮은 타입에서 높은 타입으로 값을 변환하는 과정을 업캐스팅이라 하며 높은 타입에서 낮은 타입으로 값을 변환하는 과정을 다운캐스팅이라고 한다.
- 코틀린에서 다운캐스팅에
as연산자를 사용한다. - 일반적으로
as연산자를 사용하는 것이 위험하다고 여겨지기에 꼭 필요한 경우가 아니라면 사용하지 않는다.
var i: Number = 123
fun main() {
val j = (i as Int) + 10
println(j)
}
- 값을 안전하게 캐스팅하는 다른 방법
var i: Number = 3.14
fun main() {
val j = i.toInt() + 10
println(j) // 13
}
as?연산자 사용
as?연산자는 캐스팅이 불가능할 경우 예외를 던지는 대신null을 반환한다.- 그렇다면
as보다as?가 안전해 보일 수 있으나, 실제로 두 연산자 모두 자주 사용하는 것은 코드 스멜(code smell)로 여겨진다. 다행히 스마트 캐스팅이라는 멋진 대안이 존재한다.
스마트 캐스팅
- 코틀린에서는 컴파일러가 변수를 특정 타입으로 확신하면 자동으로 타입을 변환해주는 스마트 캐스팅(smart casting)이라는 강력한 기능을 제공한다.