Backend
home

12. 범위 함수

생성일
2025/02/08 13:20
태그
Kotlin
특정 범위(객체 컨텍스트) 내에서 코드 블록을 실행하는 여러 함수를 Scope function이라고 부름
fun main() { persons[0].let { println(it) println("첫번째 사람의 나이 : ${it.age}") } with(persons[1]) { println(age) println(name) } }
Kotlin
복사
특정한 객체를 영역을 한정하여 활용하고 싶은 경우 주로 사용
장점 : 반복적인 코드를 줄이고, 코드의 응집도를 올릴 수 있음
단점 : 과도하게(중첩되게) 사용하거나 코틀린에 익숙하지 않을 경우 코드를 읽기 어려움

Scope function의 종류

Scope function은 특정 객체를 영역을 한정하는데 활용하며 크게 아래의 두 가지 방법으로 구분 가능
수신 객체를 어떻게 받아오느냐 (람다 식(it) or 객체 자체(this))
응답을 어떻게 주느냐 (수신한 식의 결과 or 객체 자체)
다양한 Scope function 사용 예시
package ch17 val persons = listOf( Person("Captain", 44), Person("Cyclops", 35), Person("Deadpool", 31), Person("Iceman", 54), Person("Loki", 54), Person("Hulk", 54), ) fun main() { // 특정 값에 대해 사용 영역을 명확히 하기 위해 사용 // 객체 참조 : this // 응답 : 람다식 결과 with(persons[1]) { println(age) println(name) } // 객체의 값을 한번에 여러개 설정하는 경우 // 객체 참조 : this // 응답 : 객체 자신 val personTwo = persons[2].apply { this.name = "newName" this.age = 72 } // nullable한 값을 확인하여 not null인 경우 실행하는데 주로 사용 // 객체 참조 : it // 응답 : 람다식 결과 persons.find { it.age > 60 }?.let { println("=======나이 60이 넘는 사람 리 스트=========") println(it) println("====================================") } // 추가적인 효과를 적용하기 위해 주로 사용 // 객체 참조 : it // 응답 : 객체 자신 persons.also { if (it.size < 5) throw IllegalStateException("persons의 크기가 너무 적음") println("persons를 모두 완성했다 이젠 뭐하지?") } // 객체의 값 설정, 추가적인 연산 진행에 사용 // 객체 참조 : this // 응답 : 람다식 결과 persons.run { println(this.map { "${it.name}'s age: ${it.age}" }) println(this.map { "${it.name}의 나이는 ${it.age}살" }) } } == 결과 == 35 Cyclops =======나이 60이 넘는 사람 리 스트========= Person(name=newName, age=72) ==================================== persons를 모두 완성했다 이젠 뭐하지? [Captain's age: 44, Cyclops's age: 35, newName's age: 72, Iceman's age: 54, Loki's age: 54, Hulk's age: 54] [Captain의 나이는 44, Cyclops의 나이는 35, newName의 나이는 72, Iceman의 나이는 54, Loki의 나이는 54, Hulk의 나이는 54]
Kotlin
복사
이름은 다르나 내부적으로 보면 같은 용도로 사용할 수 있는 함수들이 있음
각각의 이름과 만든 목적에 따라 사용하는 것이 좋음
참고