Welcome! Everything is fine.

[Kotlin] 8강. 코틀린에서 함수를 다루는 방법 본문

Kotlin

[Kotlin] 8강. 코틀린에서 함수를 다루는 방법

개발곰발 2023. 12. 12.
728x90

* 인프런 강의 - 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)을 듣고 정리한 내용입니다.

 

🔗 7강 내용

 

[Kotlin] 7강. 코틀린에서 예외를 다루는 방법

* 인프런 강의 - 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)을 듣고 정리한 내용입니다. 🔗 6강 내용 [Kotlin] 6강. 코틀린에서 반복문을 다루는 방법 * 인프런 강의 - 자바 개발자를 위

3uomlkh.tistory.com

8강. 코틀린에서 함수를 다루는 방법

 함수 선언 문법

코틀린에서는 if-else가 하나의 Expression이라고 했다. 그럼 다음과 같이 return을 앞으로 빼서 전체가 하나의 결과값이 되도록 할 수 있다.

fun max(a: Int, b: Int): Int {
  return if (a > b) {
    a
  } else {
    b
  }
}

 

여기서 더 간단하게 만들 수 있다. 함수가 하나의 결과값이면 block 대신 = 기호를 사용할 수 있기 때문에 = 을 사용하고, 동시에 return도 뺄 수 있다. 그리고 if-else문을 한 줄로 적으면 다음과 같이 한 줄의 코드가 된다.

fun max(a: Int, b: Int) = if (a > b) a else b

defualt parameter

코틀린에서도 자바와 동일하게 오버로딩 기능이 있지만

코틀린에서는 함수 파라미터에 기본 값을 넣어줄 수 있다.

num과 useNewLine에서 자주 쓰이는 기본 값이 있다면 다음과 같이 미리 어떤 값을 넣어둘 수 있는 것이다.

fun repeat(
  str: String,
  num: Int = 3,
  useNewLine: Boolean = true
) {
  for (i in 1..num) {
    if (useNewLine) {
      println(str)
    } else {
      print(str)
    }  
  }
}

 

이렇게 하면 num과 useNewLine에 값을 넣지 않더라도 3과 true가 기본 값으로 들어간다.

그런데 num은 3을 넣되, useNewLine에는 false를 넣고 싶다면 어떻게 해야할까? 물론 다음과 같이 할 수 있다.

repeat("Hello World", 3, false)

그렇지만..이왕 defualt parameter를 넣었기 때문에 3을 반복하고 싶지는 않다면 어떨까?

named argument(parameter)

그렇다면 다음과 같이 함수를 호출하는 쪽에서 어떤 파라미터에 특정 값을 넣을 것이라고 명시할 수 있다!

repeat("Hello World", useNewLine = false)

 

이렇게 하면 builder를 직접 만들지 않고도 builder의 장점을 가지게 된다.

다시말해 동일한 타입이 연속적으로 존재할 때 값을 헷갈리지 않고 넣을 수 있다는 것이다.

단, named argument는 코틀린에서 자바 함수를 가져다 쓸 때는 사용할 수 없다는 것에 주의해야한다.

코틀린에서 자바 코드를 쓸 때 JVM상에서 자바가 바이트 코드로 변환됐을 때 파라미터 이름을 보존하고있지 않아서 코틀린에서는 그 이름을 통해 가져오는 named argument를 사용할 수 없다.

같은 타입의 여러 파라미터 받기

자바 : 타입 ...을 쓰면 자바에서는 가변인자를 쓰는구나!라고 이해, 호출할 때는 배열을 직접 넣거나, 콤마를 이용해 여러 파라미터를 넣었다.

코틀린 : 제일 앞에 vararg를 적어줘야 한다. 호출할 때 배열을 바로 넣는 대신 앞에 스프레드 연산자(*)를 붙여줘야 한다.

fun printAll(vararg strings: String) {
  for (str in strings) {
    println(str)
  }
}
printAll("A", "B", "C") // 콤마(,)로 구분하는 방법

val array = arrayOf("A", "B", "C") // 배열을 넣는 방법
printAll(*array) // 배열을 가변인자에 넣어 줄 때 앞에 별표