함수
작성
step 08(함수 다루기)에서 적은 것이다.
함수 선언
fun max(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
- 접근 지시어는 생략하면
public이다. - 반환 타입이 없으면 Java 의
void대신Unit인데, 생략할 수 있다.
if-else 는 expression 이다
fun maxV2(a: Int, b: Int): Int {
return if (a > b) {
a
} else {
b
}
}
body 가 값 하나면 block 과 반환 타입을 뺀다
fun maxV3(a: Int, b: Int) = if (a > b) a else b
함수 본문이 하나의 결과 값이면 = 로 적고 block 을 없앨 수 있다. block 이 없으면 반환 타입도 추론되므로 생략할 수 있다.
default parameter 와 named argument
fun repeat(
str: String,
num: Int = 3,
useNewLine: Boolean = false
) {
for (i in 1..num) {
if (useNewLine) {
println(str)
} else {
print(str)
}
}
}
repeat("Hello World", 3)
repeat("Hello World") // num 과 useNewLine 은 기본값
repeat("Hello World", useNewLine = true) // 이름을 지정해 특정 파라미터만 넘긴다
- 호출할 때 특정 파라미터를 이름으로 지정할 수 있다. builder 를 따로 만들지 않아도 builder 의 장점을 얻는다.
// builder 를 만들었다면 이렇게 썼을 것이다
// printNameAndGender()
// .name("준하")
// .gender("MALE")
printNameAndGender(name = "준하", gender = "MALE")
- Java 함수를 가져다 쓸 때는 named argument 를 쓸 수 없다. JVM 바이트코드로 바뀐 Java 코드는 파라미터 이름을 보존하지 않기 때문이다.
가변 인자
fun printAll(vararg string: String) {
for (str in string) {
println(str)
}
}
printAll("A", "B", "C")
val array = arrayOf("a", "b", "c")
printAll(*array) // * 는 spread operator
- 같은 타입의 파라미터를 여러 개 받을 때 Java 는 타입 뒤에
...을 쓰지만 Kotlin 은 파라미터 앞에vararg를 적는다. - 배열을 가변 인자로 넘길 때는 앞에
*를 붙인다.
요약
- 함수 선언은
접근지시어 fun 함수이름(파라미터): 반환타입 {}이다. - body 가 하나의 값이면 block 을 없앨 수 있고, block 이 없으면 반환 타입도 없앨 수 있다.
- default parameter 를 지원한다.
- 가변 인자에는
vararg를 쓰고, 배열을 넘길 때는*를 붙인다. - 함수는 클래스 안에도, 파일 최상단에도 둘 수 있고 한 파일에 여러 개 있어도 된다.