코틀린의 기본 요소에는 함수(function)변수(variable)가 있다. 코틀린에서는 많은 종류의 타입 선언을 생략해도 좋은데, 이는 가변의 데이터를 지양하고 프로그램을 불변의 상태로 유지할 수 있게 만드는데 도움이 된다. 그럼 이제 함수와 변수에 대해 알아보자.

#함수

코틀린 함수의 기본 구조는 다음과 같다.

fun max(a: Int, b; Int): Int{ //함수 이름, 파라미터, 리턴 타입
	return if(a>b) a else b //함수 바디
}

이때 위의 함수는 하나의 expression body로만 이루어져 있다. 따라서 다음과 같이 간략하게 만드는 것이 가능하다.

fun max(a: Int, b; Int): = if(a>b) a else b

이 경우 함수의 return 타입이 생략된 것을 알 수 있다. 코틀린은 컴파일 타임에 함수의 expression body를 해석하고 그것의 타입을 함수의 return 타입으로 사용할 수 있기 때문에 위와 같은 방식이 허용된다. 이때 return 타입 생략은 expression body를 가지고 있는 함수에만 허용되며, 중괄호로 둘러싸인 block body를 가지고 있어서 특정한 값을 return 하는 경우에는 반드시 이를 명시해줘야 한다.

#참고: Expression과 Statement

코틀린은 satement보다 expression을 지양하는 언어이다. 이때 이 둘의 차이는 무엇일까? Expression은 ‘수식’이라는 뜻이다. Expression들은 평가(evaluate)가 가능하기 때문에 하나 이상의 값으로 환원될 수 있다. Expression은 값을 가지기 때문에 다른 expression의 일부분으로 사용될 수 있다. 그러나 satement는 ‘서술’이라는 뜻으로, 프로그래밍에서는 실행 가능한(executable) 최소의 독립적인 코드 조각을 일컫는다. 스스로 값을 가지지 않는다는 점이 expression과의 차이점이 된다.

/*C언어 예시*/
int a=10; //Statement
a+b; //Expression

#변수

자바에서는 변수의 선언을 위해서 해당 변수의 타입을 먼저 결정해야 한다. 그러나 코틀린에서는 많은 경우 변수의 타입을 생략할 수 있다. 그러나 특정한 경우 변수의 타입을 명시해줄 수도 있다.

val answer = 42 //타입 생략
val answer: Int = 42 //타입 명시

또한 선언과 동시에 초기화를 하지 않는 경우에는 타입을 반드시 명시해야 한다.

val answer: Int //초기화를 하지 않으므로, 타입 명시
answer = 42

#가변과 불변의 변수

코틀린에서는 변수를 선언하기 위한 두 개의 키워드가 존재한다. 이는 다음과 같다.

여기서 주의할 점은 레퍼런스 자체는 불변이라고 해도 객체는 가변일 수 있다는 점이다. 다음과 같은 예시에서 확인할 수 있다.