프로그래밍 언어/코틀린 기본

[코틀린 기초] 스코프 함수

Per ardua ad astra ! 2021. 2. 26. 19:30
lesson 15 스코프 함수

 

람다함수의 기능을 이용한 스코프 함수 !


스코프 함수는 함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수들.
=> 인스턴스의 속성이나 함수를 더 스코프내에서 깔끔하게 불러다 사용한다는 점 덕분에 코드의 가독성을 향상시킨다는 장점이 있다. 

 

코드 예제 

 

Book class

class Book(var name : String, var price:Int){
  fun discount(){
    price -= 2000
  }
  fun printBook(){
    println("책 ${name} ${price}원에 판매중")
  }
}

 

main

fun main(){
  
  /*var a = Book("디모의 코틀린", 10000)
  a.name = "[초특가]" + a.name
  a.discount()
  */

  // var price = 5000

  // apply
  var a = Book("디모의 코틀린", 10000).apply{
    name = "[초특가]" + name
    discount()
  }

  // run 
  var a_price = a.run{
    a.printBook()
    a.price
  }

  println("a의 가격은 ${a_price}원 입니다.")

  // with
  /*
  var a_price = with(a){
    printBook()
    price
  }
  println("a의 가격은 ${a_price}원 입니다.")
  */
  
} 

 

apply: 인스턴스 생성하자마자 변수에 담기 전에 초기화 과정을 수행할 때 많이쓰임. 인스턴스를 리턴.

 

처음 주석 한 것 처럼 인스턴스를 생성하고 참조 연산자 .를 이용하여 속성과 함수를 소환할 수 있다. 하지만 스코프 연산자를 활용하면 가독성도 좋아지고 스코프 내에서 참조 연산자 사용하지 않아도 된다는 장점이 있다.

run: 일반 람다함수 처럼 인스턴스 대신 마지막 구문에 결과값을 반환 한다는 점에서 apply와 다르다.

즉 , 자신의 리시버 객체를 람다식 내부로 옮겨서 실행하는 것이다.  

따라서 인스턴스가 이미 만들어진 뒤 인스턴스의 속성이나 함수를 스코프 내에서 사용하는 경우가 있을 때 주로 사용한다. 

with: run과 동일한 기능. 단지 인스턴스를 참조 연산자 대신 파라미터로 받는다는 차이.


apply, also <-> run, let

apply/also: 처리가 끝나면 인스턴스를 반환(마지막 문장은  중요하지 않음)
run/let: 처리가 끝나면 마지막 구문의 최종값을 반환 or x(반환값을 지정하고 싶다면 마지막 구문에 반환값이 와야됨)

 

apply, run <-> also, let
단지 apply-also, run-let의 각각의 공통적인 차이점은 apply와 run은 참조 연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면, alsolet은 마치 패러미터로 인스턴스를 넘긴 것처럼 it 키워드를 통해서 인스턴스에 접근할 수 있다는 것이다. 

만약 주석처리된 var price = 5000이 앞에서 사용된다면 

run 함수 내에서 사용된 price변수는 인스턴스 a의 price속성이 아닌 main함수의 price 변수를 우선시하여 main에서 선언된 price가 호출될 것이다. run구문에서 이를 방지하기 위해선 생략했던 인스턴스 a를 명시해주어 a.price로 해주던가. 아니면 let을 활용하여 it 키워드로 명시해주는 것이 해결 방법이다.

 

출력결과

 

학습 출처:

테크과학! DiMo-디모의 Kotlin 강좌 (lesson 15)

(www.youtube.com/playlist?list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN)

구독과 좋아요 !