· inner-circle

일급 컬렉션 vs 확장 함수 (feat. 코틀린 & 자바)

컬렉션에 비즈니스 규칙을 붙일 때 자바처럼 일급 컬렉션으로 감쌀지 코틀린 확장 함수로 열어둘지를 코드로 비교하고, 어느 쪽이 레이어 구조에 더 잘 얹히는지 따져봤다.

작성날짜: 24.09.30

일급 컬렉션?

  • OOP 에서 컬렉션을 래핑하여 그 자체를 하나의 클래스로 만드는 것 (Collection -> Wrapping)
  • 🔥컬렉션 래핑에 중점을 두자!!

일급 컬렉션을 사용하는 상황은?

  • 코틀린에서 일급 컬렉션은 컬렉션을 캡슐화하여 비즈니스 로직을 추가하거나 불변성을 보장하고 싶을 때 사용
class UserNames private constructor(private val names: List<String>) : List<String> by names {
    
    fun containsInvalidName(): Boolean = 
        any { it.isEmpty() || it.length > 50 }

    fun toUpperCase(): UserNames = 
        UserNames(map { it.uppercase() })

    companion object {
        fun of(names: List<String>): UserNames {
            require(names.isNotEmpty()) { "Names list cannot be empty" }
            return UserNames(names.toList())
        }
    }
}

// 사용 예시
fun main() {
    val userNames = UserNames.of(listOf("Alice", "Bob", "Charlie"))
    
    println(userNames.containsInvalidName()) // false
    println(userNames.toUpperCase()) // [ALICE, BOB, CHARLIE]
}

장점은?

  • 비즈니스 로직을 한 곳에 모아 관리할 수 있습니다.
  • 컬렉션의 불변성을 보장합니다.
  • 상태와 행위를 한 곳에서 관리할 수 있어 객체지향적인 설계가 가능합니다.

자바에서의 사용 예시

로또 검증

image

다시 구조로 정리하자면

image

코틀린에서는 어떻게 사용해? (feat. 확장 함수)

1. 일반적 구성

image

2. 일급 컬렉션 구성

image

3. 일급 컬렉션 구성 (확장 함수)

image

이걸 지속 가능한 소프트웨어 개발과 접목 한다면?

대략적인 구조

image

레이어로 묶어보자

image

회고

  • 일급 컬렉션 (확장함수)를 활용해 코드를 보다 가독성있게 개발이 가능해진다. (추상화를 높인다)