[Kotlin] Functions
Default Parameter Values and Named Arguments
Published in
6 min readOct 16, 2020
fun printMessage(message: String): Unit { // 1
println(message)
}fun printMessageWithPrefix(message: String, prefix: String = “Info”) { // 2
println(“[$prefix] $message”)
}fun sum(x: Int, y: Int): Int { // 3
return x + y
}fun multiply(x: Int, y: Int) = x * y // 4fun main() {
printMessage(“Hello”) // 5
printMessageWithPrefix(“Hello”, “Log”) // 6
printMessageWithPrefix(“Hello”) // 7
printMessageWithPrefix(prefix = “Log”, message = “Hello”) // 8
println(sum(1, 2)) // 9
}** 결과값 **
hello
[Log] hello
[Info] hello
[Log] Hello
3
- String 파라미터를 받고 Unit(다시말해 리턴값이 없는- void)을 리턴하는 simple function
- 두번째 파라미터를 받는 펑션. 두번째 파라미터는 필수가 아니고, 디폴트 값이
info
임. 리턴타입이 생략되었기 때문에 사실은Unit
- Integer를 리턴하는 펑션
- 정수를 리턴하는 단일 표현식 함수
- argument
hello
를 넘겨 첫번째 함수를 호출한다 - 파라미터가 2개인 펑션을 호출한다. (argument 2개 다 넘김)
- 6번과 같은 펑션을 호출하지만 두번째 파라미터는 생략했다. default value 는
info
가 사용되었다. - 이름이 있는 인수를 사용하고 인수 순서를 변경하여 동일한 함수를 호출한다.
Infix Function (중위 함수)
단일 매개 변수가있는 멤버 함수 및 확장은 중위 함수로 변환 될 수 있습니다.
fun main() {infix fun Int.times(str: String) = str.repeat(this) // 1
println(2 times “Bye “) // 2val pair = “Ferrari” to “Katrina” // 3
println(pair)infix fun String.onto(other: String) = Pair(this, other) // 4
val myPair = “McLaren” onto “Lucas”
println(myPair)val sophia = Person(“Sophia”)
val claudia = Person(“Claudia”)
sophia likes claudia // 5
}class Person(val name: String) {
val likedPeople = mutableListOf<Person>()
infix fun likes(other: Person) { likedPeople.add(other) } // 6
}** 결과값 **
ByeBye
(Ferrari, Katrina)
(McLaren, Lucas)
int
에 중위 확장 함수를 정의합니다.- 중위 함수를 호출합니다.
- 기존 라이브러리에서 중위함수
to
를 호출해Pair
를 만든다. onto
라고 부르는 내가 직접 만든to
(onto == to
)- 중위 표기법은 멤버 함수 (메소드)에서도 작동합니다.
- 포함하는 클래스가 첫번째 파라미터가 됩니다.
Operator Functions (연산자 펑션)
특정 기능은 연산자로 “업그레이드” 되어 해당 오퍼레이터 기호로 호출 할 수 있다.
operator fun Int.times(str: String) = str.repeat(this) // 1
println(2 * “Bye “) // 2operator fun String.get(range: IntRange) = substring(range) // 3
val str = “Always forgive your enemies; nothing annoys them so much.”
println(str[0..14])
- 연산 제어자 (클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드)
times()
의 연산 심볼은*
이다. 그래서2 * "bye"
를 사용해 함수를 호출할 수 있다.- 연산자 기능을 사용하면 쉽게 문자열 범위에 접근할 수 있다.
get()
연산자는 브라켓 접근 구문을 가능하게 한다.
Functions with vararg
Parameters
fun printAll(vararg messages: String) { // 1
for (m in messages) println(m)
}
printAll(“Hello”, “Hallo”, “Salut”, “Hola”, “你好”) // 2fun printAllWithPrefix(vararg messages: String, prefix: String) { // 3
for (m in messages) println(prefix + m)
}
printAllWithPrefix(
“Hello”, “Hallo”, “Salut”, “Hola”, “你好”,
prefix = “Greeting: “ // 4
)fun log(vararg entries: String) {
printAll(*entries) // 5
}
vararg
제어자는 한개의 파라미터를vararg
로 바꾼다.- 이를 통해 임의의 수의 String arguments 로 printAll을 호출할 수 있다.
- 이름이 있는 파라미터들 덕분에
vararg
ene뒤에 동일한 유형의 다른 파라미터를 추가할 수도 있다. 자바에서는 값을 전달할 방법이 없기 때문에 이렇게 쓸 수 없다. - 이름이 있는 파라미터를 사용해
vararg
와 별도로 접두사 값을 설정할 수 있다. - 런타임에서
vararg
는 배열일 뿐이다.vararg
매개변수로 전달하려면Array<String>
대신*entries
(String의 vararg)를 전달할 수 있는 특수 스프레드 연산자 *를 사용해야 한다.
출처
https://kotlinlang.org/docs/reference/functions.html#infix-notation