함수 선언 문법
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")
댓글