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
- 함수처럼 프로퍼티도 최상위 수준에 놓을 수 있음
- 상수도 최상위 수준에 선언이 가능하다
'발전로그 > 책장로그-개발' 카테고리의 다른 글
kotlin in action 03 (3.4) (0) | 2022.02.28 |
---|---|
kotlin in action 03 (3.3) (0) | 2022.02.16 |
kotlin in action 02 (5) | 2022.01.24 |
클린 아키텍처 - 소프트웨어 구조와 설계의 원칙 02 3장 (1) | 2022.01.16 |
클린 아키텍처 - 소프트웨어 구조와 설계의 원칙 01 2장 (5) | 2022.01.09 |