본문 바로가기
발전로그/책장로그-개발

kotlin in action 03 (3.1 ~ 3.2)

by 4lleycat 2022. 2. 15.

3장 함수 정의와 호출

3.1 코틀린에서 컬렉션 만들기

fun main(args: Array<String>) {
    val set = hashSetOf(1,7,53)
    val list = arrayListOf(1,7,53)
    val map = hashMapOf(1 to "one", 7 to "seven", 51 to "fifty-three")
    val stringList = listOf("one", "fifty-three", "seven")

    // 각 컬렉션 객체가 속한 클래스
    // instance.javaClass getClass() 메소드와 같다
    println(set.javaClass)
    println(list.javaClass)
    println(map.javaClass)

    //코틀린의 추가기능
    //integer list,set 에서 최대값
    println(set.maxOrNull())
    // list의 마지막 원소 ... py..?!
    println(stringList.last())
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
class java.util.HashSet
class java.util.ArrayList
class java.util.HashMap
53
seven
  • 코틀린은 자신만의 컬렉션이 아닌 표준 java 컬렉션을 활용한다 (java.util)
  • 자체 컬렉션을 제공하지 않는 이유는 자바 코드와 상호 작용하기 쉽기 때문!
  • 코틀린에서 컬렉션은 자바보다 더 많은 기능을 제공한다

3.2 함수를 호출하기 쉽게 만들기

- 이름 붙인 인자

fun main(args: Array<String>) {
    val list = listOf(1,7,53)
    // 출력형식이 고정되어있는 기존 자바 컬렉션 toString
    println(list.toString())

    // [1, 7, 53] -> [1; 7; 53] 세미콜론으로 변환 출력
    // 자바의 경우 직접 구현 또는 구아바,아파치 커먼즈같은 서드파티가 필요
    // 코틀린의 경우는?
    // 코틀린 기능 사용 안하는 경우 - 직접구현
    println(joinToString(list, "; ", "[", "]"))
    //코틀린에서는 함수의 시그니처를 명시하여 가독성을 높일 수 있다
    //단 자바로 작성된 함수에서는 사용할 수 없음..
    println(joinToString(collection = list, separator = ": ", prefix = "[", postFix = "]"))
}

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()
}
>>>>>>>>>>>>>>>>>
[1, 7, 53]
[1; 7; 53]
[1: 7: 53]
  • 코틀린에서는 함수의 시그니처를 명시하여 가독성을 높일 수 있다
    • joinToString(collection = list, separator = ": ", prefix = "[", postFix = "]")
  • 디폴트 파라미터값과 함께 사용시 쓸모가 많은

3.2.2 디폴트 파라미터 값

fun main(args: Array<String>) {
    val list = listOf(1,7,53)
    println(joinToStringDefaultValue(collection = list))
    println(joinToStringDefaultValue(collection = list, prefix = "$"))
}

@JvmOverloads
fun <T> joinToStringDefaultValue(
    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()
}
>>>>>>>>>
1# 7# 53
$1# 7# 53
  • 모든 인자를 안써도 나머지는 디폴트 인자가 들어간다
  • 함수의 디폴트 파라미터 값은 함수를 호출하는 쪽이 아니라 함수 선언 쪽에서 지정한다!!
  • * 단, 자바에는 디폴트 파라미터 값이라는 개념이 없어서 코틀린 함수를 자바에서 호출하는 경우 모든인자를 꼭 명시해야한다  
    • 자바에서 코틀린 함수를 자주 호출할때 @JvmOverloads 어노테이션을 함수에 추가하면 코틀린에서 호출한것처럼 디폴트 파라미터 값을 사용할 수 있음👍

3.2.3 정적인 유틸리티 클래스 없애기 : 최상위 함수와 프로퍼티

- 최상위 함수

//java 에서 호출할우 코틀린의 최상위 함수가 포함된 클래스 네임을 지정해 줄 수 있다
// StringFunction.joinToStringDefaultValue(....
@file:JvmName("StringFunction")

package strings

fun <T> joinToStringDefaultValue(
    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()
}

----------------------------
import strings.joinToStringDefaultValue

fun main(args: Array<String>) {
    val list = listOf(1,7,53)
    println(joinToStringDefaultValue(collection = list))
    println(joinToStringDefaultValue(collection = list, prefix = "$"))
}

>>>>>>>>>>>
1# 7# 53
$1# 7# 53
  • 자바에서는 모든 함수 코드를 클래스의 메소드로 작성함으로 비슷한 연산을 하는 역할을 메소드를 가진 클래스가 자주생긴다
  • 코틀린에서는 함수를 최상위 수준 (모든 클래스의 밖)에 위치시킬 수 있다.

- 최상위 프로퍼티

const val CONST_COUNT = 4
var count = 2

fun countAdd() {
    count += CONST_COUNT
}

fun main() {
    countAdd()
    println("root count add CONST_COUNT $count")
}

>>>>>>>>>>>
root count add CONST_COUNT 6
  • 함수처럼 프로퍼티도 최상위 수준에 놓을 수 있음
  • 상수도 최상위 수준에 선언이 가능하다