객체지향과 절차지향?

  • '절차지향'이 아닌 '절차적 프로그래밍'이라고 합니다. 사실 조금만 생각해보아도 프로그래밍의 기본 틀이 절차를 기반으로 두고 있는데 이 절차를 지향한다는 것도 이상하다.
  • 객체지향 프로그래밍의 반대 개념이 절차지향이라고 오해하는 분들이 많은데 절대 반대개념이 아닙니다. 그렇기 때문에 정확한 표현으로 말하자면 '객체지향 프로그래밍(OOP : Object Oriented Programming)'과 절차적 프로그래밍 (PP : Procedure Programming)이라는 말이 더 정확합니다.

객체지향언어 기준

  1. 캡슐화, 다형성, 클래스 상속을 지원하는가?
  2. 데이터 접근 제한을 걸 수 있는가?

절차적 프로그래밍과 객체지향 프로그래밍

  • 먼저 절차적 프로그래밍(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 절차적 프로그래밍

  • 현재 페러다임은 객체지향 프로그래밍이 대세이긴 합니다. 특히나 워낙 거대해진 프로그램상 절차적 프로그래밍을 한다면 자칫 스파게티 코드가 되기 쉽고 자연스레 유지보수 관점에서도 떨어지죠. 그럼에도 장점도 뚜렷하게 있습니다.

절차적 프로그래밍의 장단점

 

장점 단점
객체나 클래스를 만들 필요 없이
바로 프로그램을 코딩할 수 있다.
각 코드가 매우 유기성이 높기 때문에 수정하기가 힘들다. (새로운 데이터나 기능을 추가하기가 어려움)
필요한 기능을 함수로 만들어 두기
때문에 같은 코드를 복사하지 않고 호출하여
사용할 수 있다.
프로그램 전체에서 코드를 재사용 할 수가 없어 프로젝트 개발 비용과 시간이 늘어날 수 있다.
프로그램의 흐름을 쉽게 추적할 수 있다. 디버그(오류 검사)가 어렵다.

객체지향 프로그래밍의 장단점

 

장점 단점
모듈화, 캡슐화로 인해 유지보수에 용이하다. 대부분의 객체 지향 프로그램은 속도가 상대적으로 느려지고 많은 양의 메모리를 사용하는 경향이 있다.
객체지향적이기 때문에 현실 세계와 유사성에
의해 코드를 이해하기 쉽게 만든다.
현실 세계와 유사성에 의해 코드를 이해하기 쉽게 만드는 만큰 설계 과정에 시간이 많이 투자된다..
객체는 그 자체가 하나의 프로그램이기 때문에
다른 프로그램에서 재사용이 가능하다.
 

출처

Stranger's LAB

복사했습니다!