문(statement)과 식(expression)

코틀린에서 if 는 식이다. 여기서 식과 문은 무엇일까?

식(expression) : 값을 만들어 내며 다른 식의 하위 요소로 계산에 참여할 수 있다.

문(statement) : 아무런 값을 만들어내지 않음.

// Kotlin
val expreesion = if(a > b) a else b // 식을 만들어 대입.

// Java
int statement = if(a > b) // 에러

식(expression)이 본문인 함수

위에서 보았듯이 식을 사용해서 함수를 더 간결하게 표현이 가능하다. 본문이 중괄호로 둘러싸인 함수는

**블록이 본문인 함수**라 부르고, 등호와 식으로 이뤄진 함수는 **식이 본문인 함수**라 부른다.

// 블록이 본문인 함수
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"

변경 가능한 변수, 불가능한 변수