컴퓨터 언어/코틀린

[Kotlin] 코틀린 스코프 함수 [apply, also, run, let,]

훈츠 2020. 2. 14. 22:48
반응형

안녕하세요. 훈츠 입니다. 오늘은 스코프 함수에 대해 이야기 해 보겠습니다. 코틀린에서 함수형 언어의 특징을 좀더 쉽게 사용할수 있도록 제공 하는것입니다. 

스코프 함수 .{  변수 혹은 함수  }

  • (apply 참조연산자 없이 사용/ also "it"을 이용) 처리가 끝나면 인스턴스를 반환 합니다. 
  • (run 참조연산자 없이 사용 / let "it"을 이용) 처리가 끝나면 최종값을 반환 합니다. 
  • with(a){...} run과 완전 동일하며 함수 사용하는 형식 만 다릅니다. 
  • 함수형 언어의 특징을 좀더 쉽게 사용하도록 제공 합니다. 
  • 인스턴스의 속성이나 함수를 좀더 깔끔하게 사용 가능합니다. 

apply / also 

  • 처리가 끝나면 인스턴스를 반환, apply 는 참조연산자 없이 also 는 it 연산자 사용 
class Book(var name:String, var price:Int){
    fun showprice(){
        println("이 ${name} 책의 가격은 ${price}입니다.")
    }
    fun discount(){
        price -= 2000
    }
}
var book2 = Book("자바",20000).
        apply {
            name = "[초특가]" + name
            discount()
            showprice()
            }

//코드의 중간
    book2.also {
        it.name = "대박" + it.name
        println("이 ${it.name} 책의 가격은 ${it.price}입니다.")

}
//출력 내용
이 [초특가]자바 책의 가격은 18000입니다.
이 대박[초특가]자바 책의 가격은 18000입니다.

run / let

  • 처리가 끝나면 최종값을 반환, run 는 참조연산자 없이 let 는 it 연산자 사용 
class Book(var name:String, var price:Int){
    fun showprice(){
        println("이 ${name} 책의 가격은 ${price}입니다.")
    }
    fun discount(){
        price -= 2000
    }

}

fun main(){
    var price =5000
    var book = Book("코틀린", 30000)
    book.name ="[초특가]" + book.name
    book.discount()
    book.showprice()
//run 연산자 없이 사용시 동일 스코프내 변수명이 같으면 겹치는 현상 발생
    book.run{
        println("이 ${name} 책의 가격은 ${price}입니다.")
    }
    
//let 연산자 있이 사용시 같은 스코프 안에 변수와 구분 가능.
    book.let{
        println("이 ${it.name} 책의 가격은 ${it.price}입니다.")
    }
}
//출력 내용
이 [초특가]코틀린 책의 가격은 28000입니다.
이 [초특가]코틀린 책의 가격은 5000입니다. //위에 5000원 선언한 값이 출력 
이 [초특가]코틀린 책의 가격은 28000입니다.

 

 

반응형