자바

절차지향 VS 객체지향 by Kotlin

_soboro 2022. 8. 29. 05:48

퍼옴 (https://velog.io/@dicoder)

절차지향 객체지향 차이점

- 객체의 유무

- 절차지향은 데이터 중심적 개발, 객체지향은 기능 중심적 개발

- 객체지향적으로 개발한다면, 객치지향으로 작성한 프로그램이 일반적으로 읽기가 더 편하다

- 객체지향적으로 개발을 하게 되면 유지보수를 할 때 어느 코드를 수정 해야할지 찾기가 비교적 쉬움

 

절차지향 예시 (고객이 자판기를 이용하는 프로그램)

package proceduralvsoop

var orangeJuice = 10
var appleJuice = 20

fun main() {
    var customerChanges = 1000
    var customerHas: String? = null

    val wantJuice = "Orange juice"

    if (wantJuice == "Orange juice") {
        if(orangePossible(customerChanges)) {
            val changes = pullOutAppleJuice()
            println("오렌지 주스가 성공적으로 구매되었습니다")
            customerHas = wantJuice
            customerChanges -= changes
        }
        else {
            println("오렌지 주스를 구매하실 수 없습니다")
        }
    }

    else if (wantJuice == "Apple juice") {
        if(applePossible(customerChanges)) {
            val changes = pullOutAppleJuice()
            println("사과 주스가 성공적으로 구매되었습니다")
            customerHas = wantJuice
            customerChanges -= changes
        }
        else {
            println("사과 주스를 구매하실 수 없습니다")
        }
    }

    else {
        println("없는 물품입니다")
    }

    println("잔액 : $customerChanges, 갖고 있는 음료: $customerHas")
}

fun orangePossible(pay: Int): Boolean {
    if (orangeJuice > 0) {
        if (pay >= 500) {
            return true
        }
    }
    return false
}

// 오렌지 주스 꺼내기
fun pullOutOrangeJuice(): Int {
    orangeJuice--
    return 500
}

// 사과주스 구매 가능?
fun applePossible(pay: Int): Boolean {
    if (appleJuice > 0) {
        if (pay >= 300) {
            return true
        }
    }
    return false
}

// 사과주스 꺼내기
fun pullOutAppleJuice(): Int {
    appleJuice--
    return 300
}

 

객체지향 예시 (고객이 자판기를 이용하는 프로그램)

package proceduralvsoop

fun main() {
    val customer = Customer(changes = 1000)
    val vm = VendingMachine(10, 3)

    val wantJuice = "Orange juice"

    // 잔금
    val balance = vm.calculate(wantJuice, customer.changes)

    customer.resetMyPocket(balance, wantJuice)

    println(customer)
}

class Customer(
    var changes: Int,
    var hasJuice: String? = null
) {

    // 주머니에 있는 값들을 수정
    fun resetMyPocket(balance: Int, wantJuice: String) {
        if (balance == 0) {
            this.resettingValues(balance, null)
        }
        else {
            this.resettingValues(balance, wantJuice)
        }
    }

    private fun resettingValues(changes: Int, hasJuice: String?) {
        this.changes -= changes
        this.hasJuice = hasJuice
    }

    override fun toString(): String {
        return "잔액 : $changes, 갖고 있는 음료 : $hasJuice"
    }
}

class VendingMachine(
    private var orangeJuice: Int,
    private var appleJuice: Int
) {
    // 오렌지주스 판매가 가능한지 검사
    private fun orangePossible(pay: Int): Boolean {
        if (orangeJuice > 0) {
            if (pay >= 500) {
                return true
            }
        }
        return false
    }

    // 사과주스 판매가 가능한지 검사
    private fun applePossible(pay: Int): Boolean {
        if (appleJuice > 0) {
            if (pay >= 300) {
                return true
            }
        }
        return false
    }

    fun calculate(kind: String, pay: Int): Int {
        if (kind == "Orange juice") {
            if (orangePossible(pay)) {
                orangeJuice--
                println("오렌지 주스가 정상적으로 구매되었습니다")
                return 500
            }
            println("오렌지 주스를 구매하실 수 없습니다")
            return 0
        } else if (kind == "Apple juice") {
            if (applePossible(pay)) {
                appleJuice--
                println("사과 주스가 정상적으로 구매되었습니다")
                return 300
            }
            println("사과 주스를 구매하실 수 없습니다")
            return 0
        }
        println("없는 물품입니다")
        return 0
    }
}