Java/OOP

절차 지향 프로그래밍VS객체 지향 프로그래밍

oneH 2024. 11. 20. 22:07

 

 

 

절차 지향 프로그래밍과 객체 지향 프로그래밍에 대해 정리해보겠다.

 

 

Java는 대표적인 객체 지향 프로그래밍 언어중 하나이다. Java가 탄생하기 이전 다른 컴퓨터 언어들은 객체 지향이 아닌 절차 지향 언어가 많았다.

 

절차지향 프로그래밍은 순차적인 처리 프로그램이다.절치지향 대표 언어는 C언어이다.

 

절차지향 프로그래밍은 컴퓨터의 처리구조와 유사해 처리속도가 빠르다. C언어같은 저급언어(컴퓨터 친화적 언어)가 속도가 빠른 이유중 하나가 절차 지향이기도 하다.

 


 

 

절차지향(Procedural Programming)

 

프로그래밍 패러다임의 일종으로서 명령형 프로그래밍과 동의어로 쓴다.

 

특징

  • 프로그램 구조: 프로그램을 단계적으로 해결해야 할 절차나 함수로 나눔
  • 데이터와 함수의 분리: 데이터를 저장하는 구조와 이를 조작하는 함수가 명확히 분리됨.
  • 순차 실행: 프로그램의 흐름이 순차적으로 진행됨.
  • 모듈화: 재사용성을 위해 코드를 함수 단위로 모듈화할 수 있음.

절차지향은 구조가 단순해서 이해하기 쉽고 하드웨어와 가까운 시스템을 설계할 때 적합하다.

 

절차지향의 단점은 프로그램이 복잡해질수록 관리가 어려워진다.(코드 중복, 유지보수 문제)

데이터와 함수가 분리되어 있어 데이터 보호가 어려움.

프로그램 확장성이 낮다.

 

 

 

Java에서도 절차지향 프로그래밍 코드를 짤 수 있다. 그냥 사용자 정의 객체 없이 데이터와 기능(method)를 따로 따로 정의해 사용하면 된다.

 

 

package oopPractice;

public class Procedural {
    public static void main(String[] args) {
        int balance = 0;

        balance = plusAccount(balance,5000);

        if(withdraw(balance,8000)){
            System.out.println("잔액 부족");
        }else{
            System.out.println("굿");
        }
    }

    static int plusAccount(int balance,int amount){
        balance+=amount;
        return balance;
    }

    static boolean withdraw(int balance, int amount){
        if(balance>amount){
            balance-=amount;
            return false;

        }else{
            return true;
        }
    }
}

 

 

 


 

 

 

객체지향 프로그래밍(Object-Oriented Programming, OOP)

 

특징

  • 객체: 데이터와 데이터를 다루는 기능(method)가 하나의 단위(객체)로 묶인다.
  • 클래스: 객체의 설계도 역할
  • 캡슐화: 데이터 외부에서 직접 접근하지 못하도록 보호 (정보 은닉)
  • 상속: 기존 클래스의 속성과 메서드를 다른 클래스에서 재사용.
  • 다형성: 같은 이름의 메서드가 다른 동작을 할 수 있음.

 

객체지향 프로그래밍은 코드의 재사용성이 높다.(상속,오버라이딩 등)

시스템 확장에 용이하다. 데이터 중심 설계로 안정성이 높다. 유지보수와 디버깅이 용이하다.

 

 

단점으로는 초기 설계와 구현에 시간이 많이 소요되고 무엇보다 어렵다. 그리고 잘못된 설계의 클래스 구조는 유지보수 측면에서 매우 안좋다.

 

 


 

 

 

비교 분석

특징절차지향 프로그래밍객체지향 프로그래밍

중심 철학 절차(알고리즘과 함수) 중심 설계 객체(데이터와 기능의 결합) 중심 설계
데이터 보호 데이터와 함수가 분리됨 캡슐화로 데이터 보호 가능
확장성 확장성이 낮음 확장성이 높음
재사용성 함수 단위 재사용 제한적 클래스 및 객체를 재사용 가능
복잡한 문제 해결 복잡도 증가 시 관리 어려움 복잡한 문제를 더 쉽게 관리 가능
적용 분야 시스템 프로그래밍, 임베디드 시스템 대규모 소프트웨어, 게임, GUI 응용

 

 

 

 

 


 

 

 

 

 

객체 지향 프로그래밍 (단순한 은행 계좌 서비스 프로그램)

 

package oopPractice;

public class oopPractice1 {
    public static void main(String[] args) {
        Account a = new Account();
        a.deposit(10000);
        a.withdraw(9000);
        a.withdraw(2000);
    }
}


class Account{
    int balance;

    void deposit(int amount){
        balance+=amount;
    }

    void withdraw(int amount){
        if(balance<amount){
            System.out.println("잔액 부족");
            System.out.println("현재 잔고: "+balance);
            return;
        }
        balance-=amount;
    }


}

 

 

 

 

 

이처럼 절차지향 프로그래밍은 데이터와 함수(기능)이 따로 분리가 되어 있어 유지보수가 힘들지만, 객체지향 프로그래밍은 데이터와 그 데이터를 사용하는 기능(메서드)가 한 곳 class에 묶여있어 하나의 수정으로 기능을 확연히 바꿀 수 있다.