- 파라미터 타입은 타입 추론이 불가능하므로 무조건 작성
fun add(src: Int, target: Int): Int {
return src + target
}
- 코틀린은 자바와 달리 도달할 수 없는 코드를 작성해도 오류가 발생하지 않는다.
- 불필요한 코드이기 때문에 IDE에서 Unreachable code라고 알려준다.
fun add(src: Int, target: Int): Int {
return src + target
println("Hello World!")
}
- 함수의 파라미터는 무조건 불변이기 때문에 아래와 같이 값을 변경할 수 없다.
fun add(src: Int, target: Int): Int {
src = 5 // error
src++ // error
return src + target
}
- 반환 타입을 생략할 수 있다.
- 생략 가능한 두 가지 경우
- 리턴 타입이 Unit. java) void
- 식이 본문인 함수. 단일 식으로 구현할 수 있다면 중괄호 생략이 가능
- 주의할 점으로
fun add(src: Int, target: Int) = {src + target}
괄호 안에 =을 붙일 경우 람다식으로 판단하기 때문에 원하는 결과가 나올 수 없다.
fun add(src: Int, target: Int): Int = src + target
fun add(src: Int, target: Int) = src + target
fun hello(): Unit = println("Hello World!")
fun hello() = println("Hello World!")
- 파라미터 이름순으로 말고 파라미터 이름을 이용한 대입식을 넣어 값을 전달할 수 있다.
fun main() {
println(add(2, 3)) // positional argument
println(add(target = 3, src = 2)) // named argument
}
fun add(src: Int, target: Int): Int {
return src + target
}
- 컴파일러는 아래와 같은 규칙으로 호출할 함수를 결정한다.
- 파라미터의 개수와 타입을 기준으로 호출할 수 있는 모든 함수를 찾는다.
- 덜 구체적인 함수를 제외시킴. 덜 추상화된 타입으로 지정
- 후보가 하나로 압축되면 호출. 두 개 이상이면 에러
- 인자의 개수가 정해지지 않았을 경우 사용할 수 있다.
- 스프레드 연산자인
*
를 사용하면 가변 인자 대신 넘길 수 있다.
- 맨 마지막 파라미터로 전달가능하고 그게 아니라면 이름을 붙여 인자로 전달할 수 있다.
fun main() {
sum(1, 2, 3, 4, 5)
sum(*intArrayOf(1, 2, 3, 4, 5))
sum(*intArrayOf(1, 2, 3, 4, 5), 6)
}
fun sum(vararg nums: Int): Int {
return nums.sum()
}
fun main() {
hello()
}
fun hello(message: String = "Hello World!") = println(message)
- public : default
- private : 함수가 정의된 파일 내에서만 사용 가능
- internal : 함수가 적용된 모듈 내부에서만 함수 사용 가능
- if문을 식으로 사용 가능. 3항 연산자를 사용할 필요가 없다.
fun main() {
equal(1, 1)
}
fun equal(a: Int, b: Int) = if (a == b) true else false
- return문은 존재하지 않는 값을 뜻하는 Nothing이라는 특별한 타입의 값으로 간주한다.
- Nothing 타입은 프로그램의 순차적 제어 흐름이 그 부분에서 끝나되 어떤 잘 정의된 값에 도달하지 못한다는 뜻이다.
- 모든 코틀린 타입의 하위 타입으로 간주하기 때문에 아래와 같이 사용해도 에러가 발생하지 않는다.
fun main() {
equal(1, 1)
}
fun equal(a: Int, b: Int): Boolean {
if (a == b) true else return false
return true
}
fun main() {
// 범위
'a'..'h'
10..99
15 in 10..99
15 !in 10..99
10 until 100
10 downTo 1
// 진행
1..10 step 3
10 downTo 1 step 3
// 연산
"Hello World!".substring(0..4)
IntArray(10) {it * it}.sliceArray(4..6)
}
- 비슷한 개념으로 자바의 switch가 있다. fall through라는 의미를 제공하고 명시적으로 break를 만날 때까지 모든 가지를 실행한다.
- when은 만족하는 가지만 실행하고 fall through 하지 않는다. 그 외에도 범위 검사, 상수가 아닌 임의의 식도 사용할 수 있다.
fun getGrade(n: Int): String {
return when (n) {
1 -> "1학년"
2 -> "2학년"
3 -> "3학년"
else -> "유급생"
}
}
- 코틀린 문자열에 대해서 각 문자에 대해서 루프를 직접 수행할 수 있다.
fun main() {
for (c in "Hello World!") {
// TODO
}
}
- return과 마찬가지로 Nothing 타입의 식으로 사용할 수 있다.
outerLoop@ for
, continue@outerLoop
loop@ while(true)
, break@loop
tailrec
를 붙이게 되면 컴파일러가 재귀 함수를 비재귀적인 코드로 자동으로 변환해줘서 성능 이점을 얻을 수 있다.
- 이러한 변환을 적용하려면 재귀 호출한 다음 함수가 아무 동작을 하지 않아야 한다.
- 만약 꼬리재귀가 아니라면 컴파일러는 경고를 표시하고 일반 재귀 함수로 컴파일한다.