표현식 vs 명령문
- 표현식은 값을 반환하고, 어떤 상태도 변화시키지 않는다.
- 명령문은 아무것도 반환하지 않으며, 상태를 변화시키거나 변수를 변하게 하고, 파일 작성, 데이터베이스 업데이트, 네트워크 요청 등의 작업을 수행한다.
Java, C#, JavaScript 등은 표현식보다는 명령문을 더 많이 가지고 있다. (if, for, try 등)
반면, Ruby, F#, Haskell, Groovy 등은 표현식을 더 많이 가지고 있다.
코틀린의 if와 try-catch 문은 표현식이다.
자바와 같이 명령문 형태로 쓸 수도 있지만, 표현식 형태로 쓰는 것이 더 좋다.
fun canVote(name: String, age: Int): String {
var status: String
if (age > 18) {
status = "yes, please vote"
} else {
status = "nope, please come back"
}
return "$name, $status"
}
- 먼저 명령문 형태로 쓴 코틀린을 보자.
- 명령문은 반환값을 주지 않기 때문에 조건에 따른 결과를 얻기 위해 뮤터블 변수가 필요해졌다.
val status = if (age > 18) "yes, please vote" else "nope, please come back"
- 코틀린의 if문은 표현식이기 때문에 아래와 같이 작성할 수 있다.
- 변수를 이뮤터블하게 사용할 수 있고, 타입추론도 사용할 수 있다.
fun tryExpr(blowup: Boolean): Int {
return try {
if (blowup) {
throw RuntimeException("fail")
}
2
} catch (e: Exception) {
4
}
}
- try-catch 도 표현식으로 사용할 수 있다.
- try문, catch문의 마지막 부분이 반환값이 된다.
a = b = c // error
- Java는 할당을 표현식으로 취급하지만, 코틀린은 아니다.
- 코틀린은 델리게이션(delegation)을 통해 변수를 get하거나 set하기 때문이다.