본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
Kotlin

[Kotlin#9] Kotlin(코틀린) Function Detail 및 Delegation Pattern In Class(위임패턴)

by Hazard3_o00sung 2020. 12. 28.
728x90

안드로이드를 대표하는 언어 코틀린입니다!

Powerful Functional and OOP in Kotlin

  저번 시간에 저희가 배워보았던 내용은 generics개념에 대해서 학습해보았습니다. 간략하게 말씀드리자면, 더 높은 유형의 변수 타입이라고 줄일 수 있겠죠. 객체가 가지고 있는 자신만의 타입을 일반화한다고 볼 수 있습니다. 만약 보지 못하신 분이라면 아래 링크를 타고 들어가셔서 보고 오시는 것을 추천드립니다.

hazarddev.tistory.com/59

 

[Kotlin#8] Kotlin(코틀린) Generics 및 Delegation Pattern In Class[1]

Powerful Functional and OOP in Kotlin 저번 글에서는 데이터 클래스와 봉인 클래스에 대해서 알아보았습니다!! 만약 보지 못하신 분이라면 아래 링크를 타고 들어가셔서 보시고 오시는 것을 추천드립니

hazarddev.tistory.com

그렇다면 이번 시간에는 디자인 패턴 중 하나인 위임(Delegation) 패턴에 대해서 학습해보도록 하겠습니다. 위임이라는 단어의 정확한 뜻을 알고 계신가요? 위임장 이런 단어를 많이 접해보셨을 법 한데, 위임은 당사자가 상대방에 대해 일 등의 사무 처리를 위탁하고 상대방이 이를 승낙함을 의미합니다. 그러니까 어떤 책임을 전달해준다고 볼 수 있겠죠. 그렇다면 이 코드들이 왜 책임을 다른 코드로 전가해야 하는지, 전가했을 때 어떤 이점이 존재하는지에 대해서 학습해보려고 합니다. 그러니까 디자인 패턴에서 위임이란, 클래스의 어느 특정한 메서드나 기능들을 다른 클래스로 위임하는 것을 의미합니다. 어떻게 보면 함수 확장의 의미로도 사용되지만, 설명하기 까다롭기 때문에 아래 그림을 보시면 될 것 같습니다!

delegator pattern _ designed by own

그러니까 위임받는 클래스위에 인터페이스가 존재하고, 그 클래스는 인터페이스를 상속받는 impl클래스입니다. 그렇다면 아래 따라오는 클래스는 위임자 클래스를 상속받아 내부 메서드 등 기능을 모두 위임해 자신의 권한대로 마음껏 다루게 하는 것이 바로 위임자 패턴입니다. 코틀린에서는 "by"키워드를 사용해서 위임한다는 점이 자바와 다른 점입니다. 자바는 별 달리 위임에 대한 키워드는 존재하지 않고 인터페이스와 클래스의 구현 방법에 따라 위임을 결정짓습니다. 이런 점을 보면 코틀린이 자바에 비해 얼마나 직관적으로 사용 가능한 가를 알 수 있 것 같습니다.

interface Foo{
    fun WhoamI()
}

class FooImpl(var x: Int):Foo{
    override fun WhoamI(){
        println("FooImpl ${x}")
    }
}

class Bar(foo:Foo):Foo by foo

fun main(arg:Array<String>)
{
    val foo = FooImpl(256)
    Bar(foo).WhoamI()
}

 

코드를 함께 보도록 하겠습니다. 우선 Foo인터페이스 내부에 메소드 WhoamI()를 확인할 수 있습니다. 이를 Impl클래스에서 상속받아 오버라이드로 구현합니다. 그리고 아래 클래스 Bar는 인터페이스 Foo를 인자로 받으며, foo로부터 기능들을 위임받겠다는 걸 컴파일러에게 알리는 거죠. 그래서 컴파일을 진행해보면 아래 결괏값을 얻을 수 있습니다.

$ kotlinc main.kt -include-runtime -d main.jar
$ java -jar main.jar
FooImpl 256

Property Delegation

import kotlin.properties.Delegates

class User {
    var name: String by Delegates.observable("not initiate"){
        prop, v1, new ->
            println("$v1 and $new is initiate the object")
    }
}

fun main(arg:Array<String>)
{
    val user = User()
    user.name = "Hello"
    user.name = "World"
}

result > 
not initiate and Hello is initiate the object
Hello and World is initiate the object

속성값은 일부 객체 지향 언어에서 객체 필드 명이나 애매한 메서드 등을 일컫습니다. 물론  멤버 변수가 될 수도 있고요, 다른 언어를 공부하시고 넘어오신 분이라면 아시겠지만 get, set이 있습니다. 그러니까 두 함수를 이용해서 값을 초기화해주는 거죠. 여하튼 너무 멀리 나갔네요, 위 코드를 보게 되면 Delegation.observable()을 보게 되면 두 개의 인수를 사용해서 객체를 초기화합니다. 그렇기 때문에 초기에 들어온 값으로 받아들여진 user는 not initiate와 함께 출력이 되었지만, 이후에 새로운 값이 새롭게 객체를 초기화하면서 아예 새로 들어온 두 개의 값으로 객체를 초기화해 출력한 것을 알 수 있습니다. 

 

Function

어 왜 지금 함수가 나오지 할 수 있을 것 같습니다. 뭐 이유로는 제가 예제코드를 작성하면서 많은 함수 코드를 작성했기 때문에 그와 같은 생각을 하셨을 수 도 있으나, 사실 코틀린에서 제일 중요한 개념은 뭐니 뭐니 해도 함수입니다. 그렇기 때문에 함수는 따로 설명을 해야만 했죠. 아래 피보나치수열을 이용한 함수의 코드를 작성해보고 실행해보겠습니다.

fun fib( n:Int) : Int{
    if (n < 2){
        return n
    }
    else{
        return fib(n-1) + fib(n-2)
    }
}
fun main(arg:Array<String>)
{
    println("${fib(10)}")
}

뭐 당연히 피보나치야 아시겠고요~ 55라는 값이 도출될 겁니다. 함수의 인자는 보시다시피 뭐 정수 값으로 받고 그 뒤에 오는 :Int는 반환 값이 정수라는 것을 컴파일러에게 알리는 구문이라고 보면 됩니다.  그러니까 코틀린에서의 함수는 아래 포맷을 기본으로 하는 거죠.

fun FunctionName(<args>:<argsType>...):<ReturnType>{...

lambda

람다 표현식에 대해서 아시는 분도 계실 테고 모르시는 분도 계실 텐데, 람다는 코드의 양을 대폭 줄이고 간단한 로직을 생성해 재사용하기 좋게 만드는 게 람다(이름 없는 함수)입니다. 아래 예제 코드를 보고 슼 이해하고 넘어가도록 하죠!

fun main(arg:Array<String>)
{
    val noName:(Int)->Unit = {s:Int-> if (s < 2) s else println("S > 2")}
    val foo:Int = 10;
    noName(foo)
}

제가 작성하는 코드는 모두 작성 똑같이 하시고 실습하는 것 까지 해보세요 무조건!!

 

이 정도면 말씀드리고자 하는 내용은 대부분 전달이 완료된 것 같습니다. 아직까지 배워야 할 내용은 많지만 천천히 나 아가다 보면 코틀린을 자유자재로 다루며, 앱이나, 프로그램을 작성하는 그날이 반드시 올 겁니다!!

 

글 잘 읽으셨다면 공감 하트 한 번씩 눌러주시면 감사하겠습니다.😍😍😍😍

댓글로 피드백, 문의, 질문 모두 환영합니다!!

 

감사합니다~~~😝😝😝😝😝😝

 

 

다음 강좌 --->

hazarddev.tistory.com/62

 

[Kotlin#10] Kotlin(코틀린) Class to Struct(Destructuring) & Exception Handling(클래스의 구조화 및 에러 처리)

Powerful Functional and OOP in Kotlin 언제 끝날까 했던 코틀린 기초 강의 글이 끝나네요!! 사실 이걸로 코틀린을 마스터할 수 없지만, 어느 정도 코틀린의 문법에 대해서 배워보았다는 수준은 가능한 것

hazarddev.tistory.com

 

728x90

댓글