본문 바로가기

Kotlin/Basic

Kotlin - 더 많은 함수 기능들

내가 코틀린을 배우면서 코틀린에 있어 특별하다고 생각되는 부분들 또는 메모해두어야 할 점들을 여기에 적어놓으려고 한다.

Overloading

코틀린에서는 overloading을 지원한다. 이는 같은 스코프 내에서 서로 다른 파라미터 셋을 가지는 이름이 같은 함수들을 사용할 수 있다는 것인데. 아래 예시를 보자.

 

예시

 

fun main() {
	println(add(1, 2))
    println(add("a", "b"))
}

fun add (a: Int, b: Int): Int {
    println("int added...")
    return a + b
}

fun add (a: String, b: String): String {
    println("string added...")
    return a + b
}

 

출력

 

int added...
3
string added...
ab

 

두 함수 모두 이름이 add 이지만, 어떤 파라미터가 들어가느냐에 따라서 어떤 함수가 실행될지가 결정된다. 이를 overloading이라고 한다. 이름이 같더라도 파라미터의 자료형이 다르거나, 파라미터의 갯수가 다르다면 서로 다른 함수로 동작할 수 있다. 다만, 파라미터의 자료형과 개수가 같다면 함수에서 정의한 파라미터의 이름과 상관 없이 Conflicting overloads 에러로 인해 오버로딩을 할 수 없다.

 

Argument를 다루는 법

파라미터 지정

아래 예시를 보자.

 

예시

 

fun main() {
	deliverItem("book")
    deliverItem("note", 3)
    deliverItem("present", 2, "Seoul")
}

fun deliverItem (name: String, count: Int = 1, destination: String = "집") {
    println("${count} ${name} delivered to ${destination}.")
}

 

출력

 

1 book delivered to 집.
3 note delivered to 집.
2 present delivered to Seoul.

 

위의 경우 deliverItem 함수의 count와 destination 파라미터들에는 기본값들이 설정되어 있다. 그러나 count만을 기본값으로 사용하고 destination의 값을 바꿔주고 싶을 때에는 어떻게 해야할까? 이 경우에는 파라미터에 어떤 값을 다음과 같이 대응시키는 방식으로 count 값을 지정하는 것을 피하고 파라미터를 바꿀 수 있다.

 

예시

 

fun main() {
	deliverItem("book", destination="Seoul")
}

fun deliverItem (name: String, count: Int = 1, destination: String = "집") {
    println("${count} ${name} delivered to ${destination}.")
}

 

출력

 

1 book delivered to Seoul.

 

위와 같은 방식을 사용하면 파라미터가 많은 함수들에 유용하게 사용될 수 있다.

 

Vararg

만약 파라미터를 여러 개를 넘겨주고 싶을 때는 어떻게 해야할까? 단도직입적으로 vararg를 사용하면 된다. 아래 예시를 보자.

 

예시

 

fun main() {
    println(addNums(1, 5, 8, 5))
    println(addNums(1, 2, 3))
}

fun addNums(vararg numbers: Int): Int {
    var sum = 0
    for (n in numbers) {
        sum += n
    }
    return sum
}

 

출력

 

19
6

 

vararg를 사용함으로써 몇 개의 파라미터가 들어올 지 지정하지 않아도 위와 같이 여러 argument들을 받아와 사용할 수 있다. 이 경우 Iteration이 가능하여, for문 등을 사용하여 들어온 파라미터들을 사용할 수 있다.

 

또한, vararg는 파라미터의 개수가 지정되지 않으므로, 함수에서 다른 받아와야 할 파라미터들 이외에도 vararg로 파라미터들을 받아오고 싶을 때에는 파라미터 셋의 가장 마지막에 위치시켜야 한다. 예를 들어, 다음과 같이 작성하여야 한다.

 

예시

 

fun main() {
    family("Misun", "Hyungman", "Jjanggu", "Jjanga")
}

fun family(mum: String, dad: String, vararg children: String) {
   	println("${mum} is mum,")
    println("${dad} is dad,")
    for (c in children) {
        print("${c}, ")
    }
    println("are children")
}

 

출력

 

Misun is mum,
Hyungman is dad,
Jjanggu, Jjanga, are children

 

infix 함수

infix 키워드를 함수 앞에 붙이면 함수를 마치 연산자처럼 사용할 수 있게 해준다. 함수에서 this는 해당 함수를 불러오는 객체를 가리키게 된다. infix 함수를 선언하면 다음과 같이 두 가지 방식으로 함수를 사용할 수 있다.

 

예시

 

fun main() {
    println(6 multiply 4)
    println(6.multiply(4))
}

infix fun Int.multiply(x: Int): Int = this * x

 

출력

 

24
24

 

출처

https://www.youtube.com/playlist?list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN