본문 바로가기
코틀린 문법

15. 함수의 argument를 다루는 방법과 infix 함수

by 농농씨 2023. 5. 14.

참조:유튜브 디모의 코틀린

코드테스트사이트:play.kotlinlang.org

*맥북 탭 이동 단축키:command+shift+{/}

 

//함수를 더 다양한 방법으로 사용할 수 있는 여러 기능들 알아보자
//overloading(overriding과 혼돈 유의)
//:같은 scope안에서 같은 이름의 함수를 여러 개 만들 수 있는 기능
// 함수 이름이 같더라도 패러미터의 자료형이 다르거나 패러미터의 개수가 다르면
// 서로 다른 함수로 동작할 수 있음
// 다만, 패러미터의 이름만 다르게 붙고, 자료형과 개수가 동일하다면
//  ex.fun same(x:Int, y:Int)
//     fun same(a:Int, b:Int)

// 오버로딩을 할 수 없다!


fun main(){
    read(7)
    read("감사합니다")
    //함수 이름은 같지만 자료형을 구분하여 함수가 매칭되어 실행됨 
}

fun read(x: Int){//함수 만들고 패러미터로 int값 받고
    println("숫자 $x 입니다")//문자열 출력하게 함
}

fun read(x: String){//함수 이름 같고 패러미터가 이름은 같은데 자료형다름
    println(x)//패러미터 그대로 출력
}

 

//만약
//패러미터를 받아야하는 함수이지만 별다른 패러미터가 없더라도
//기본값으로 동작해야한다면?
//이럴땐 default arguments를 사용한다

fun main(){
    deliveryItem("짬뽕")
    deliveryItem("책",3)
    deliveryItem("노트북",30,"학교")
    //패러미터를 채워진 경우에는 입력받은 패러미터 사용해서 출력되지만

    //패러미터가 없다면 지정된 기본값으로 출력됨 

   
}

fun deliveryItem(name: String,count:Int=1,destination:String="집"){
    //함수 만들고 이름,개수,목적지 받음, equal사용해서
    //개수패러미터에 숫자 1 넣어주고 목적지패러미터는 문자열"집"넣어줌
    println("${name},${count}개를 ${destination}에 배달하였습니다")
}


//만약 개수는 기본으로 하고 이름이랑 목적지만 넣고싶다면?
//가운데를 비우면 동작하지 않음!
//이때 쓰는 것이 named arguments~
//named arguments
//:패러미터의 순서와 관계없이 패러미터의 이름을 사용하여 직접 패러미터의
// 값을 할당하는 기능 


fun main(){
    deliveryItem("선물",destination="친구집")
    //문자열 "선물":'이게 첫 패러미터니까 name이겠군'
    //equal을 사용하여 destination이 지정된
    //"친구집"이라는 문자열은 해당 패러미터로 할당됨!

    //중간에 있는 개수(count)는 기본값인 1로 출력되고 나머지 두 패러미터만 할당되어 실행되게 됨!    
}

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

 


//variable number of arguments(vararg)
//:같은 자료형을 개수에 상관없이 패러미터로 받고 싶을 때 사용
fun main(){
    
    sum(1,2,3,4)
    //실행해보면 모든 숫자의 합인 10이 출력됨
}

fun sum(vararg numbers: Int){
    //새로 함수 만들고 패러미터에서 vararg가 붙은 int값 받음
    //vararg가 붙은 패러미터는 마치 '배열'처럼 for문으로
    //참조할 수 있음!
    var sum=0//숫자들을 더할 변수 sum을 0으로 초기화
    
    for (n in numbers)
    {
        sum+=n//sum에, 받아온 모든 정수값 더해봅시다
    }
    
    print(sum)//왜... println이 아닌거지
    
}
//vararg는 개수가 지정되지 않은 패러미터라는 특징이 있으므로
//다른 패러미터와 같이 쓸 때는 반드시 맨 마지막에 위치해야함!!!!
//주의!
// ex. fun sample(text:String, vararg x:Int)

 

 


//마지막으로,
//infix function:마치 연산자처럼 쓸 수 있는 함수

fun main(){
    
    println(6 multiply 4)
    //좌측의 6이 infix 함수가 적용되는 객체 자신, 즉 this에 해당
    //우측의 4가 패러미터 x에 해당(?흐음....왜?;)
    
    //그냥 일반적인 class의 함수처럼 사용할 수도 있음
    println(6.multiply(4))

    //실행해보면 윗줄이랑 결과 동일

    //참고로 class 안에서 infix함수를 선언할때는
    //적용할 클래스가 자기자신이므로 클래스 이름은 쓰지 않는다(뭔말이지)
    // ex.infix fun multiply(x:Int):Int=this*x
}

infix fun Int.multiply(x:Int):Int=this*x
//함수를 정의할 때 앞에 infix를 붙인 후
//함수 이름을 infix 함수가 적용될 자료형.이름으로 지정함
//여기서는 Int값에 사용할 multiply()함수를 만들어봅시다
//그리고 패러미터로 Int 값 x를 지정하고 반관값도 Int로 만듦
//그리고 this와 x를 곱해서 반환

//코틀린은 많은 언어들이 지원하는 함수의 다양한 편의기능을 대부분 가짐
//이를 이용하면 더욱 편리하다~