코틀린에서 if
는 식이다. 여기서 식과 문은 무엇일까?
식(expression)
: 값을 만들어 내며 다른 식의 하위 요소로 계산에 참여할 수 있다.
문(statement)
: 아무런 값을 만들어내지 않음.
// Kotlin
val expreesion = if(a > b) a else b // 식을 만들어 대입.
// Java
int statement = if(a > b) // 에러
위에서 보았듯이 식을 사용해서 함수를 더 간결하게 표현이 가능하다. 본문이 중괄호로 둘러싸인 함수는
**블록이 본문인 함수
**라 부르고, 등호와 식으로 이뤄진 함수는 **식이 본문인 함수
**라 부른다.
// 블록이 본문인 함수
fun max(a: Int, b: Int): Int {
return if(a > b) a else b
}
// 식이 본문인 함수
fun max(a: Int, b: Int): Int = if(a > b) a else b
위 코드에서 식이 본문인 함수는 반환 타입 생략이 가능하다.
fun max(a: Int, b: Int) = if(a > b) a else b
여기서 반환 타입을 생략할 수 있는 이유는 무엇일까?
코틀린은 정적 타입 지정언어
이다. 그래서 컴파일 시점에 모든 타입을 지정해야 한다.
<aside> 💡 정적타입 언어란? 컴파일시 변수 타입이 결정되는 언어. 반대로는 동적타입 언어가 있다.
</aside>
하지만 식이 본문인 함수의 경우 반환 타입을 적지 않아도, 컴파일러가 함수 본문 식을 분석하여 식의 결과 타입을 함수 반환 타입으로 정해준다. → 타입 추론은 식이 본문인 함수의 반환 타입만 생략이 가능하다.
식이 본문인 함수와 마찬가지로 변수에도 타입을 지정하지 않으면 컴파일러가 초기화 식을 분석하여 초기화 식의 타입을 변수 타입으로 지정한다.
val x = "x" // 타입추론
val x: String = "x"