본문 바로가기
코틀린

코틀린(20) - 오버로딩, arguments, infix 함수

by 왈레 2022. 3. 23.

오버로딩

코틀린에서도 대부분의 언어에서 지원하는 오버로딩(not override) 지원한다.

// ex1) okey!
fun same (x:Int)
fun same (x:Int, text: String)
fun same (x:Int, y:Int)

// ex2) not okey!
fun same(x:Int, y:Int)
fun same(a:Int, b:Int)

// ex3) okey!
fun main(){
    read(7) // 숫자7 출력
    read("감사합니다") //감사합니다 출력
}

fun read(x: Int){
    println("숫자 $x 입니다")
}

fun read(x: String){
	println(x)  
}

 

ex3 실행해보면 함수 이름은 같지만 자료형을 구분하여 함수가 매칭되어 실행되는 것을 있다.

 

arguments (default, named, variable number of arguments=vararg)

파러미터를 받아야하는 함수이지만 별다른 파러미터가 없더라도 기본값으로 동작해야 한다면 어떻게 해야할까?

이때는 default arguments를 사용한다

1. default arguments

fun main(){
    deliveryItem("짬뽕")
    deliveryItem("책",3)
    deliveryItem("노트북", 30, "학교")
}

fun deliveryItem(name: String, count: Int = 1, destination: String = "집"){
	println("${name}, ${count}개를 ${destination}에 배달하였습니다")
}

*출력값
짬뽕, 1개를 집에 배달하였습니다
책, 3개를 집에 배달하였습니다
노트북, 30개를 학교에 배달하였습니다

 

패러미터가 채워진 경우에는 입력받은 패러미터를 사용하여 출력되지만, 패러미터가 없다면 지정된 기본값으로 출력된다. (참고로 패러미터의 기본값 지정은 맨오른쪽부터 차례대로 왼쪽으로 기입해주야 한다)

 

2. named arguments

패러미터의 순서와 관계없이 패러미터의 이름을 사용하여 직접 패러미터의 값을 할당하는 기능이다.

fun main(){
    deliveryItem("짬뽕")
    deliveryItem("책",3)
    deliveryItem("노트북", 30, "학교")
    deliveryItem("선물", destination = "친구집")
}

fun deliveryItem(name: String, count: Int = 1, destination: String = "집"){
	println("${name}, ${count}개를 ${destination}에 배달하였습니다")
}

*출력값
짬뽕, 1개를 집에 배달하였습니다
책, 3개를 집에 배달하였습니다
노트북, 30개를 학교에 배달하였습니다
선물, 1개를 친구집에 배달하였습니다

 

3. variable umber of arguments (vararg)

vararg같은 자료형을 개수에 상관없이 패러미터로 받고 싶을 사용한다.

vararg 붙은 패러미터는 마치 배열처럼 for문으로 사용가능하다.

fun main(){
    sum(1,2,3,4)
}

fun sum(vararg numbers: Int){
    var sum = 0
    for(n in numbers){ // vararg가 붙은 패러미터는 마치 배열처럼 for문으로 참조가능
        sum += n
    }

    println(sum) // 10 출력!
}

 

vararg는 개수가 지정되는 않은 패러미터라는 특징이 있으므로 다른 패러미터와 같이(2개이상의 패러미터) 쓸때는 반드시 맨마지막에 위치해야한다.

fun sample(text: String, vararg x:Int)

 

infix 함수

infix 함수는 마치 연산자처럼 있는 함수이다(적용필요할듯)

fun main(){
    println(6 multiply 4) // 24출력
    println(6.multiply(4)) // 24출력
    // 그냥 일반적인 클래스의 함수처럼 사용할 수도 있다!
}

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

 

참고로 class에서 infix 함수를 선언할 때에는 적용할 클래스가 자기 자신이므로 클래스의 이름은 쓰지않는다.

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

 

코틀린은 많은 언어들이 지원하는 함수의 다양한 편의기능을 거의 대부분 가지고 있다.

이를 이용하면 더욱 편리한 코딩이 가능하다.

댓글