본문 바로가기

Language/Kotlin

[Kotlin] 스코프 함수

728x90
반응형

람다함수의 특별한 케이스

1. 람다함수도 여러 구문으로 사용 가능

val c: (String) -> Unit = { str ->
	println("$str 람다함수")
	println("여러 구문을")
	println("사용가능합니다")
}

 

람다함수가 여러 줄이 되는 경우 마지막 구문의 결과값이 반환됨

val calculate: (Int, Int) -> Int = { a, b ->
	println(a)
	println(b)
	a + b  // * a + b의 값을 Int로 반환함
}

 

2. 람다함수에 파라미터가 없다면? 중괄호 안에 실행할 구문만 나열

 val a: () -> Unit = { println("패러미터가 없어요") }

 

3. 파라미터가 하나뿐이면 it 사용

val c: (String) -> Unit = { println("$it 람다함수") }

 

스코프 함수

: 함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수. 클래스에서 생성한 인스턴스를 스코프 함수에 전달하면 인스턴스의 속성이나 함수를 좀 더 깔끔하게 불러 쓸 수 있다.

 

 

1. apply : 인스턴스를 생성한 후 변수에 담기 전에 초기화 과정을 수행할 때 많이 쓰임

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

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

 

 

 

2. run : apply처럼 run 스코프 안에서 참조연산자를 사용하지 않아도 된다는 점은 같지만 일반 람다함수처럼 인스턴스 대신 마지막 구문에 결과값을 반환한다는 차이점이 있다.

var b = a.run {
	println(a.price)
	a.name
}
// 이렇게 쓰면 가격은 출력하지만 마지막 구문인 이름은 반환하여 b라는 변수에 할당됨

 

따라서 이미 인스턴스가 만들어진 후에 인스턴스의 함수나 속성을 scope 내에서 사용해야 할 때 유용하다.

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

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

 

 

 

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

with(a) { … }

a.run { … }

 

 

4. also : apply와 같은 기능 (처리가 끝나면 인스턴스를 반환)

5. let : run과 같은 기능 (처리가 끝나면 최종값을 반환)

 

공통적인 차이점 - apply와 run이 참조연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면 also와 let은 파라미터로 인스턴스를 넘긴 것처럼 it을 통해 인스턴스를 사용할 수 있다.

 

왜 굳이 파라미터를 통해서 인스턴스를 사용?

→ 같은 이름의 변수나 함수가 scope 바깥에 중복되어 있는 경우에 혼란을 방지하기 위해서

fun main(){
	var price = 5000

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

	a.run{
		println("상품명:${name}, 가격:${price}원")  // 상품명:[초특가]디모의 코틀린, 가격:5000원
	}

	a.let{
		println("상품명:${it.name}, 가격:${it.price}원")  // 상품명:[초특가]디모의 코틀린, 가격:8000원
	}
}

class Book(var name: String, var price: Int){
	fun discount(){
		price -= 2000
	}
}
728x90
반응형

'Language > Kotlin' 카테고리의 다른 글

[Kotlin] 익명객체와 옵저버 패턴  (0) 2023.09.09
[Kotlin] 오브젝트  (0) 2023.09.09
[Kotlin] 고차함수와 람다함수  (0) 2023.09.07
[Kotlin] 스코프와 접근제한자  (0) 2023.09.06
[Kotlin] 기본 프로젝트 구조  (0) 2023.09.05