본문 바로가기
Java & Kotlin/Kotlin

[Kotlin] 함수를 다루는 방법

by heekng 2022. 7. 6.
반응형

함수를 다루는 방법

함수 선언 문법

Java

public int max(int a, int b) {
    if (a > b) {
        return a;
    }
    return b;
}

Kotlin

fun max(a: Int, b: Int): Int =
    if (a > b) {
        a
    } else {
        b
    }

fun maxV2(a: Int, b: Int) = if (a > b) a else b
  • 함수의 문법은 Java와 다르다.
    • 접근지시어 fun 함수이름(파라미터): 반환타입 {}
  • body가 하나의 값으로 간주되는 경우 block을 없앨 수도 있고, block이 없다면 반환 타입을 없앨 수도 있다.
    • {}를 없애고 = 를 사용할 수 있다.
    • if else 문은 Expression이기 때문에 = 으로 대치 가능한 것.
  • public은 생략 가능하다.
  • 함수는 클래스 안에 있을수도, 파일 최상단에 있을 수도 있으며, 한 파일 안에 여러 함수들이 있을 수도 있다.

default parameters

Java

public void repeat(String str, int num, boolean useNewLine) {
    for (int i = 0; i < num; i++) {
        if (useNewLine) {
            System.out.println(str);
        } else {
            System.out.print(str);
        }
    }
}

public void repeat(String str, int num) {
    repeat(str, num, true);
}

public void repeat(String str) {
    repeat(str, 3, true);
}

Kotlin

fun repeat(str: String, num: Int = 3, useNewLine: Boolean = true) {
    for (i in 1..num) {
        if (useNewLine) {
            println(str)
        } else {
            print(str)
        }
    }
}
  • 인자에 = 를 사용하면 default parameter을 지정할 수 있다.
  • 밖에서 파라미터를 넣어주지 않는다면 기본값을 사용한다는 개념
  • 물론 코틀린은 자바와 동일하게 오버로딩이 가능하다.

named argument (parameter)

Kotlin

repeat("Hello world", useNewLine = false)

printNameAndGender(gender = "MALE", name = "heekng")
  • 매개변수 이름을 통해 인자를 직접 지정할 수 있다.
  • 지정되지 않은 매개변수는 기본값을 사용한다.
  • builder을 직접 마들지 않고 builder의 장점을 가질 수 있다!
  • 코틀린에서 자바 함수를 가져다 사용할 때는 named argument를 사용할 수 없다.
    • Java 코드가 JVM 위에서 byte로 변환되는 과정에서 parameter 이름을 보존하고 있지 않기 때문에 사용이 불가능하다.

같은 타입의 여러 파라미터 받기 (가변인자)

Java

public static void printAll(String... strings) {
    for (String string : strings) {
        System.out.println(string);
    }
}

Kotlin

fun main() {
    printAll("A", "B", "C")

    val array = arrayOf("A", "B", "C")
    printAll(*array)
}

fun printAll(vararg strings: String) {
    for (str in strings) {
        println(str)
    }
}
  • 가변인자는 vararg를 이용한다.
  • printAll("A", "B", "C") 처럼 사용할 때에는 그냥 사용해도 된다.
  • 배열을 사용한다면 printAll(*array)와 같이 배열명 앞에 *(spread 연산자)를 붙임으로서 사용할 수 있다.
    • * (spread 연산자): 배열 안에 있는 것들을 마치 그냥 , 을 쓰는 것처럼 꺼내준다.
반응형