728x90
Scope 함수
- 특정 객체의 컨텍스트(Object Context) 내에서 특정 동작을 실행하기 위한 목적만을 가진 함수
- Scope 함수를 람다로 사용하게 되면 임시로 Scope를 형성하는데 해당 Scope내에서 객체의 이름을 일일히 참조할 필요 없이 객체를 접근하고 핸들링할 수 있음
- let / run / with / apply / also 총 5가지 함수가 있으며, 기본적으로 객체에 붙어 있는 코드 블록을 실행함
Apply
fun main() {
val book = Book("코틀린 책", 10000).apply {
//apply scope안에서 직접 인스턴스의 속성과 함수를 사용함
name = "특가 " + name
discount()
}
println("${book.name}은 가격 : ${book.price}입니다.")
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
- 인스턴스를 생성 후 변수에 담기 전 초기화 과정을 수행할 때 사용
- 참조연산자 없이 인스턴스의 속성과 함수를 사용할 수 있음
- 인스턴스 자신을 반환 해주기 때문에 변수에 넣어줄 수 있음
Run
fun main() {
val book = Book("코틀린 책", 10000).apply {
//apply scope안에서 직접 인스턴스의 속성과 함수를 사용함
name = "특가 " + name
discount()
}
book.run {
//인스턴스의 속성을 직접사용함
println("${name}은 가격 : ${price}입니다.")
}
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
- 인스턴스의 함수나 속성을 scope내에서 사용해야할 때 사용
- apply 처럼 참조연산자를 사용하지 않아도 됨
- 일반 람다함수처럼 인스턴스를 반환하는게 아니라 마지막 구문의 결과값을 return함
With
fun main() {
val book = Book("코틀린 책", 10000).apply {
//apply scope안에서 직접 인스턴스의 속성과 함수를 사용함
name = "특가 " + name
discount()
}
with(book) {
//book을 파라미터로 받음
println("${name}은 가격 : ${price}입니다.")
}
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
- Run과 다르게 인스턴스를 참조연산자 대신 파라미터로 전달받음
Also / let
fun main() {
//외부 스코프에 중복된 price가 존재함
val price = 5000
val book = Book("코틀린 책", 10000).apply {
name = "특가 " + name
discount()
}
//it으로 중복 막아줌
book.let {
println("${it.name}은 가격 : ${it.price}입니다.")
}
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
- apply랑 같은 용도(처리가 끝나면 인스턴스를 반환)는 also로 run 이랑 같은 용도(처리가 끝나면 최종값 반환)로 let을 사용
- 마치 파라미터로 인스턴스를 넘긴것처럼 it을 통해서 사용해야함
- 파라미터 사용하는 이유는 같은 이름의 변수 혹은 함수가 scope 밖에 중복되어 있는 경우 혼란을 방지하기 위해 사용
Scope 사용하는 이유
- 인스턴스의 속성이나 함수를 Scope 내에서 깔끔하게 분리하여 사용할 수 있다는 점 때문에 코드의 가독성을 높여줌 (유지보수가 더 쉬워짐?)
'KOTLIN' 카테고리의 다른 글
[KOTLIN] 시퀀스 (SEQUENCES) (0) | 2022.05.22 |
---|---|
[KOTLIN] 확장함수 (0) | 2022.05.22 |
[KOTLIN] 컬렉션 (0) | 2022.05.18 |
[KOTLIN] OPEN 키워드 (0) | 2022.05.10 |
[KOTLIN] DATA CLASS (0) | 2022.05.07 |