Kotlin
[Kotlin] 스코프 함수
98kg
2024. 3. 12. 21:34
소코프 함수
함수형 언어의 특징을 좀더 편리하게 사용할 수 있도록 기본 제공하는 함수
apply
인스턴스를 생성한 후 변수에 담기 전에 초기화 할 때 사용
인스턴스를 생성하자마자 그 인스턴스에 참조연산자를 사용하여 apply 를 붙이고
중괄호로 람다 함수를 하나만들어 apply 의 scope 안에서 직접 인스턴스 속성과 함수를
참조 연산자 없이 사용이 가능하다
또한 apply 는 인스턴스 자신을 다시 반환하므로 이렇게 생성되자마자 조작된 인스턴스를
변수에 바로 넣어줄 수 있다.
이렇게 apply 를 이용하면 main 함수와 별도의 scope 에서 인스턴스의 변수와 함수를 조작하므로
코드가 깔끔해진다는 장점이 있다
fun main() {
//apply : 인스턴스를 생성하자마자 그 인스턴스에 참조연산자를 사용하여 apply 를 붙이고
//중괄호로 람다 함수를 하나만들어 apply 의 scope 안에서 직접 인스턴스 속성과 함수를
// 참조 연산자 없이 사용이 가능하다
// 또한 apply 는 인스턴스 자신을 다시 반환하므로 이렇게 생성되자마자 조작된 인스턴스를
// 변수에 바로 넣어줄 수 있다.
// 이렇게 apply 를 이용하면 main 함수와 별도의 scope 에서 인스턴스의 변수와 함수를 조작하므로
// 코드가 깔끔해진다는 장점이 있다
var a = Book("let's coding 의 Kotlin",10000).apply{
name ="[초특가]" + name
discount()
println("$name : [가격] $price")
}
}
class Book(var name: String,var price:Int){
fun discount(){
price -=2000
}
}
run
- apply 처럼 참조 연산자를 사용하지않아도 된다.
- 이미 인스턴스가 만들어진 후에 인스턴스 내에 함수나 속성을 scope내에서 사용해야 할 때 유용하다
fun main() {
var a = Book("let's coding 의 Kotlin",10000).apply{
name ="[초특가]" + name
discount()
// println("$name : [가격] $price")
}
a.run{
println("상품명: ${name}, 가격: ${price}원")
}
}
class Book(var name: String,var price:Int){
fun discount(){
price -=2000
}
}
with
- run 과 동일한 기능을 가지지만 단지 인스턴스를 참조연산자 대신 파라미터로 받는다는 차이
a.run{...}
with(a){...}
also
apply 와 같은 기능 (처리가 끝나면 인스턴스를 반환)
let
처리가 끝나면 최종값을 반환
also 와 let 의 공통점
apply 와 run 은 참조 연산자 없이 사용가능하지만
also 와 let 은 마치 파라미터로 인스턴스를 넘긴 것처럼 it 을 통해서 인스턴스를 사용할 수 있다.
it 을 사용하는 이유
같은이름의 변수나 함수가 scope 바깥에 중복되어 있는 경우에 혼란을 방지하기 위해서다
fun main() {
var price= 5000 // 얘가 우선
var name = "바보"
var a = Book("let's coding 의 Kotlin",10000).apply{
name ="[초특가]" + name
discount()
// println("$name : [가격] $price")
}
a.let{
println("상품명: ${it.name}, 가격: ${it.price}원")
}
}
class Book(var name: String,var price:Int){
fun discount(){
price -=2000
}
}
만약 a.let 구문을 지우고 실행하면 price 는 5000원에 name 은 바보가 나올 것이다.
그 이유는 run 함수가 인스턴스내에 name, price 속성보다 run이 속해있는 main 함수의 변수들을 우선 시 하기 때문이다.
이렇게 같은 경우에 apply 부분도 also 로 대체하여 사용가능하다.