[KOTLIN] 로컬 함수와 확장

중복 제거의 중요성

  • DRY(Don't Repeat Yourself) 원칙을 따르는 것이 중요

코틀린의 로컬 함수

  • 함수 내부에 로컬 함수를 중첩시켜 코드를 깔끔하게 조직

로컬 함수를 사용해 코드 중복 줄이는 법

class User(val id: Int, val name: String, val address: String)

fun saveUser(user: User) {
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException("Can't save user ${user.id}: empty $fieldName")
        }
    }
    validate(user.name, "Name")
    validate(user.address, "Address")
    // user를 데이터베이스에 저장한다.
}
  • 로컬 함수는 바깥 함수의 모든 파라미터와 변수에 접근이 가능함.
  • 코드중복 해결!

검증 로직을 확장 함수로 추출하기

fun main() {
    saveUsers(User(1, "123", "address"), User(2, "", "address"))
}

class User(val id: Int, val name: String, val address: String)

fun User.validateBeforeSave() {
    println("validateBeforeSave");
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException("Can't save user $id: empty $fieldName")
        }
    }
    validate(name, "Name")
    validate(address, "Address")
}

//가변인자로 변경
fun saveUsers(vararg users: User) {
    for (user in users) {
        user.validateBeforeSave()
    }
}
validateBeforeSave
validateBeforeSave
Exception in thread "main" java.lang.IllegalArgumentException: Can't save user 2: empty Name
  • 확장 함수는 클래스의 멤버처럼 수신 객체를 지정하지 않고, 공개된 멤버 프로퍼티나 메서드에 접근할 수 있게 해준다.
  • 클래스를 간결하게 유지하고 필요한 기능을 추가할 수 있다.

로컬 확장 함수

중첩된 함수의 깊이가 깊어지면 코드를 읽기 어려워질 수 있으므로, 일반적으로 한 단계의 중첩만을 권장합니다.


Uploaded by N2T