본문 바로가기

카테고리 없음

스코프 함수와 확장 함수

원래는 문서를 보고 정리를 해보려고 했으나 영문 문서와 한글 번역 문서를 번갈아 보면서 읽고 이해하는 것이 생각보다 어렵다고 느껴 일단은 유튜브 영상과 google에서 긁어와 만들어 보기로 했다

 

람다함수의 특별한 케이스

1. 람다함수도 여러 구문의 사용이 가능 

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

마지막 구문이 반환값이다

2. 람다함수에 패러미터가 없다면 실행할 구문들만 나열하면 된다

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

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

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

스코프 함수(scope function)

함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수들 

apply

apply는 인스턴스를 생성한 후 변수에 담기 전에 초기화 과정을 수행할 때 많이 사용

apply를 사용하지 않음

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

apply를 사용

fun main() {
	var a = Book("디모의 코틀린", 10000).apply {
    	name = "[초특가]" + name
        discoint()
    }
}
class Book(var name: String, var prince: Int) {
	fun discount() {
    	price -= 2000
    }
}

apply와 같은 함수를 사용하면 main함수와 별도의 scope에서 인스턴스의 변수와 함수를 조작하므로 코드가 깔끔해진다는 장점이 있다

run

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

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

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

with

run과 동일한 기능을 가지지만 단지 인스턴스를 참조연산자 대신 패러미터로 받는다는 차이만 있다

fun main() {
	var a = Book("디모의 코틀린", 10000).apply {
    	name = "[초특가]" + name
        discoint()
    }
    with(a) {
    	println("상품명 : ${name}, 가격 : ${price}원")
    }    
}
class Book(var name: String, var prince: Int) {
	fun discount() {
    	price -= 2000
    }
}

also/let

처리가 끝나면 인스턴스를 반환 -> apply/also

처리가 끝나면 최종값을 반환 -> run/let

스코프 함수는 인스턴스의 속성이나 함수를 scope내에서 깔끔하게 분리하여 사용할 수 있다는 점 때문에 코드의 가독성을 향상시킨다는 장점이 있다

 

스코프 함수 공부한 곳 

https://www.youtube.com/watch?v=QGDWWL6qA3I&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=15

확장 함수 공부한 곳 

https://todaycode.tistory.com/176

 

Kotlin 확장 함수(Extension Function)를 아시나요?

1. 요약 2. Extension 3. Extension Function 3-1. 개념 3-2. 예제 4. Extension Property 4-1. 개념 4-2. 예제 5. 퀴즈 5-1. 확장 함수는 오버라이딩이 가능할까? 5-2. 확장 함수는 오버로드가 가능할까? 5-3. 멤버 메서드

todaycode.tistory.com

 

Extension Function

확장 함수

어떤 클래스의 멤버 메서드인 것처럼 호출할 수 있지만 그 클래스 밖에서 선언된 함수

따로 상속받지 않고 하나의 클래스에 추가적인 메서드를 구현하고 싶을 때 사용하는 함수

새로운 클래스를 만드는 번거로움을 줄일 수 있다

온점(.)을 사용한다

흠.... 개념은 봐도 잘 모르겠군

fun main() {
	확장함수
    기존에 정의되어 있는 클래스에 함수를 추가하는 방법
    val test = Test()
    test.hi()
    test.hello()
}
fun Test.hi() = println("하이")
class Test() {
	fun hello() = println("안녕")
}