-
코틀린 - 함수 정의와 호출프로그래밍/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");
반응형'프로그래밍 > Kotlin' 카테고리의 다른 글
Kotlin multiplatform 프로젝트를 생성해보자 (0) 2020.09.01 Lessons learnt using Coroutines Flow in the Android Dev Summit 2019 app (0) 2020.01.29 Improve app performance with Kotlin coroutines (0) 2019.11.29 Kotlin by keyword를 이용해 상속대신 Delegation을 해보자 (0) 2019.09.03 Kotlin Coroutine Basic (0) 2018.11.04