240517_디모의 코틀린 강의 #15. 스코프 함수

2024. 5. 20. 14:01TIL(Today I Learned)

fun main(){
	var price = 5000
    
    var a = Book("디모", 10000).apply{
    	name = "[초특가]" + name
        discount()
    }
    
    a.run{
    	println("상품명: ${name}, 가격: ${price}원")
    }
} // 결괏값: 상품명: 디모, 가격: 5000원

// run이 인스턴스 내 price 속성보다 run이 속한 main함수의 price 변수를 우선시하여
// 8000원이 아니라 5000원으로 출력


// let 함수로 대체

fun main(){
	var price = 5000
    
    var a = Book("디모", 10000).apply{
    	name = "[초특가]" + name
        discount()
    }
    
    a.run{
    	println("상품명: ${name}, 가격: ${price}원")
    }
    
    a.let{
    	println("상품명: ${it.name}, 가격: ${it.price}원")
    }
}

// 결괏값: 상품명: [초특가] 디모, 가격: 8000원

// run을 let으로 대체했듯, apply를 also로 대체 가능

유튜브 - 디모의 코틀린 문법 강의 정리

 

#15강. 스코프 함수

 

1. 람다함수의 특별 case

 1) 람다함수에서도 여러 구문을 구현할 수 있음

 2) 패러미터가 없는 람다함수에서는 실행할 구문들만 나열

 3) 패러미터가 1개인 경우 it으로 사용 가능(여러 개인 경우 => 패러미터별 이름 지정)

 

2. 스코프 함수: 함수형 언어의 특징을 편리하게 사용 가능하도록 기본 제공하는 함수들

 1) apply 함수: 인스턴스 생성 후 변수에 담기 전에 초기화 수행

  * apply 함수 활용 시 apply의 스코프 안에서 참조연산자 없이 직접 인스턴스의 속성과 함수 사용 가능 + 생성되자마자 

    조작된 인스턴스를 바로 변수에 지정할 수 있음

// apply를 사용하지 않고 기존대로 코딩할 경우

fun main(){
	var a = Book("디모", 10000)
}

class Book(var name:String, var Price:Int){
	fun discount(){
    	price -= 2000
    }
}

// 인스턴스마다 참조연산자를 붙여 일일이 코딩해야 함
var a = Book("디모", 10000)
a.name = "초특가" + a.name
a.discount()
// apply를 사용하여 코딩할 경우

fun main(){
	var a = Book("디모", 10000)
}

class Book(var name:String, var Price:Int){
	fun discount(){
    	price -= 2000
    }
}

// 인스턴스마다 참조연산자를 붙여 일일이 코딩해야 함
var a = Book("디모", 10000).apply{
	name = "[초특가]" + name
    discount()
}

 

 2) run 함수: apply처럼 run 스코프 안에서 참조연산자를 사용하지 않으며, 람다함수처럼 인스턴스 대신 마지막 구문에 결괏값을 반환 => 이미 인스턴스가 생성된 후 인스턴스의 함수나 속성을 scope 내에서 사용해야 할 때 유용

// apply 사용 시
var a = Book("디모", 10000).apply{
	name = "[초특가]" + name
    discount()
}


// run 사용 시
a.run{
	println("상품명: ${name}, 가격: ${price}원") // 인스턴스의 속성을 호출하여 사용
}

 

 3) with함수: run과 동일하지만 인스턴스를 참조연산자 대신 패러미터로 받음

  - run => a.run{...}

  - with => with(a){...}

 

 4) also / let 함수: 파라미터로 인스턴스를 넘긴 것처럼 it을 통해 인스턴스를 사용 가능

    (같은 이름의 변수/함수가 scope 외부에 중복된 경우 혼란을 방지)

 

  * apply, run, also, let 구분하기