ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코틀린 - 함수 정의와 호출
    프로그래밍/Kotlin 2018. 1. 3. 08:21
    반응형

    코틀린은 자체 컬렉션 클래스를 정의하지 않지만 자바 클래스를 확장해서 더 풍부한 API를 제공한다.

    val set = hashSetOf(1, 7, 53)
    val list = arrayListOf(1,7,53)
    val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three")
    


    1. 코틀린 함수 특징

    코틀린은 자체 컬렉션 클래스를 정의하지 않지만 자바 클래스를 확장해서 더 풍부한 API를 제공한다.

    val set = hashSetOf(1, 7, 53)
    val list = arrayListOf(1, 7, 53)
    val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three")
    
    val strings = listOf("first", "second", "third")
    println(strings.last())
    // third
    
    val numbers = setOf(1, 14, 2)
    println(numbers.max())
    // 14


    2. 함수 파라미터 호출, 디폴트 파라미터 

    함수 파라미터의 이름 붙인 인자를 사용하면 함수의 인자가 많을 때 함수 호출의 가독성을 더 향상시킬 수 있다. 또한 디폴트 값을 정의하면 오버로딩한 함수를 정의할 필요성이 줄어든다. 

    
    fun  joinToString(collection: Collection, seperator: String, prefix: String, postfix: String): String {
      val result = StringBuilder(prefix)
        for ((index, element) in collection.withIndex()) {
            if (index > 0) result.append(seperator) // 첫 원소 앞에는 구분자를 붙이면 안 됨
            result.append(element)
      }
      result.append(postfix)
      return result.toString()
    }
    
    val listWithSeperator = listOf(1, 2, 3)
    print(joinToString(listWithSeperator, "; ", "(", ")"))
    // (1; 2; 3)
    
    // 파라미터의 이름으로 추적한다. 자바 코드에서는 사용할 수 없다.
    joinToString(listWithSeperator, "", "", "")
    joinToString(listWithSeperator, seperator = " ", prefix = "", postfix = "")
    
    // 자바로 작성한 코드를 호출할 때는 이름 인자를 사용할 수 없다.
    val javaTest = JavaCodeTest()
    javaTest.joinToSeperator(strings, separator = "", prefix = "", postfix = "") // compile error 
    
    @JvmOverloads
    fun <T> joinToString2(collection: Collection<T>, seperator: String = "", prefix: String = "", postfix: String = ""): String {
        val result = StringBuilder(prefix)
        for ((index, element) in collection.withIndex()) {
            if (index > 0) result.append(seperator) // 첫 원소 앞에는 구분자를 붙이면 안 됨
            result.append(element)
        }
        result.append(postfix)
        return result.toString()
    }
    
    // 디폴트 함수를 사용하면 순서와 관계없이 지정할 수 있다. 
    joinToString2(strings, seperator = ", ", postfix = "[")
    


    3. 최상위 함수, 최상위 프로퍼티
    코틀린 파일에서 클래스 멤버가 아닌 최상위 함수와 프로퍼티를 직접 선언할 수 있다. 이를 활용하면 코드 구조를 더 유연하게 만들 수 있다.
    
    // 한 클래스에 포함시키기 어려운 유틸성 함수들에 사용할 수 있다. ex) Collections, xxxUtil class
    
    // join.kt
    package strings
    
    fun  joinToString(collection: Collection, seperator: String, prefix: String, postfix: String): String {
        val result = StringBuilder(prefix)
        for ((index, element) in collection.withIndex()) {
            if (index > 0) result.append(seperator) // 첫 원소 앞에는 구분자를 붙이면 안 됨
            result.append(element)
        }
        result.append(postfix)
        return result.toString()
    }
    
    class Join {
        ...
    }
    
    class Another {
      fun main() {
          joinToString(list, ";", "(", ")")
      }
    }
    
    // 자바 코드에서는 다음과 같이 파일명의 새로운 클래스로 만들어져 컴파일 된다.
    public class JoinKt {
        public static String joinToString(...)
        { ... }
    }
    
    // 아래와 같이 사용된다.
    JoinKt.joinToString()
    
    // 새로운 클래스명으로 지정할 수도 있다. 
    @file: JvmName("StringFunction")
    package strings
    fun jointToString(...) {
        ...
    }
    
    import strings.StringFunction
    StringFunction.jointToString(...)
    
    
    // 최상위 프로퍼티는 상수로 추가하는 것이다.
    val UNIT_LINE_SEPARATOR = "\n" // 이는 getter 함수가 추가되므로 아래와 같이 사용할 것.
    const val UNIT_LINE_SEPARATOR = "\n"
    


    4. 확장 함수

    확장 함수와 프로퍼티를 사용하면 외부 라이브러리에 정의된 클래스를 포함해 모든 클래스의 API를 그 클래스의 소스코드를 바꿀 필요 없이 확장할 수 있다. 
    확장 함수는 어떤 클래스의 멤버 메소드인 것처럼 호출할 수 있지만 그 클래스의 밖에 선언된 함수이다. 
    확장 함수를 만들려면 추가하려는 함수 이름 앞에 그 함수가 확장할 클래스의 이름을 덧붙이기만 하면 된다. 
    자바 클래스로 컴파일한 클래스 파일이 있는 한 그 클래스에 원하는대로 확장 함수를 추가할 수 있다.
    단, 확장하려는 클래스의 private, protected 멤버는 사용할 수 없다.
    
    // String을 receiver type, this를 reciver object라고 부른다.
    StringUtils.kt
    
    package strings
    fun String.lastChar(): Char = this.get(this, length - 1)
    
    // String이 receiver type, "Kotlin"이 receiver object이다.
    println("Kotlin".lastChar())
    
    // 아래와 같이 임포트해야 한다.
    import strings.lastChar
    val c = "Kotlin".lastChar()
    
    // 다른 이름으로 부를 수도 있다. 
    import strings.lastChar as last
    val c = "Kotlin".last()
    
    // 자바에서는 클래스 이름으로 결정한다.
    StringUtilsKt.lastChar("Java");
    
    






    반응형
Designed by Tistory.