Kotlin - 4

KHS·2024년 1월 13일
0

Kotlin

목록 보기
4/4
post-thumbnail

배열 및 콜렉션

val array = arrayOf(1, 2, 3)

for(i in array.indices) {
  println("${i} - ${array[i]}")
}

for((index, value) in array.withIndex()) {
  println("${index} - ${value}")
}
  • 콜렉션 객체는 초기화할 때 타입을 명시해야 함

  • 불변 콜렉션

    • List - listOf
    • Set - setOf
    • Map - mapOf
  • 가변 콜렉션

    • MutableList - mutableListOf(ArrayList)
    • MutableSet - mutableSetOf(LinkedHashSet)
    • MutableMap - mutableMapOf()
val map = mutableMapOf<Int, String>()
map[1] = "a"
map[2] = "b"

mapOf(1 to "a", 2 to "b")

확장 함수

  • 특정 클래스의 내장 함수인 것과 같은 동작을 하는 함수를 추가 정의
  • 동일한 명칭으로 작성된 확장 함수를 호출할 경우 원본 클래스의 함수를 호출함
fun String.lastChar(): Char {
  return this.charAt(this.length() - 1)
}

fun Int.add(other: Int): Int {
  return this + other
}

infix fun Int.add2(other: Int): Int {
  return this + other
}

1.add(2)  //3
1.add2(2) //3
1 add2 2  //3

//컴파일 시 함수 내부의 코드가 호출된 지점에 그대로 복사됨
//함수 호출에 의한 오버헤드 저감 목적
inline fun Int.add3(other: Int): Int {
  return this + other
}

함수형 프로그래밍

  • 함수 파라미터에 함수 타입을 정의 가능
  • 함수 파라미터 마자믹에 함수가 있다면 함수 호출 시 코드 블럭으로 구현하여 호출 가능
  • Java에서는 람다 밖의 final이 아닌 변수를 사용할 수 없으나 Kotlin은 사용 가능(Closure 기능)
val isApple: (Fruit) -> Boolean = { fruit: Fruit -> fruit.name == "사과" }

fun filterFruit(fruits: List<Fruit>, filter: (Fruit) -> Boolean): List<Fruit> {
  val results = mutableListOf<Fruit>()

  for(fruit in fruits) {
    if(filter.invoke(fruit)) {
      results.add(fruit)
    }
  }

  return results
}

filterFruits(fruits, isApple)
filterFruits(fruits) {
  //return을 명시하지 않아도 마지막 줄의 결과를 자동 반환
  //여러 줄을 입력할 때 중괄호 필수 아님
  it.name == 사과 //it 키워드로 입력된 람다 파라미터 자체를 지칭
}

Stream 함수

  • filterIndexed - index와 value를 함께 제공
  • mapIndexed - index와 entry를 함께 제공
  • mapNotNull - null이 아닌 값만 반환
  • sortedByDescending - 주어진 값에 대해 역순 정렬
  • groupBy - 주어진 값과 일치하는 Map<any, List\>를 반환
    • 파라미터 여러 개를 사용해 key와 value에 해당하는 조건을 각각 작성 가능
  • associateBy - 특정한 key를 이용한 Map<key, any>를 반환
    • 파라미터 여러 개를 사용해 key와 value에 해당하는 조건을 각각 작성 가능
  • flatten - 중첩 콜렉션을 단일 콜렉션으로 단순 변환

타입 별칭

  • typealias 키워드를 통해 별칭 지정 가능
typealias FruitFilter = (fruit) -> Boolean

fun fruitFilter(frutis: List<Fruit>, filter: FruitFilter): List<Fruit> {

}
  • 같은 함수 및 변수를 import할 때는 as 키워드로 별칭을 지정해줘야 함

구조 분해

  • 객체 선언과 변수 선언을 동시에 수행
  • 변수 이름에 매칭해주는 것이 아닌 변수 순서에 따라 매핑되기 때문에 코드 작성에 유의
  • componentN 키워드를 이름으로 하는 함수 재정의 가능
val person = Person()
val name = person.name
val age = person.age

val (name, age) = Person()
//val (age, name) = Person() //age 변수에 원본 클래스의 name 값이 할당 됨

Scope Function

  • 특정 코드 블럭 내 변수를 키워드로 대체
itthis
람다의 결과를 반환letrun
객체 자체를 반환alsoapply
  • it - 생략 불가능, 별칭 지정 가능
  • this - 생략 가능
fun print(person: Person?) {
  person?.let {
    println(it.name)
    println(it.age)
  }
}

person.let {
  it.age
}

person.run {
  this.age
}

person.also {
  it.age
}

person.apply {
  this.age
}

with(person) { //with(객체, 람다 함수)
  println(this.name)
  println(age)
}
profile
Java & Vue ...

0개의 댓글