코틀린의 기본 요소에는 함수(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 하는 경우에는 반드시 이를 명시해줘야 한다.
코틀린은 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
코틀린에서는 변수를 선언하기 위한 두 개의 키워드가 존재한다. 이는 다음과 같다.
val(값)
: 불변 레퍼런스로, 초기화 된 후에는 값 변경이 불가능하다. 자바의 final 변수와 같다.var(변수)
: 가변 레퍼런스로, 변경이 가능하다. 자바의 non-final 변수와 같다.여기서 주의할 점은 레퍼런스 자체는 불변이라고 해도 객체는 가변일 수 있다는 점이다. 다음과 같은 예시에서 확인할 수 있다.