val list = listOf(1, 2, 3)
println(list) // [1, 2, 3]
- Java의 컬렉션에는 Default로 toString( )이 구현되어 있다.
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(seperator) // 첫 원소 앞에는 구분자를 붙히면 안됨.
result.append(element)
}
result.append(postfix)
return result.toString()
}
- 해당 함수는 Generic하여, 어떤 값의 원소로 하는 컬렉션이든 처리하는 것이 가능하다.
val list = listOf(1, 2, 3)
println(joinToString(list, ";", "(", ")")) // (1; 2; 3)
(1) 이름 붙인 인자
joinToString(collection, " ", " ", ".")
joinToString(collection, separator = " ", prefix = " ", postfix = ".")
- Kotlin으로 작성한 함수를 호출할 때는 함수에 전달하는 인자 중 일부(또는 전부)의 이름을 명시할 수 있다.
- 호출 시 인자 중 어느 하나라도 이름을 명히사고 나면 혼동을 막기 위해서 그 뒤에 오는 모든 인자는 이름을 명시해야 한다.
- IntelliJ IDEA는 호출 대상 함수가 파라미터의 이름을 바꾼 경우, 그 함수를 호출할 때 사용한 이름을 붙인 인자의 이름을 추적할 수 있다.
(2) 디폴트 파라미터 값
fun <T> joinToString(
collection: Collection<T>,
separator: String = ", ",
prefix: String = "",
postfix: String = ""
): String
- Java에서는 일부 클래스에서 Overloading한 메서드가 너무 많아진다는 문제가 발생한다.
- Kotlin에서는 함수 선언에서 파라미터의 디폴트 값을 지정할 수 있으므로 해당 문제가 덜하다.
joinToString(list, ",", "", "") // 1, 2, 3
joinToString(list) // 1, 2, 3 > separator, prefix, postfix 생략
joinToString(list, "; ") // 1; 2; 3 > separator을 ';', 나머지는 생략
joinToString(list, postfix = ";", prefix = "# ") // # 1, 2, 3;
- 함수의 디폴트 파라미터 값은 함수를 호출하는 쪽이 아니라 함수를 선언하는 쪽에서 지정된다.
- 어떤 클래스 안에 정의된 함수의 디폴트 값을 바꾸고 그 클래스가 포함된 파일을 재컴파일 하려면, 해당 함수를 호출하는 코드 중에서 값을 지정하지 않은 모든 인자는 자동으로 바뀐 디폴트 값을 적용받는다.
Java는 디폴트 파라미터가 존재하지 않으므로 Kotlin을 Java에서 호출하는 경우에는 모든 인자를 명시해야 한다.
(3) 정적인 유틸리티 클래스 없애기: 최상위 함수와 프로퍼티
- 객체지향 언어인 Java에서는 모든 코드를 클래스의 메서드로 작성해야 하지만, 실전에서는 어려운 경우가 존재한다.
- 중요한 객체는 하나뿐이지만, 그 연산을 객체의 인스턴스 API에 추가해서 API를 너무 크게 만들고 싶지 않은 경우가 있다.
- Kotlin에서는 대신 함수를 직접 소스파일의 최상위 수준에 위치시키고, 그 함수가 정의된 패키지를 임포트 하면 된다.
package strings
fun joinToString(...): String {...}
- Kotlin 컴파일러가 생성하는 클래스의 이름은 최상위 함수가 들어있던 코틀린 소스 파일의 이름과 대응한다.
[최상위 프로퍼티]
var opCount = 0 // 최상위 프로퍼티 선언
fun performOperation() {
opCount++ // 최상위 프로퍼티 값 변경
}
fun reportOperationCount() {
println("Operation performed $opCount times") // 최상위 프로퍼티 값 읽어옴
}
- 함수와 마찬가지로 프로퍼티 또한 최상위 수준에 놓일 수 있다.
- 이런 프로퍼티의 값은 정적 필드에 저장되며, 이를 활용해 코드에 상수를 추가할 수 있다.
const val UNIX_LINE_SEPARATOR = "\\n"
- const 변경자를 추가하면 프로퍼티를 public static final 필드로 컴파일하는 것이 가능하다.
'Kotlin in Action' 카테고리의 다른 글
3. [4] Collection 처리 (0) | 2024.02.22 |
---|---|
3. [3] 확장 함수와 확장 프로퍼티 (0) | 2024.02.22 |
3. [1] Kotlin에서 Collection 만들기 (0) | 2024.02.22 |
2. [4] 대상을 이터레이션: while과 for 루프 (0) | 2024.02.22 |
2. [3] 선택 표현과 처리: enum과 when (1) | 2024.02.22 |