11

You can make anything
by writing

C.S.Lewis

코틀린(Kotlin) 먹튀 없는 바카라 사이트(Extension) #1

빠르게 살펴보기

먹튀 없는 바카라 사이트 (Extension)


코틀린은 클래스 상속이나 데코레이터 패턴과 같은 디자인 패턴을 사용하지 않고도 새로운 기능을 가지는 클래스로 먹튀 없는 바카라 사이트할 수 있습니다. 그것이 바로extension(이하 먹튀 없는 바카라 사이트)입니다. 코틀린은 extension function과 extension property를 지원합니다.



먹튀 없는 바카라 사이트 함수 (Extension Function)


먹튀 없는 바카라 사이트 함수는 [먹튀 없는 바카라 사이트을 하려는 대상.함수09

일단 확장 함수의 예를 살펴보겠습니다. 아래 코드는 먹튀 없는 바카라 사이트 타입에 getBrandName()이라는 확장 함수를 만든 것입니다.


fun main(args: Array<String) {

val 먹튀 없는 바카라 사이트 = 먹튀 없는 바카라 사이트()

println(먹튀 없는 바카라 사이트.getBrandName())

}


class 먹튀 없는 바카라 사이트 {

fun getPrice() : Int {

return 10000

}

}


fun 먹튀 없는 바카라 사이트.getBrandName() : String {

return "BMW"

}


BMW


먹튀 없는 바카라 사이트 클래스에는 존재하지 않는 getBrandName()이라는 함수가 아주 쉽게 만들어졌습니다. 심지어 먹튀 없는 바카라 사이트 클래스에 멤버로 추가되거나 기존 함수를 수정하지도 않았습니다. 이런 것이 바로 확장입니다.


그런데 확장 함수의 먹튀 없는 바카라 사이트에 커서를 올리면 다음과 같이 나옵니다.


먹튀 없는 바카라 사이트


receiver 파라미터가 사용되지 않아서 발생한 경고입니다. receiver? 그게 뭘까요?


위 코드에서 보듯이 '먹튀 없는 바카라 사이트을 하려는 대상'입니다. 현재 먹튀 없는 바카라 사이트 타입을 확장하고 있다는 것을 기억하셔야 합니다. 그럼 이번에는 해당 확장 함수에 receiver type과 동일한 return type을 선언하여 실제 receiver를 사용해보겠습니다.


fun main(args: Array<String) {

val 먹튀 없는 바카라 사이트 = 먹튀 없는 바카라 사이트()

println(먹튀 없는 바카라 사이트.getBrandName().getPrice())

}


class 먹튀 없는 바카라 사이트 {

fun getPrice() : Int {

return 10000

}

}


fun 먹튀 없는 바카라 사이트.getBrandName() : 먹튀 없는 바카라 사이트 {

println("BMW")

return this

}


BMW

10000


먹튀 없는 바카라 사이트.getBrandName()를 통해서 println("BMW")가 실행되고 return type이 receiver type과 동일한 먹튀 없는 바카라 사이트이므로 멤버 함수인 getPrice()까지 호출이 됩니다.



Extensions are resolvedstatically


위에서 살펴봤듯이 먹튀 없는 바카라 사이트(Extension)은 실제로 먹튀 없는 바카라 사이트(Extension)으로 먹튀 없는 바카라 사이트한 클래스를 수정하는 것은 아닙니다. 클래스에 새로운 멤버를 추가하지 않고 먹튀 없는 바카라 사이트을 정의만 하면 그(=receiver) 타입의 변수에 .(dot)로 호출할 수 있는 새 함수를 만듭니다.


코틀린 레퍼런스에서는 먹튀 없는 바카라 사이트 함수가 정적으로 전달된다는 것을 강조하고 있습니다. 즉, receiver type에 의해서 가상화 되지 않습니다. 호출되는 먹튀 없는 바카라 사이트 함수는 런타임에 해당 표현식(expression)을 평가한 결과의 type에 의한 게 아니라 함수가 호출되는 표현식의 type에 의해 결정됩니다. (원문을 직역했더니 표현이 참 매끄럽지 못하네요. 그래서 이 말의 의미를 이해하기가 아주 힘들었습니다.)


한국어인데도 무슨 말인지 선뜻 이해가 되지 않습니다. 이럴 때는 코드를 봅시다.



fun main(args: Array<String) {

printFuel(Bus())

}


open class 먹튀 없는 바카라 사이트

class Bus: 먹튀 없는 바카라 사이트()


fun 먹튀 없는 바카라 사이트.getFuel() = "gasoline"

fun Bus.getFuel() = "lpg"


12

println(fuel.getFuel())

}


gasoline


먼저 확장 함수가 정적으로 전달된다고 한 것은 printFuel 함수에 파라미터 fuel은 먹튀 없는 바카라 사이트 타입으로 정적인 상태로 있다는 것을 의미합니다. 따라서 Bus 타입으로 호출하여도 먹튀 없는 바카라 사이트 타입의 확장 함수가 실행이 되어 gasoline이 출력된 것입니다.


receiver type에 의해서 가상화가 되지 않는다는 것은 receiver로 먹튀 없는 바카라 사이트를 사용하여 Bus를 만들어내는 작업이 되지 않았다는 것입니다. 예를 들면 다음과 같이 Int를 Double로 바꾸는 작업 같은 개념입니다. 이건 지금 잘 이해가 안 되더라도 추후 다시 공부할 시간이 있을 것 같습니다. (제발 누가 알려주세요!)



val intToDouble: Int.() - Double = { toDouble() }


printFuel 함수 호출부와 선언부의 Java 변환 코드를 보면 파라미터 부분이 명확하여 이해하는데 도움이 됩니다.


printFuel((먹튀 없는 바카라 사이트)(new Bus()));

...

...

public static final void printFuel(@NotNull 먹튀 없는 바카라 사이트 fuel) {

Intrinsics.checkParameterIsNotNull(fuel, "fuel");

String var1 = getFuel(fuel);

System.out.println(var1);

}



먹튀 없는 바카라 사이트(Extension) #1을 마치며


먹튀 없는 바카라 사이트 함수를 보기 전에 Extensions are resolved statically 레퍼런스의 설명이 이해되지 않아 같은 문장을 새벽까지 수십 번 읽은 것 같습니다. 이게 먹튀 없는 바카라 사이트 함수를 이해하는데 한결 도움이 되었네요. 그래서 그 후 먹튀 없는 바카라 사이트 함(Extension Function)를 작성했습니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari