노트/Java to Kotlin

함수

작성

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 를 적는다.
  • 배열을 가변 인자로 넘길 때는 앞에 * 를 붙인다.

요약

  1. 함수 선언은 접근지시어 fun 함수이름(파라미터): 반환타입 {} 이다.
  2. body 가 하나의 값이면 block 을 없앨 수 있고, block 이 없으면 반환 타입도 없앨 수 있다.
  3. default parameter 를 지원한다.
  4. 가변 인자에는 vararg 를 쓰고, 배열을 넘길 때는 * 를 붙인다.
  5. 함수는 클래스 안에도, 파일 최상단에도 둘 수 있고 한 파일에 여러 개 있어도 된다.