객체지향과 절차지향?
- '절차지향'이 아닌 '절차적 프로그래밍'이라고 합니다. 사실 조금만 생각해보아도 프로그래밍의 기본 틀이 절차를 기반으로 두고 있는데 이 절차를 지향한다는 것도 이상하다.
- 객체지향 프로그래밍의 반대 개념이 절차지향이라고 오해하는 분들이 많은데 절대 반대개념이 아닙니다. 그렇기 때문에 정확한 표현으로 말하자면 '객체지향 프로그래밍(OOP : Object Oriented Programming)'과 절차적 프로그래밍 (PP : Procedure Programming)이라는 말이 더 정확합니다.
객체지향언어 기준
- 캡슐화, 다형성, 클래스 상속을 지원하는가?
- 데이터 접근 제한을 걸 수 있는가?
절차적 프로그래밍과 객체지향 프로그래밍
- 먼저 절차적 프로그래밍(Procedure Programming)입니다. 단어 그대로 '절차적'으로 코드를 구성한다는 것입니다. 반면에 객체지향 프로그래밍(Object Oriented Programming)은 기능들을 묶어 하나의 객체로 만든다고 했습니다. 아래 그림과 같은 형식이죠.
위 그림을 코드로
- 절차적프로그래밍
public class Main {
// 주스 잔여 개수
static int Orange_juice = 10;
static int Apple_juice = 20;
public static void main(String[] args) {
int customer_changes = 1000;
String customer_has = null;
// 오렌지 주스가 먹고싶군요
String want_juice = "Orange juice";
if(want_juice.equals("Orange juice")) {
if(Orange_possible(customer_changes)) {
int changes = getOrangeJuice();
System.out.println("오렌지 주스가 정상적으로 구매되었습니다");
customer_has = want_juice;
customer_changes -= changes;
}
else {
System.out.println("오렌지 주스를 구매하실 수 없습니다");
}
}
else if(want_juice.equals("Apple juilce")) {
if(Apple_possible(customer_changes)) {
int changes = getAppleJuice();
System.out.println("사과 주스가 정상적으로 구매되었습니다");
customer_has = want_juice;
customer_changes -= changes;
}
else {
System.out.println("사과 주스를 구매하실 수 없습니다");
}
} else {
System.out.println("없는 물품입니다");
}
System.out.println("잔액 : " + customer_changes + "\t갖고있는 음료 : " + customer_has);
}
// 오렌지주스 구매 가능?
static boolean Orange_possible(int pay) {
if (Orange_juice > 0) {
if (pay >= 500) {
return true;
}
}
return false;
}
// 오렌지 주스 꺼내기
static int getOrangeJuice() {
Orange_juice--;
return 500;
}
// 사과주스 구매 가능?
static boolean Apple_possible(int pay) {
if (Apple_juice > 0) {
if (pay >= 300) {
return true;
}
}
return false;
}
// 사과주스 꺼내기
static int getAppleJuice() {
Apple_juice--;
return 300;
}
}
- 객체지향 프로그래밍
public class Main {
public static void main(String[] args) {
Customer customer = new Customer(1000);
Vending_Machine vm = new Vending_Machine(10, 3);
// 오렌지 주스가 먹고싶군요
String want_juice = "Orange juice";
int pay = vm.buy(want_juice, customer.getChanges());
// 지불비용이 0원일 때 == 구매 실패시
if(pay == 0) {
customer.resetting_juice(pay, null);
}
else {
customer.resetting_juice(pay, want_juice);
}
System.out.println(customer);
}
}
// 고객
class Customer {
private int changes;
private String hasJuice = null;
public Customer(int changes) {
this.changes = changes;
}
public int getChanges() {
return changes;
}
public void setJuice(String hasJuice) {
this.hasJuice = hasJuice;
}
// 잔액 설정
public void resetting_juice(int changes , String hasJuice) {
this.changes -= changes;
this.hasJuice = hasJuice;
}
public String toString() {
return "잔액 : " + changes + "\t갖고있는 음료 : " + hasJuice;
}
}
// 자판기
class Vending_Machine {
// 자판기에 남아있는 주스 개수
private int Orange_juice; // 오렌지 주스 가격 : 500
private int Apple_juice; // 사과 주스 가격 : 300
public Vending_Machine(int Orange_juice, int Apple_juice) {
this.Orange_juice = Orange_juice;
this.Apple_juice = Apple_juice;
}
// 오렌지주스 판매가 가능한지 검사
private boolean Orange_possible(int pay) {
if (Orange_juice > 0) {
if (pay >= 500) {
return true;
}
}
return false;
}
// 사과주스 판매가 가능한지 검사
private boolean Apple_possible(int pay) {
if (Apple_juice > 0) {
if (pay >= 300) {
return true;
}
}
return false;
}
public int buy(String kind, int pay) {
if(kind.equals("Orange juice")) {
if(Orange_possible(pay)) {
Orange_juice--;
System.out.println("오렌지 주스가 정상적으로 구매되었습니다");
return 500;
}
System.out.println("오렌지 주스를 구매하실 수 없습니다");
return 0;
}
else if(kind.equals("Apple juice")) {
if(Apple_possible(pay)) {
Apple_juice--;
System.out.println("사과 주스가 정상적으로 구매되었습니다");
return 300;
}
System.out.println("사과 주스를 구매하실 수 없습니다");
return 0;
}
System.out.println("없는 물품입니다");
return 0;
}
}
- '필요에 의해 함수들을 만들고 순차적으로 진행하는 방식'인 절차적 프로그래밍을 객체지향으로 변경하면 각각의 객체에서 수행할 수 있는 함수들과 상태(필드)를 묶어서 하나의 클래스로 만들고 각각 객체를 만들어서 활용하죠.
객체지향 프로그래밍 vs 절차적 프로그래밍
- 현재 페러다임은 객체지향 프로그래밍이 대세이긴 합니다. 특히나 워낙 거대해진 프로그램상 절차적 프로그래밍을 한다면 자칫 스파게티 코드가 되기 쉽고 자연스레 유지보수 관점에서도 떨어지죠. 그럼에도 장점도 뚜렷하게 있습니다.
절차적 프로그래밍의 장단점
장점 | 단점 |
객체나 클래스를 만들 필요 없이 바로 프로그램을 코딩할 수 있다. |
각 코드가 매우 유기성이 높기 때문에 수정하기가 힘들다. (새로운 데이터나 기능을 추가하기가 어려움) |
필요한 기능을 함수로 만들어 두기 때문에 같은 코드를 복사하지 않고 호출하여 사용할 수 있다. |
프로그램 전체에서 코드를 재사용 할 수가 없어 프로젝트 개발 비용과 시간이 늘어날 수 있다. |
프로그램의 흐름을 쉽게 추적할 수 있다. | 디버그(오류 검사)가 어렵다. |
객체지향 프로그래밍의 장단점
장점 | 단점 |
모듈화, 캡슐화로 인해 유지보수에 용이하다. | 대부분의 객체 지향 프로그램은 속도가 상대적으로 느려지고 많은 양의 메모리를 사용하는 경향이 있다. |
객체지향적이기 때문에 현실 세계와 유사성에 의해 코드를 이해하기 쉽게 만든다. |
현실 세계와 유사성에 의해 코드를 이해하기 쉽게 만드는 만큰 설계 과정에 시간이 많이 투자된다.. |
객체는 그 자체가 하나의 프로그램이기 때문에 다른 프로그램에서 재사용이 가능하다. |
출처
'몰아 넣기' 카테고리의 다른 글
[java/객체지향] 오버로딩(overloading) vs 오버라이딩(overriding) (0) | 2022.06.10 |
---|---|
[java/객체 지향]자바 상속이란? (0) | 2022.06.10 |
[java/stream] 스트림(stream) 사용방법 (0) | 2022.06.10 |
[java/stream] 스트림(stream)의 개념 (0) | 2022.06.10 |
[java/collection] 스택(stack), 큐(queue), ArrayDeque 대해서 (0) | 2022.06.10 |