8장 코틀린에서 함수를 다루는 방법

2024. 1. 14. 00:56kotlin/문법

해당 내용은 인프런 최태현님의 자바 개발자를 위한 코틀린 입문 강의에서 발췌한 내용입니다.

목차

  1. 함수 선언 방법
  2. default parameter
  3. named argument (parameter)
  4. 같은 타입의 여러 파라미터 받기(가변인자)

함수 선언 방법

두 정수를 받아 더 큰 정수를 반환하는 예제

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) {
        return a
    }
    return b
}
               ⏬️ (expression 적용)
===================================================================
fun max(a: Int, b: Int): Int {
    return if ( a > b) {
        a
    } else {
        b
    }

}
              ⏬️ (중괄호 삭제)
===================================================================
fun max(a: Int, b: Int): Int =
    if ( a > b) {
        a
    } else {
        b
    }
// → 함수가 하나의 결과값이면 block 대신 = 사용가능!

              ⏬️ (반환타입 및 중괄호 삭제)
===================================================================
fun max(a: Int, b: Int) = if (a > b) a else b

// → 반환 타입을 생략가능한 이유는 =을 사용했기 때문이다. 즉, =을 사용하는 경우 반환 타입생략 가능!
// block을 사용하는 경우에는 반환 타입이 Unit이 아니라면 명시적으로 타입을 작성해줘야한다.

default parameter

주어진 문자열을 N번 출력하는 예제

JAVA

public void repeat(String str, int num, boolean useNewLine) {
    for (int i=1; i<=num; i++) {
        if (useNewLine) {
            System.out.println(str);
        } else {
            System.out.println(str);
        }
    }
}
// 만약 많은 코드에서 useNewLine에 true를 사용한다면?? 자바에서는 오버로딩 활용!
              ⏬️ (오버로딩 사용)
===================================================================

public void reapeat(String str, int num) {
    repeat(str, num, true);
}
              ⏬️ (한번 더 오버로딩 사용)
===================================================================

public void reapeat(String str, int num) {
    repeat(str, 3, true);
}
// 중복이 너무 많다... ㅠㅠ 메소드를 3개나 만들어야하나!?

Kotlin

fun main() {
    repeat("Hello World")
    repeat("Hello World", 3, true)
}
// 밖에서 파라미터를 넣어주지 않으면 기본값을 사용하자!
fun repeat(str: String, num: Int = 3, useNewLine: Boolean = true) {
    for (i in 1..num) {
        if(useNewLine) {
            println(str)
        } else {
            print(str)
        }
    }
}
// 그런데,, repeat을 호출할 때 num은 그대로 3을 쓰고싶고 useNewLine은 false를 
// 쓰고 싶은데?

named argument

Kotlin

fun main() {
    repeat("Hello World")
    repeat("Hello World", 3, true)
    repeat("Hello Wold", useNewLine = false) // named argument적용!
}
// 밖에서 파라미터를 넣어주지 않으면 기본값을 사용하자!
fun repeat(str: String, num: Int = 3, useNewLine: Boolean = true) {
    for (i in 1..num) {
        if(useNewLine) {
            println(str)
        } else {
            print(str)
        }
    }
}
// → 매개변수 이름을 통해 직접 지정 지정되지 않은 매개변수는 기본값 사용!
// builder를 만들지 않고 builder의 장점을 가질 수 있다!!
// Ex) repeat("Hello World", num = 4, useNewLine = false)
  • kotlin에서 Java 함수를 가져다 사용할 때는 named argument를 사용할 수 없다!
    • 이유는 Kotlin에서 java코드를 쓸 때 JVM 상에서 Java가 바이트 코드로 변환됐을 때
      parameter 이름을 보존하고 있지 않다 보니까 사용하지 못한다!

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

문자열 N개 받아 출력하는 예제

JAVA

public main() {
    String[] array = new String[]{"A", "B", "C"};
    printAll(array);

    printAll("A", "B", "C");
}
public void printAll(String... strings) {
    for (String str : strings) {
        System.out.println(str);
    }
}

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)
    }
}

정리하기

- 함수의 문법은 Java와 다른다!
- body가 하나의 값으로 간주되는 경우 block을 없앨 수도 있고, block이 없다면 반환타입을 없앨 수도 있다.
Ex) fun max(a: Int, b: Int): Int = if(a > b) a else b
    fun max(a: Int, b: Int) = if (a > b) a else b
- 함수 파라미터에 default parameter라 해서 기본 값을 설정해줄 수 있다.
- 함수를 호출할 때 특정 파라미터를 지정해서 넣어줄 수 있다. ( builder를 쓰는듯한..?)
- 가변인자에는 vararg 키워드를 사용하며, 가변인자 함수를 배열과 호출할 때는 *를 붙여주어야한다.