신규 블로그를 만들었습니다!
본 글은 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)
2019/02/25 - [Language/Kotlin] - 코틀린의 집합, 리스트, 맵
'Language > Kotlin' 카테고리의 다른 글
코틀린의 집합, 리스트, 맵 (0) | 2019.02.25 |
---|---|
코틀린에서 예외처리하기(try catch, throw) (0) | 2019.02.22 |
코틀린에서 in으로 범위 원소 검사하기 (0) | 2019.02.20 |
코틀린 설치, 인텔리제이와 JDK 설치 (0) | 2019.02.15 |
코틀린 맵(map) 이터레이터 (0) | 2019.02.14 |
최근댓글