기록
[코틀린/Kotlin] 람다함수의 특별한 케이스(it), 스코프 함수(apply, run, with, also, let) 본문
[코틀린/Kotlin] 람다함수의 특별한 케이스(it), 스코프 함수(apply, run, with, also, let)
Dannnnnn 2022. 5. 7. 07:56람다함수를 이용한 특별한 기능인 스코프 함수에 대해 알아보자.
1. 람다함수의 특별한 케이스
1. 람다함수도 일반 함수처럼 여러개의 구문을 사용할 수 있다.
fun main() {
var c = {str: String ->
println("$str 람다함수")
println("여러 구문을")
println("사용 가능합니다")
}
var calculate = {a:Int ,b:Int ->
println(a)
println(b)
a+b
}
}
람다함수가 여러 줄이 되는 경우, 마지막 줄의 결과값이 반환값이 된다.
2. 파라미터가 없는 람다함수는 실행할 구문들만 나열하면 된다.
fun main() {
val a:()->Unit = {println("파라미터가 없어요")}
val b = {"파라미터가 없어요"}
a()
println(b())
}
3. 파라미터가 하나뿐이라면 it을 사용한다
파라미터가 단 하나라면, 파라미터 이름을 선언하지 않고 it이라는 키워드로 대체할 수 있다.
fun main() {
val c:(String)->Unit = {println("$it 람다함수")}
c("Dimo")
}
2. 스코프 함수
함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수들이다.
클래스에서 생성한 인스턴스를 스코프함수에 전달하면 인스턴스의 속성이나 함수를 스코프함수 내에서 편하게 사용할 수 있는 기능이다.
1. apply
인스턴스를 생성한 후 변수에 담기 전 '초기화 과정'을 수행할 때 많이 쓰인다.
인스턴스 생성 후 참조연산자를 사용하여 apply를 붙이고, 중괄호로 람다함수를 하나 만들어
apply의 scope 안에서 직접 인스턴스의 속성과 함수를 참조연산자 없이 사용이 가능하다.
또한, apply는 인스턴스 자신을 다시 반환하므로 이렇게 생성되자마자 조작된 인스턴스를 변수에 바로 넣어줄 수 있다.
fun main() {
var a = Book("디모의 코틀린", 10000).apply{
name = "[초특가]" + name
discount()
}
}
class Book(var name:String, var price:Int){
fun discount(){
price -= 2000
}
}
이렇게 apply와 같은 스코프 함수를 사용하면 main함수와 '별도의 scope'에서 인스턴스의 변수와 함수를 조작하므로 코드가 깔끔해질 수 있다.
2. run
run은 apply처럼 run 스코프 안에서 참조연산자를 사용하지 않아도 된다는 점은 같지만, 인스턴스 대신 일반 람다함수처럼 마지막 구문의 결과값을 반환한다.
따라서, 이미 인스턴스가 만들어진 후에 인스턴스의 함수나 속성을 스코프 내에서 사용해야 할 때 유용하다.
fun main() {
var a = Book("디모의 코틀린", 10000).apply {
name = "[초특가]" + name
discount()
}
a.run {
println("상품명: ${name}, 가격: ${price}")
}
}
class Book(var name:String, var price:Int){
fun discount(){
price -= 2000
}
}
3. with
run과 '동일한 기능'을 가지지만 단지 인스턴스를 참조연산자 대신 파라미터로 받는다는 차이 뿐이다.
// 진짜 이것 밖에 차이가 없다
a.run {...}
with(a) {...}
4. also, let
각각 apply와 run과 같은 기능을 가지고 있다.
처리가 끝나면 인스턴스를 반환 : apply, also
처리가 끝나면 마지막 라인을 반환 : run, let
단, apply와 run이 참조연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면
also와 let은 파라미터로 인스턴스를 넘긴 것 처럼 it을 통해서 인스턴스를 사용할 수 있다는 것이다.
같은 이름의 함수나 변수과 'scope 바깥에 중복'되어 있는 경우에 혼란을 방지하기 위해 사용된다.
fun main() {
// Book클래스의 속성 이름과 같음
var price = 5000
var a = Book("디모의 코틀린", 10000).apply {
name = "[초특가]" + name
discount()
}
a.run {
println("상품명: ${name}, 가격: ${price}")
}
a.let {
println("상품명: ${it.name}, 가격: ${it.price}")
}
}
class Book(var name:String, var price:Int){
fun discount(){
price -= 2000
}
}
스코프 함수는 인스턴스의 속성이나 함수를 scope 내에서 분리해 사용한다.
이는 코드의 가독성을 향상시킨다는 장점이 있다.
https://www.youtube.com/watch?v=q7GV68jKLVM&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=15
위 강의를 보면서 개인적으로 공부한 내용을 정리하였습니다.
'[Study] > Kotlin' 카테고리의 다른 글
[코틀린/Kotlin] 클래스의 다형성 (as, is) (0) | 2022.05.09 |
---|---|
[코틀린/Kotlin] Object, Companion Object (0) | 2022.05.08 |
[코틀린/Kotlin] 고차함수와 람다함수 (0) | 2022.05.07 |
[코틀린/Kotlin] 접근범위와 접근제한자 (0) | 2022.05.06 |
[코틀린/Kotlin] 기본 프로젝트 구조 (0) | 2022.05.06 |