절차지향 객체지향 차이점
- 객체의 유무
- 절차지향은 데이터 중심적 개발, 객체지향은 기능 중심적 개발
- 객체지향적으로 개발한다면, 객치지향으로 작성한 프로그램이 일반적으로 읽기가 더 편하다
- 객체지향적으로 개발을 하게 되면 유지보수를 할 때 어느 코드를 수정 해야할지 찾기가 비교적 쉬움
절차지향 예시 (고객이 자판기를 이용하는 프로그램)
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
}
}
'자바' 카테고리의 다른 글
HashMap vs ConcurrentHashMap vs HashTable in Java (0) | 2023.06.26 |
---|---|
그로잉맘 검사에 디자인 패턴 적용하기 (1) | 2022.09.07 |
책 단위테스트 느낀점 1편 (0) | 2022.08.25 |
Kotlin Junit5 @ParameterizedTest (0) | 2022.08.20 |
JPA Entity에 기본 생성자가 필요한 이유 (0) | 2022.01.30 |