2024. 5. 20. 14:01ㆍTIL(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 구분하기
'TIL(Today I Learned)' 카테고리의 다른 글
240521_디모의 코틀린 강의 #17강. 익명객체와 옵저버 패턴 (0) | 2024.05.20 |
---|---|
240520_디모의 코틀린 강의 #16강. 오브젝트 (0) | 2024.05.20 |
240516_디모의 코틀린 강의 #14. 고차함수와 람다함수 (0) | 2024.05.20 |
240515_디모의 코틀린 강의 #13강. 변수/함수/클래스의 접근범위와 접근제한자 (0) | 2024.05.14 |
240514_디모의 코틀린 강의 #12강. 기본 프로젝트 구조 (0) | 2024.05.14 |