본문 바로가기

Note

[객사오] 커피 구매를 위한 프로그램에 적용해보기

어렴풋이 알고만 있던 객체지향에 대해서 공부해보고자 유명한 '객체지향의 사실과 오해' 책을 구매하였다.

사실 유튜브에서 객체지향 관련해서 영상(링크)을 보게되었는데 중간까지보다가 개념을 알고있어야겠다싶은 마음에 구매했다.


현재 4장까지 읽었고, 책에 나와있는 설계 순서를 지키며 나만의 예제를 만들어보고자 했다.

 

협력 / 메시지 / 역할

협력(목표)

손님이 커피를 구매한다.

 

메시지(행동)

 

역할(추상화)

고객, 캐셔, 바리스타는 어느 누구가 담당해도 괜찮기 때문에 공동 인터페이스로 작성했다.

 


코드 작성

interface Customer {
    var money: Int

    fun buyCoffee()
}

interface Cashier {
    val menus: Map<String, Int>

    fun showMenu()
    fun serveCoffee(menu: String, money: Int)
    fun changeCharge(money: Int, price: Int): Int
}

interface Barista {
    fun makeCoffee(menu: String): String
}

 

위의 메시지 요청/응답을 토대로 인터페이스를 작성해주었다.

 

class ACustomer : Customer {
    override var money: Int = 10_000
    private val cashier = ACasher()

    override fun buyCoffee() {
        cashier.showMenu()
        cashier.serveCoffee("아이스 아메리카노", money)
    }

}

class ACasher : Cashier {
    private val barista = ABarista()
    override val menus: Map<String, Int>
        get() = mapOf("에스프레소" to 3_000, "아이스 아메리카노" to 4_500, "카페라떼" to 5_500, "카라멜 마키아또" to 6_000)

    override fun showMenu() {
        println("==== M E N U ====")

        menus.forEach { (menu, price) ->
            println("$menu ---> $price 원")
        }
    }

    override fun serveCoffee(menu: String, money: Int) {
        val change = changeCharge(money, menus.getValue(menu))
        println("거스름돈은 $change 원 입니다.")

        val completeMenu = barista.makeCoffee(menu)
        println("주문하신 $completeMenu 나왔습니다.")
    }

    override fun changeCharge(money: Int, price: Int): Int {
        return if (money > price) return money - price else 0
    }
}

class ABarista : Barista {
    override fun makeCoffee(menu: String): String {
        println("커피 제조 완료되었습니다.")
        return menu
    }
}

 

인터페이스를 구현시킨 클래스를 작성해주었다.

 

fun main() {
    ACustomer().buyCoffee()
}

 

main 함수에서 Customer 의 buyCoffee() 를 실행시켜보면 아래와 같다!

 

 


항상 프로그램을 작성할 때 클래스부터 생각을 했고, 그 안에 어떤 데이터(값)가 들어가야하는지부터 생각했었다.

이번에 진행한 '커피구매'를 한다고하면 Coffee 클래스부터 만들고 있었을 것이다. ㅋㅋㅋㅋㅋ

이후에는 손님이 캐셔에게 주문을 하는 것이니, 캐셔 클래스를 만들고 .. 

 

그런데 책에 나와있는대로 협력을 작성하고, 그에 알맞는 메시지를 작성했다.

그리고 작성한 메시지를 토대로 그냥 코드를 작성했다. ... 시간이 엄청 적게 들었다. 그 전보다

그래서 남은 5, 6, 7장이 기대된다! 그리고 5, 6, 7장에서 배운 내용들을 또 이번 프로젝트에 적용할 것이다!

 

사실 어제는 3장까지 읽었는데 그때 만들어놓은 클래스들을 모두 지우고, 오늘 다시 작성해서 그때의 코드가 남아있지 않다는 것이 아쉽다.

바로 이전 버튼을 클릭했지만 어제의 코드까지 돌아가지는 못했다ㅠㅋㅋㅋㅋ

 

 

하지만 생각나는건 메시지는 위와같이 작성했었고, 인터페이스가 아닌 모두 클래스로 작성했었다.

그리고 고객에 해당되는 건 없었다 .. 왜냐하면 main 함수에서 캐셔의 메서드를 호출할 뿐이었다.

 

처음에는 했던 얘기가 계속 반복되고 반복되니 지루하기도 했지만 머릿속에 그려지니 초롱초롱해졌다ㅋㅋㅋㅋㅋ

 

 

아무튼 조금 발전한 것 같아 재밌다 .. 남은 챕터가 기대되는 책은 처음인 것 같다.