ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린] 함수
    코틀린 2022. 3. 6. 23:27

    1. 함수 생성

    fun greet() = "Hello"
    println(greet) // hello 출력

    코틀린에서 함수는 fun 함수이름, 함수 파라미터, 함수 본문으로 구성된다. 함수 본문은 =이나 {}로 구성 할 수 있다.

     

    리턴타입과 타입 추론

    단일표현식이고 {} 블록으로 구현된 함수가 아닌 경우 리턴 타입 추론이 발생한다.

    직접 리턴 타입을 명시할 때는 아래와 같이 할 수 있다.

    fun hello(): String = "hello"

     

    모든 함수는 표현식

    코틀린에서 모든 함수는 표현식이다. 만약 아무것도 리턴할 것이 없으면 Unit 타입을 리턴 타입으로 추론한다. 

    fun unitFunction() {
    }
    println("result of unit function: ${unitFunction()}")
    //출력: result of unit function: kotlin.Unit

     

    파라미터 정의하기

    함수 파라미터는 반드시 타입을 붙여주어야한다. 코틀린에서 함수나 메소드의 파라미터 값은 바꿀 수 없다.

    fun functionHasParameter(arg: String): String {
        return arg
    }
    
    fun functionChangeParameter(arg: String): String {
        arg = "abcd" // val cannot be reassigned 컴파일 에러 발생
    }

     

    블록바디로 만든 함수

    {} 로 정의한 함수는 반드시 리턴 타입을 정의해주어야한다. 정의하지 않으면 Unit으로 추론된다.

    = 과 {} 을 동시에 사용할 때는 조심해야한다. = 이후 {}으로 바디를 구현하면 익명 함수를 리턴하는 함수를 구현하는 것이다.

    fun notReally() = {2}
    println(notReally()) // () -> kotlin.Int
    println(notReally()()) // 2

     

    2. 기본 인자와 명시적 인자

    기본인자

    fun greet(name: String, msg: String = "Hello"): String = "$msg $name"
    println("기본 아규먼트" + greet("park")) // 출력: 기본 아규먼트Hello park
    println("기본 아규먼트 2" + greet("park", " Hi")) // 출력: 기본 아규먼트 2 Hi park

    코틀린에서는 인자 타입 명시 이후에 기본 값을 줄 수 있다.

    기본인자는 표현식으로 줄 수도 있다.

     

    명시적 아규먼트

    fun createItem(name: String, quantity: Int, price: Int, discountRate: Double) {
        println("name: $name quantity: $quantity price: $price discountRate: $discountRate")
    }
    println("명시적 아규먼트")
    createItem("Apple", 100, 1000, 0.0)
    createItem(name="Apple", quantity = 100, price=1000, discountRate=0.0)
    createItem("Apple", 100, discountRate = 0.0, price=1000)
    
    // 출력
    명시적 아규먼트
    name: Apple quantity: 100 price: 1000 discountRate: 0.0
    name: Apple quantity: 100 price: 1000 discountRate: 0.0
    name: Apple quantity: 100 price: 1000 discountRate: 0.0

    코틀린에서는 함수를 호출할때 아규먼트 이름을 직접 정해서 값을 호출할 수도 있다. 

     

    3. 다중 인자와 스프레드

    여러 개의 인자

    fun max1(numbers: IntArray): Int {
        var maximum = Int.MIN_VALUE
        for(number in numbers) {
            maximum = if(number > maximum) number else maximum
        }
        return maximum
    }
    println("다중 인자")
    println(max1(intArrayOf(1, 2, 3, 4, 5)))
    
    fun max(vararg numbers: Int): Int {
        var maximum = Int.MIN_VALUE
        for(number in numbers) {
            maximum = if(number > maximum) number else maximum
        }
        return maximum
    }
    println("다중인자")
    println(max(1, 2, 3, 4, 5))
    
    // 출력
    다중인자
    5
    다중인자
    5

    위의 코드는 여러개의 숫자에서 가장 큰 값을 찾는 함수를 두 가지 방법으로 구현한 것이다.

    vararg를 사용하면 여러 개의 인자를 받을 수 있다.

    • vararg는 함수당 한 개만 사용할 수 있다.
    • vararg는 마지막에 두는 것이 좋다. 마지막에 위치하지 않으면 명시적 인자를 사용해야 한다.
    • 마지막 파라미터가 람다 표현식일 경우 마지막 파라미터 바로 전에 둔다.

     

    스프레드 연산자

    vararg가 여러 개의 파라미터를 받을 수 있는 특징이 있지만 배열을 넣으면 에러가 발생한다.

    이럴때는 *를 이용하면 배열의 원소를 개별 인자로 늘려 넘겨줄 수 있다.

    println(max(intArrayOf(1, 2, 3, 4, 5)))  // 에러발생
    println(max(*intArrayOf(1, 2, 3, 4, 5))) // 출력: 5
    println(max(*listOf(1,2,3,4,5).toIntArray())) // 출력: 5

    리스트를 사용할때는 배열로 변경해서 스프레드 연산자를 사용해야한다.

     

    4. 구조분해

    구조분해: 객체에서 값을 추출해 변수로 만드는 작업

    코틀린의 구조 분해는 위치를 기반으로 해서 이뤄진다.

    fun getName() = Triple("Park", "Kim", "Son")
    val result = getName()
    println("${result.first} ${result.second} ${result.third}") // Park Kim Son
    
    val (park, kim, son) = getName()
    println("$park $kim $son") // Park Kim Son
    
    val (a12, _, c1) = getName()
    println("$a12 $c1") // Park Son
    
    val (a1, b1) = getName()
    println("$a1 $b1") // Park Kim

    받고싶지 않은 변수는 _ 로 넘길 수도 있다.

     

    참고

    다재다능 코틀린 프로그래밍 3장

    '코틀린' 카테고리의 다른 글

    [코틀린] 클래스와 상속  (0) 2022.03.13
    [코틀린] 객체와 클래스  (0) 2022.03.13
    [코틀린] 타입 안정성  (0) 2022.03.07
    [코틀린] 컬렉션  (0) 2022.03.07
    [코틀린] 외부 반복과 아규먼트 매칭  (0) 2022.03.07

    댓글

Designed by Tistory.