Kotlin 자주 사용하는 메소드의 실용적인 사용법과 예제 (orEmpty, takeIf, filter, map 등)

개요

Kotlin은 간결하면서도 강력한 문법을 제공하며, 다양한 메소드를 통해 개발자의 생산성을 극대화합니다.

이번 포스트에서는 Kotlin에서 자주 사용하는 메소드와 그 실용적인 사용법을 예제와 함께 소개합니다. 이 메소드들은 코드의 가독성과 효율성을 높이는 데 매우 유용합니다. —

1. Null 안전성을 위한 메소드

1.1 orEmpty()

val nullableList: List<Int>? = null
println(nullableList.orEmpty()) // 출력: []

val nullableString: String? = null
println(nullableString.orEmpty()) // 출력: ""

val result = nullableString ?: ""
val result = nullableString.orEmpty()

1.2 isNullOrEmpty()

val list: List<Int>? = null
println(list.isNullOrEmpty()) // true

val str: String? = ""
println(str.isNullOrEmpty()) // true

if (str != null && str != "") { /**/ }
if (str.isNullOrEmpty()) { /**/ }

1.3 isNullOrBlank()

val text: String? = "  "
println(text.isNullOrBlank()) // true

2. 데이터 처리 메소드

Kotlin은 Java를 대체하기 위해 설계된 만큼, 여러 기술적 차이를 통해 생산성과 안정성을 개선합니다.

2.1 filter

val numbers = listOf(1, 2, 3, 4, 5)
println(numbers.filter { it % 2 == 0 }) // [2, 4]

2.2 map

val names = listOf("Alice", "Bob", "Charlie")
println(names.map { it.uppercase() }) // [ALICE, BOB, CHARLIE]

2.3 reduce 와 fold

val numbers = listOf(1, 2, 3, 4)
println(numbers.reduce { acc, num -> acc + num }) // 10
println(numbers.fold(10) { acc, num -> acc + num }) // 20

3. 컬렉션 변환 및 그룹화 메소드

3.1 groupBy 와 gropingBy

val words = listOf("apple", "banana", "apricot")
val grouped = words.groupBy { it.first() }
println(grouped) // {a=[apple, apricot], b=[banana]}
data class User(val name: String, val age: Int, val gender: Char)

fun main() {
    val users = listOf(
        User("Alice", 25, 'F'),
        User("Bob", 30, 'M'),
        User("Charlie", 35, 'M'),
        User("Diana", 28, 'F'),
        User("Eve", 22, 'F')
    )

    // 성별로 그룹화
    val groupedByGender = users.groupBy { it.gender }
    println(groupedByGender)
    //F=[User(name=Alice, age=25, gender=F), User(name=Diana, age=28, gender=F), User(name=Eve, age=22, gender=F)],
    //M=[User(name=Bob, age=30, gender=M), User(name=Charlie, age=35, gender=M)]
  
    // 나이대(20대, 30대)로 그룹화
    val groupedByAgeGroup = users.groupBy {
        when (it.age / 10) {
            2 -> "20대"
            3 -> "30대"
            else -> "기타"
        }
    }
    println(groupedByAgeGroup)
    //20대=[User(name=Alice, age=25, gender=F), User(name=Diana, age=28, gender=F), User(name=Eve, age=22, gender=F)],
    //30대=[User(name=Bob, age=30, gender=M), User(name=Charlie, age=35, gender=M)]

    // 성별로 사용자 수 세기
    val countByGender = users.groupingBy { it.gender }.eachCount()
    println(countByGender)
    // F=3, M=2
}

3.2 chunked

val numbers = (1..10).toList()
val chunks = numbers.chunked(3)
println(chunks) // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

4. 컬렉션 확장 메소드

4.1 firstOrNull 와 lastOrNull

val list = (1..100).toList()

list.firstOrNull().also { println(it) } // 1
list.firstOrNull { it > 2 }.also { println(it) } // 3
list.lastOrNull().also { println(it) } // 100
list.lastOrNull { it <= 99 }.also { println(it) } // 100

4.2 take 와 takeWhile

val numbers = listOf(1, 2, 3, 4, 5)
println(numbers.take(3)) // [1, 2, 3]
println(numbers.takeWhile { it < 4 }) // [1, 2, 3]

5. 성능 최적화를 위한 메소드

5.1 asSequence()

val list = (1..100_000_000).toList()

// 짝수인 것들의 제곱인 리스트들의 합
var startTime = System.currentTimeMillis()
val sum1 = list
    .filter { it % 2 ==0 }
    .map { it * it }
    .sum()
var endTime = System.currentTimeMillis()
println("sum1 time ${(endTime-startTime)}") // 2890

startTime = System.currentTimeMillis()
val sum2 = list
    .asSequence()
    .filter { it % 2 ==0 }
    .map { it * it }
    .sum()
endTime = System.currentTimeMillis()
println("sum2 time ${(endTime-startTime)}") // 779

6. 기타 유용한 메소드

6.1 sortedBy와 sortedDescending

데이터 정렬

val numbers = listOf(5, 3, 8, 1)
println(numbers.sortedBy { it }) // [1, 3, 5, 8]
println(numbers.sortedDescending()) // [8, 5, 3, 1]

객체 리스트 정렬

data class User(val name: String, val age: Int, val gender: Char)

fun main() {
    
  val users = listOf(
    User("Alice", 25, 'F'),
    User("Bob", 30, 'M'),
    User("Charlie", 25, 'M'),
    User("Diana", 22, 'F'),
    User("Eve", 30, 'F')
  )

  // `sortedBy`와 `sortedByDescending` 조합
  val sortedUsers = users.sortedWith(
    compareBy<User> { it.age }
      .thenByDescending { it.gender }
      .thenBy { it.name }
  )

  println("Sorted Users (age -> gender -> name):")
  sortedUsers.forEach { println(it) }
  /**
    Sorted Users (age -> gender -> name):
    User(name=Diana, age=22, gender=F)
    User(name=Alice, age=25, gender=F)
    User(name=Charlie, age=25, gender=M)
    User(name=Eve, age=30, gender=F)
    User(name=Bob, age=30, gender=M)
   */
}

정렬 키를 조합한 방식 간단한 키 1개: sortedBy 또는 sortedByDescending 다중 키 조합: compareBy + thenBy 또는 sortedWith

6.2 shuffled()

val numbers = listOf(1, 2, 3, 4, 5)
println(numbers.shuffled()) // [예: 3, 5, 1, 4, 2]

7. 결론

Kotlin의 다양한 메소드는 데이터를 간결하고 효율적으로 처리할 수 있도록 설계되었습니다.

이 글에서 소개한 메소드는 실무에서도 자주 사용되며, Kotlin 개발의 생산성을 크게 높여줍니다. 프로젝트에서 적극 활용해 보세요! 😊




Related Posts