일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- PETERICA
- AWS EKS
- CloudWatch
- IntelliJ
- Spring
- mysql 튜닝
- AI
- Linux
- kotlin spring
- Java
- 기록으로 실력을 쌓자
- kotlin coroutine
- minikube
- aws
- Kubernetes
- CKA 기출문제
- 정보처리기사 실기 기출문제
- CKA
- 코틀린 코루틴의 정석
- 티스토리챌린지
- Pinpoint
- MySQL
- 공부
- Elasticsearch
- 오블완
- APM
- 정보처리기사 실기
- kotlin
- kotlin querydsl
- 정보처리기사실기 기출문제
- Today
- Total
피터의 개발이야기
[Kotlin] Scope Functions (let, with, run, apply, also) 정리 본문
[Kotlin] Scope Functions (let, with, run, apply, also) 정리
기록하는 백앤드개발자 2024. 6. 25. 10:10
ㅁ 들어가며
ㅇ이번 글은 Kotlin의 5가지 주요 Scope Functions (let, with, run, apply, also)에 대해 정리하였다.
ㅇ kotlin doc - scope function의 내용을 보고 정리하였다.
ㅁ Scope Functions (let, with, run, apply, also) 요약
ㅇ let: 객체를 인자로 받아 처리하며, 결과를 반환합니다. Null 체크에 유용하다.
ㅇ with: 객체를 직접 입력받아 속성을 변경할 수 있으며, 여러 함수를 그룹화하는 데 사용된다.
ㅇ run: 객체의 확장 함수로, 계산이 필요하거나 지역 변수 범위를 제한할 때 사용한다.
ㅇ apply: 객체를 초기화하거나 변경할 때 주로 사용되며, 자기 자신을 반환한다.
ㅇ also: 객체의 속성을 변경하지 않고 부가적인 작업(로깅, 유효성 검사 등)을 수행할 때 적합하다.
ㅁ Kotlin의 Scope Functions란
ㅇ Kotlin의 Scope Functions는 객체의 컨텍스트 내에서 코드 블록을 실행하는 데 사용된다.
ㅇ 이 함수들은 코드를 더 간결하고 읽기 쉽게 만들어준다.
# let, also, run은 scope function이다.
이들 함수는 [Kotlin] 널 안정성, Null safety에서도 정리하였다.
ㅁlet
ㅇ 컨텍스트 객체: `it`으로 참조
ㅇ 반환 값: 람다 결과
ㅇ 용도: null이 아닌 객체에 대해 작업을 수행하거나, 지역 변수를 제한된 범위 내에서 선언할 때 사용
// null인 경우 기본값
val name = person?.let { it.name } ?: "Default Name"
// let은 리스트의 크기를 출력하고 새 요소를 추가한 후 수정된 리스트를 출력
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.let {
println("리스트의 크기는 ${it.size}")
it.add("six")
println("새로운 리스트: $it")
}
ㅁ run
ㅇ 컨텍스트 객체: `this`로 참조
ㅇ 반환 값: 람다 결과
ㅇ 용도: 객체 구성 및 결과 계산, 여러 지역 변수의 범위를 제한할 때 사용
// 내년 나이 계산
val ageNextYear = person.run { age + 1 }
// run을 사용하여 문자열의 첫 글자와 마지막 글자를 추출하고 새로운 문자열을 반환
val result = "Hello".run {
val firstChar = first()
val lastChar = last()
"첫 글자는 $firstChar, 마지막 글자는 $lastChar"
}
println(result)
ㅁ with
ㅇ 컨텍스트 객체: `this`로 참조
ㅇ 반환 값: 람다 결과
ㅇ 용도: 객체의 여러 함수를 호출할 때 그룹화
// with를 사용하여 Person 객체의 속성에 쉽게 접근하고 수정할 수 있다.
data class Person(var name: String, var age: Int, var city: String)
val person = Person("Alice", 30, "New York")
with(person) {
println("$name is $age years old and lives in $city")
age++
city = "London"
}
println("Updated person: $person")
ㅁ apply
ㅇ 텍스트 객체: `this`로 참조
ㅇ 반환 값: 컨텍스트 객체
ㅇ 용도: 객체 초기화 및 구성
// apply를 사용하여 객체를 생성하고 즉시 속성을 수정할 수 있다.
data class Car(var brand: String, var model: String, var year: Int)
val myCar = Car("Toyota", "Corolla", 2020).apply {
brand = "Honda"
model = "Civic"
year = 2022
}
println(myCar)
ㅁalso
ㅇ 컨텍스트 객체: `it`으로 참조
ㅇ 반환 값: 컨텍스트 객체
ㅇ 용도: 부가적인 작업(로깅, 유효성 검사 등)을 수행할 때 사용
// also를 사용하여 객체를 수정하는 과정에서 중간 상태를 로깅하거나 디버깅할 수 있다
val numbers = mutableListOf(1, 2, 3)
numbers.also { println("원래 리스트: $it") }
.add(4)
.also { println("4를 추가한 후: $numbers") }
.let { println("리스트의 크기: ${numbers.size}") }
ㅁ Scope function 간결한 사용법
ㅇ Scope function을 지나치게 반복하면 가독성이 떨어지고 예측 값을 파악하기 어렵다.
val result = Person.withDefaultName()
.apply { name = "페트리카" }
.run { name.length }
.also { println("이름의 길이는? $it") }
.let { name -> name + 1 }
ㅇ 이런 문제를 해결하기 위해 객체에 적당한 책임을 할당해도 좋다.
val person = Person.withDefaultName()
person.updateName("페트리카")
val result = person.getNameLength() + 1
ㅇ 이 함수들의 목적은 코드를 더 간결하게 만드는 것이지만, 과도한 사용은 오히려 가독성을 떨어뜨릴 수 있다.
ㅇ 따라서 각 함수의 특성을 이해하고 상황에 맞게 적절히 사용하는 것이 중요하다.
참조: Kotlin Scope function 올바르게 사용하기
ㅁ 마무리
Scope Functions는 코드의 가독성을 높이지만, 과도한 사용은 오히려 가독성을 떨어뜨릴 수 있으므로 적절히 사용하는 것이 중요하다.
ㅁ 함께 보면 좋은 사이트
ㅇ 코틀린으로 배우는 함수형 프로그래밍 - 2.10 코틀린 표준 라이브러리 44p
ㅇ Kotlin Scope function 올바르게 사용하기
'Programming > Kotlin' 카테고리의 다른 글
[Ktor] Kotlin + Ktor + Eposed 환경에서 MySQL 연동하기 (0) | 2024.07.04 |
---|---|
[Kotlin] ?(물음표)와 !!(느낌표 두개) (0) | 2024.06.28 |
[Kotlin] Ktor 샘플 프로젝트 생성과정, 10분 미만 (0) | 2024.06.24 |
Ktor란? (0) | 2024.06.19 |
[kotlin] 코틀린 코루틴의 정석 - 무제한 디스패처(Unconfined Dispatcher) (0) | 2024.06.14 |