Kotlin 기초 - 함수, 변수, 문자열 템플릿
아래 내용은 Kotlin in Action 도서를 기반으로 작성하였습니다.
함수
코틀린 함수의 기본 구조는 다음과 같다.
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
여기에서 알아볼 수 있는 코틀린 함수의 특징은
- fun 키워드를 사용하여 함수를 선언한다.
- 파라미터는
이름: 타입
의 형식으로 표기한다. - 함수의 반환 타입은 뒤에 표기한다.
자바와는 달리 코틀린은 if가 식으로 동작한다. 식은 값을 만들어 내며 다른 식의 하위 요소로 계산할 수 있지만 문은 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소로만 존재한다. 코틀린은 루프를 제외한 대부분의 제어 구조가 식이며 이를 통해 여러 일반적인 패턴을 간결하게 표현할 수 있다.
식이 본문인 함수
함수의 본문이 식 하나로 이뤄져 있으면(위에서 살펴본 함수도 식 하나로 이뤄신 함수) 중괄호와 return
을 없애고 식 앞에 등호를 붙여 함수 표현을 간결하게 할 수 있다.
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
코틀린은 타입 추론이 가능한 언어이기 때문에 식이 본문인 함수의 경우 컴파일러가 식의 결과 타입을 함수의 반환 타입으로 정해준다. 다만 블록이 본문인 함수(중괄호와 return
포함)는 타입을 명시하여야 한다.
타입 추론(Type inference) 정적 타입 지정 언어(컴파일 시점에 모든 식의 타입을 지정해야 하는 프로그래밍 언어)에서 컴파일러가 타입을 분석해 프로그래머 대신 프로그램 구성 요소의 타입을 정해주는 기능. 코틀린은 타입 추론이 가능한 언어이다.
변수
코틀린은 변수 선언 시 타입을 생략할 수 있다(타입 추론).
val answer = 42
다만 원한다면 타입을 명시할 수 있다.
val answer: Int = 42
초기화 식을 사용하지 않고 변수를 선언할 때는 타입을 반드시 명시해야 한다.
val answer: Int //val answer (X)
answer = 42
변경 가능한 함수와 변경 불가능한 함수
val
value : 변경 불가능한(immutable) 참조를 저장하는 변수이다. 초기화 이후 재대입이 불가능하다. 자바의 final
에 대응
var
variable : 변경 가능한(mutable) 참조를 저장하는 변수이다. 재대입이 가능하다. 자바의 일반 변수에 대응
기본적으로 모든 변수를 val
키워드로 선언하고 나중에 꼭 필요할 때 var
로 변경하는 것이 좋다. 변경 불가능한 참조와 변경 불가능한 객체를 부수 효과(Side-effect : 함수의 실행으로 인해 함수 외부가 영향을 받는 것)가 없는 함수와 조합해 사용하면 코드가 함수형 코드에 가까워진다.
val 변수는 단 한번만 초기화돼야 한다. 하지만 어떤 블록이 실행될 때 컴파일러가 오직 한 초기화 문장만이 실행됨을 확인할 수 있으면 조건에 따라 val 값을 다른 여러 값으로 초기화할 수 있다.
val message: String
if(canPerformOperation()) {
message = "Success"
//Do Operation
else {
message = "Failed"
}
val 참조 자체는 불변이더라도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있다.
val languages = mutableListOf("Java")
languages.add("Kotlin")
var 키워드는 변수의 값을 변경할 수 있지만 변수의 타입은 고정돼 있다.
var answer = 42
answer = "No answer" //Compile error!!
컴파일러는 변수 선언 시점의 초기화 식으로 변수의 타입을 추론하며, 이후 변수 재대입은 이미 추론한 변수의 타입으로 대입문의 타입을 검사한다. 다른 타입의 값을 저장하고 싶으면 형변환을 해야 한다.
문자열 템플릿
문자열 템플릿은 자바의 문자열 접합 연산(+) 과 동일한 기능을 하지만 더 간결하고 효율적으로 사용할 수 있다. 문자열 리터럴이 필요한 곳에 변수를 넣되 변수 앞에 $를 추가하여 사용할 수 있다.
fun main(args: Array<String>) {
val name = if (args.size > 0) args[0] else "Kotlin"
println("Hello, $name!") //String template
}
복잡한 식은 중괄호로 둘러싸 문자열 템플릿 안에 넣을 수 있다.
println("Hello, ${args[0]}!")
한글을 문자열 템플릿으로 사용할 경우 주의할 점
코틀린에서는 자바와 마찬가지로 한글을 포함한 모든 letter로 분류하는 문자는 변수명으로 사용 가능하다. 이로 인해 문자열 템플릿 사용 시 오해가 생길 수 있다. 예를 들어 "$name님 반가워요!"
의 경우 문자열 템플릿이 한글을 한꺼번에 식별자로 인식해서 Unresolved reference 컴파일 오류를 일으킬 수 있다. 이런 오해를 방지하려면 변수 이름을 중괄호로 감싸는 방법이 있다.
문자열 리터럴은 중복할 수 있다.
println("a ${"b $c"}")