Home 스코프 함수
Post
Cancel

스코프 함수

스코프 함수

정의

  • 함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수들

    종류 (5가지)

    1. apply

  • 인스턴스를 생성한 후 변수에 담기 전에 ‘초기화 과정’을 수행할 때 많이 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Book(var name: String, var price: Int){
    fun discount(){
        price -=2000
    }
}

fun main(){
    var general = Book("Kotlin", 20000)
    general.name = "[Smart]" + general.name
    general.discount()
    
    println(general.name)
    
    var applyVar = Book("Kotlin", 20000).apply{
        name = "[Smart]" + name
        discount()
    } 
}

  • 위 코드에서와 같이, apply의 scope 안에서 직접 인스턴스의 속성과 함수를 참조연산자(.) 없이 사용이 가능하다.
  • apply는 인스턴스 자신을 다시 반환하므로 이렇게 생성되자마자 조작된 인스턴스를 변수에 다시 넣어줄 수 있다.
  • 코드가 깔끔해진다.

    2. run

  • run 스코프 안에서 참조연산자를 사용하지 않아도 된다는 점은 apply와 같지만, 일반 람다함수처럼 인스턴스 대신 마지막 구문의 결과값을 반환한다.
  • 이미 인스턴스가 만들어진 후에 인스턴스의 함수나 속성을 scope 내에서 사용해야 할 때 유용하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Book(var name: String, var price: Int){
    fun discount(){
        price -=2000
    }
}

fun main(){
    var applyVar = Book("Kotlin", 20000).apply{
        name = "[Smart]" + name
        discount()
    } 

    var runVar = applyVar.run{
        println(price)
        name
    } // 가격은 출력하고, 마지막 구문인 이름은 반환하여 runVar 변수에 할당됨
     
    println(runVar) // [Smart]Kotlin 출력
}


3. with

  • run’과 동일한 기능을 가지지만 단지 인스턴스를 참조연산자 대신 parameter로 받는다는 차이만 있다.
    • a.run{…}, with(a){…}

4. also/let

  • also는 apply 기능을, let은 run의 기능을 가지고 있다.
    • 처리가 끝나면 인스턴스를 반환: apply, also
    • 처리가 끝나면 최종값 반환: run, let
  • 차이점: apply와 run은 참조연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면, also와 let은 마치 parameter로 인스턴스를 넘긴것처럼 it을 통해서 인스턴스를 사용할 수 있다.
    • 같은 이름의 변수나 함수가 scope 바깥에 중복되어 있는 경우에 혼란을 방지하기 위함이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Book(var name: String, var price: Int){
    fun discount(){
        price -=2000
    }
}

fun main(){
    var price = 5000
    var applyVar = Book("Kotlin", 20000).apply{
        name = "[Smart]" + name
        discount() 
   } 
   
   applyVar.run{
       println("상품명: ${name}, 가격: ${price}원") //5000원 출력
   }
   
   applyVar.let{
       println("상품명: ${it.name}, 가격: ${it.price}원") //18000원 출력
   }
}