fun increment(n: Int): Int {
return n++ // 컴파일 오류 발생
}
파라미터 앞에 val, var를 표시할 수 없음
코틀린은 값에 의한 호출(call by value) 의미론을 사용
타입 지정을 생략해도 되는 변수와 달리 파라미터에는 항상 타입을 지정해야함
반환 타입은 함수 파라미터에서 추론이 가능한데도 명시해야함
위치 기반 인자와 이름 붙은 인자
오버로딩과 디폴드 값
fun readInt(radix: Int = 10) = readLine()!!.toInt(radix)vararg
fun printSorted(vararg items: Int) {
items.sort() //items는 IntArray
println(items.sontentToString())
}
fun main() {
printSorted(6, 2, 10, 1) //[1, 2, 6, 10]
}
val numbers = intArraysOf(6, 2, 10, 1)
printSorted(*numbers)
printSorted(numbers) //ERRORprintSorted(6, 1, *intArrayOf(3, 8), 2)함수 영역과 가시성
코틀린 최상위 함수나 지역 함수를 JVM 플랫폼에서 컴파일 할 수 있는 이유.
JVM이 볼 때 최상위 main() 함수는 코틀린 파일마다 자동으로 만들어지는 특별한 파사드 클래스의 정적 멤버라는 사실을 설명했다. 지역 함수의 경우에도 코틀린 컴파일러는 (최상위 함수와) 비슷한 트릭을 써서 지역 함수를 정의하며, 지역 함수를 둘러싼 영역의 변수나 파라미터 목록 등의 문맥을 포획해주는 특별한 클래스(이를 자바의 지역 클래스와 비교할 수 있다)를 선언한다. 이 말은 지역 함수를 호출할 때마다 이런 특별한 클래스 객체를 생성하는 부가 비용이 든다는 뜻이다.
import foo.readInt as fooReadInt
import bar.readInt as barReadInt
fun max(a: Int, b: Int) = if (a > b) a else bval chars = 'a'..'h'
val twoDigits = 10..99
val zero2One = 0.0..1.0num in 10..99 // num >= 10 && num <= 99
num !in 10..99 // == !(num in 10..99)val twoDigits = 10 until 100 // 10..99와 같음5 in 10 downTo 1
5 in 1 downTo 10 // fasle 빈배열
1..10 step 3 // 1, 4, 7, 10
15 downTo 8 step 2 //15, 13, 11, 9"Hello, World".substring(1..4) //ello
"Hello, World".substring(1 until 4) //ell
"Hello, World".substring(1, 4) //ell
IntArray(10) { it*it }.sliceArray(2..5) //4, 9, 16, 25
IntArray(10) { it*it }.sliceArray(2 until 5) // 4, 9, 16val numbers = intArrayOf(3, 7, 2, 1)
val text = "Hello!"
println(2 in numbers) //true
println(9 !n numbers) //true
println(4 in numbers) //false
println('a' in text) //false
println('H' in text) //truefun hexDigit(n: Int): Char {
when {
n in 0..9 -> return '0' + n
n in 10..15 -> return 'A' + n -10
else -> return '?'
}
}코틀린의 모든 루프는 식이 아니고 문이기 때문에 어떤 값으로 평가되지 않으며 부수 효과를 발생시킬 수만 있음
while과 do-while 루프
for 루프와 이러터블
fun main() {
val a = IntArray(10) {it*it}
var sum = 0
for(x in a) {
sum += x
}
}
루프 제어 흐름 변경하기: break와 continue
내포된 루프와 레이블
fun indexOf(subarray: IntArray, array: IntArray): Int {
outerLoop@ for (i in array.indices) {
for (j in subarray.indices) {
if(subarray[j] != array [i + j]) contitnue@outerLoop
}
return i
}
return -1
}
꼬리 재귀 함수
fun readInt(default: Int) = try {
readLine()!!.toInt()
} catch (e: NumberFormatException) {
default
}