본문 바로가기
Kotlin

함수 문법

by oncerun 2022. 12. 4.
반응형

 

함수 선언 문법

 

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

 

return 대신 함수가 표현식을 리턴한다면 =을 통해 할당할 수 있다. 

 

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

 

자바에서는 오버 로딩을 통해 default 값을 세팅하고 매개변수를 숨길 수 있다. 

다만 자바에서는 이를 위해 오버로딩된 함수가 지속적으로 증가하게 된다. 

 

코틀린에서는 이를 하나의 함수로 정의할 수 있다.

fun repeat(str: String, num: Int = 3, userNewLine: Boolean = true) {
    
}

 

밖에서 파라미터를 넣어주지 않는다는 가정하에 기본값을 사용할 수 있다.

repeat("hi")

 

그런데 고민이 하나있다. 중간 매개변수는 기본값을 쓰고 세 번째 매개변수의 값을 변경해주고 싶으면 어떻게 해야 할까?

결국 3개의 매개변수 값을 전부 세팅해줘야 할까?

 

 

named argument

 

이러한 경우 name을 지정하여 매개변수를 전달할 수 있다.

repeat("hi")
repeat("hi", userNewLine = false)

 

이는 builder를 직접 만들지 않고 builder의 장점을 가질 수 있다. 

 

다만 코틀린에서 자바 함수를 가져다 사용하는 경우 named argument를 사용할 수 없다.

이는 코틀린에서 Java 코드를 쓸 때 JVM 상에서 java가 바이트 코드로 변환되었을 때 parameter 이름을 보존하지 않기 때문이다.

 

가변 인자

 

타입... 을 통해 자바에서는 가변 인자를 선언한다. 

그리고 우리는 배열을 통해 넣어주거나, 콤마를 통해 전달했다.

 

코틀린에서는 vararg라는 키워드를 사용한다.

fun printAll(vararg strings: String) {
    for (str in strings) {
        println(str)
    }
}

 

사용하는 입장에서는


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

 

배열을 넣어주는 경우에는 (*) 스프레드 연산자를 붙여주어야 하고 콤마로 사용하는 경우 바로 사용할 수 있다.

printAll("A", "B", "C")

 

반응형

'Kotlin' 카테고리의 다른 글

상속  (0) 2023.01.01
클래스  (0) 2022.12.05
예외 처리  (0) 2022.12.04
반복문  (0) 2022.12.04
조건문  (0) 2022.11.30

댓글