신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://memostack.tistory.com/

본 글은 Dmitry Jemerov, Svetlana Isakova의 "Kotlin in action" 책을 참고하여 작성한 글입니다.

 

본 글에서는 코틀린 메소드의 디폴트 값을 사용하는 방법과 @JvmOverloads 어노테이션에 대해 살펴볼 예정입니다. 그리고, 참고내용으로 인자명 사용하여 메소드를 호출하는 방법도 함께 살펴봅니다.

 

 

디폴트 값(default value)

자바와는 다르게 코틀린에는 디폴트 값이 있습니다. 해당 파라미터를 이용하면, 편리한 부분이 많습니다.

우선 사용 하지 않았을때 예제를 살펴봅시다.

 

fun main() {
    val list = listOf(1, 7, 3, 8)
    println(joinToString(list, "; ", "(", ")"))
}

fun<T> joinToString (collection: Collection<T>, separator: String, prefix: String, postfix: String): String {
    val result = StringBuilder(prefix)  // "("
    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)  // "; "
        result.append(element)  // element
    }
    result.append(postfix)  // ")"
    return result.toString()  // ( element; element; ... )
}
​

 

아래 예제는 collection안의 모든 원소들을 문자열 형태로 출력해주는 메소드입니다. (사실 코틀린에는 toString()을 자동으로 만들어주기 때문에 굳이 이런 메소드를 만들 필요는 없다.)

 

실행 결과

(1; 7; 3; 8)

 

보통 메소드를 만들때 위와같이 만들 것입니다. 하지만, 코틀린의 디폴트 파라미터를 사용하면, 사용할때 매우 편리합니다.

디폴트 값을 이용해서 다시 만들어 봅시다.

 

fun<T> joinToString (
    collection: Collection<T>,
    separator: String = ", ", // 인자를 넣지 않았을때, ", " 가 기본으로 들어가서 메소드가 호출된다.
    prefix: String = "", // 마찬가지로 ""(반 값)이 기본으로 들어가서 메소드가 호출된다.
    postfix: String = "" // 위와 동일
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}​

 

위와 같이 메소드 인자 뒤에 '=' 기호를 쓰고 그 뒤에 값을 쓰면, 그 값이 기본값으로 값이 설정되어 메소드가 호출 됩니다.

 

참고내용, 인자명을 이용한 함수 호출

인자의 개수가 많으면, 메소드를 호출할때 헷갈리는 경우가 많습니다.

코틀린에는 인자명을 이용해서, 호출하는 방법이 있습니다. (파이썬과 비슷하다.)

 

아래 예제를 살펴보면,

 

fun main() {
    val list = listOf(1, 7, 3, 8)
    println(joinToString(list, "; ", "(", ")"))  // 이 방법보단 아래 방법을 추천
    println(joinToString(list, separator="; ", prefix="(", postfix=")"))  // 명확하게 인자명을 입력하여 혼동을 막는다.
}
​

 

순서가 바뀌어도 상관없다. 다만, 하나라도 인자명을 이용해서 호출한 경우 나머지 인자의 이름들도 명시해줘야 합니다.

 

fun main() {
    val list = listOf(1, 7, 3, 8)
    println(joinToString(list)) // default parameter
    println(joinToString(list, "; "))
    println(joinToString(list, postfix = " !", prefix = "* ")) // 인자명을 이용하면, 순서에 관계없이 넣을 수 있다.
}
// 디폴트 값을 넣은 메소드
fun<T> joinToString (
    collection: Collection<T>,
    separator: String = ", ", // 인자를 넣지 않았을때, ", " 가 기본으로 들어가서 메소드가 호출된다.
    prefix: String = "", // 마찬가지로 ""(반 값)이 기본으로 들어가서 메소드가 호출된다.
    postfix: String = "" // 위와 동일
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}​

 

사실 자바에는 이런 디폴트 값을 넣는 메소드 기능이 없습니다. 그래서, 코틀린에서 만든 메소드를 자바에서 사용하려 할때 문제가 생길 수 도 있습니다.

이럴때, JvmOverloads 라는 어노테이션을 사용하면 됩니다. 아래 내용을 봅시다.

 

@JvmOverloads

해당 어노테이션을 이용하면, 디폴트 메소드를 사용할 수 있습니다. 사실 정확히 말하면, 모든 경우의 메소드를 모두 생성해줍니다.

아래 예제토드를 살펴봅시다.

 

코틀린

@JvmOverloads
fun<T> joinToString (
    collection: Collection<T>,
    separator: String = ", ", // 인자를 넣지 않았을때, ", " 가 기본으로 들어가서 메소드가 호출된다.
    prefix: String = "", // 마찬가지로 ""(반 값)이 기본으로 들어가서 메소드가 호출된다.
    postfix: String = "" // 위와 동일
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}
​

 

자바

String joinToString(Collection<T> collection, String seperator, String prefix, String postfix);
String joinToString(Collection<T> collection, String seperator, String prefix);
String joinToString(Collection<T> collection, String seperator);
String joinToString(Collection<T> collection);
​

 

위와 같이 4개의 메소드를 만들기 때문에, 사용해도 지장이 없습니다.

 

 

 

다른 'Kotlin' 글

2019/02/22 - [Language/Kotlin] - 코틀린에서 예외처리하기(try catch, throw)

 

코틀린에서 예외처리하기(try catch, throw)

코틀린에서 예외처리하는 방식은 Java와 비슷합니다(거의 동일하다). 예외 처리를 하는 방식에는 2가지 방식이 있습니다. throw로 예외를 던지는 방식과 try, catch로 예외를 잡아서 처리하는 방식입니다. 첫번째..

hongku.tistory.com

2019/02/25 - [Language/Kotlin] - 코틀린의 집합, 리스트, 맵

 

코틀린의 집합, 리스트, 맵

본 글은 Dmitry Jemerov, Svetlana Isakova의 "Kotlin in action" 책을 참고하여 작성한 글입니다. 코틀린의 콜렉션(Collection)에는 집합, 리스트, 맵 등이 있습니다. 본글에서는 집합, 리스트, 맵에 대해 생성하..

hongku.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">