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 로 대체하여 사용가능하다.