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

한라봉봉·2023년 12월 15일

JAVA

목록 보기
5/16

절차지향 프로그래밍

  1. 이름 그대로 절차를 지향. 실행순서를 중요하게 생각
  2. 순차적으로 "어떻게"를 중심으로 프로그래밍

객체지향 프로그래밍

  1. 이름 그대로 객체를 지향. 객체를 중요하게 생각하는 방식
  2. 실제세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그그래밍.
  3. "무엇을" 중심으로 프로그래밍

중요한 차이

  1. 절차지향은 데이터와 해당 데이터에 대한 처리방식이 분리되어있다.
  2. 객체지향은 데이터와 그 데이터에대한 행동(메서드)이 하나의 객체안에 함께 포함 되어있다.

무엇이 객체 지향 프로그램인가? 아래는 절차지향이다.

이 시리즈에서는 클래스와 객체를 사용해서 관련 데이터를 묶어서 사용하는 방법을 학습함. 단순히 객체를 사용하기만 하면 절차 지향 프로그램과 다르지 않다.

예를들어, 아래와 같은 프로그램은 관련 데이터를 MusicPlayerData에 묶고, 기능을 기능은 main이 속한 클래스에 메서드로 모듈화 하였다.
문제는 데이터와 기능이 분리되어있다. 데이터는 MusicPlayerData 클래스 인스턴스가 가지고있고, 기능은 main 클래스의 메서드에 분리되어있다.

public class MusicPlayerData {
    int volume = 0;
    boolean isOn = false;
}

메인

    public static void main(String[] args) {
        MusicPlayerData data = new MusicPlayerData();
        //음악 플레이어 켜기
        on(data);
        //볼륨 증가
        volumeUp(data);
        //볼륨 증가
        volumeUp(data);
        //볼륨 감소
        volumeDown(data);
        //음악 플레이어 상태
        showStatus(data);
        //음악 플레이어 끄기
        off(data);
    }

    static void on(MusicPlayerData data) {
        data.isOn = true;
        System.out.println("음악 플레이어를 시작합니다");
    }

    static void off(MusicPlayerData data) {
        data.isOn = false;
        System.out.println("음악 플레이어를 종료합니다.");
    }

    static void volumeUp(MusicPlayerData data) {
        data.volume++;
        System.out.println("음악 플레이어 볼륨:" + data.volume);
    }

    static void volumeDown(MusicPlayerData data) {
        data.volume--;
        System.out.println("음악 플레이어 볼륨:" + data.volume);
    }

    static void showStatus(MusicPlayerData data) {
        System.out.println("음악 플레이어 상태 확인");
        if (data.isOn) {
            System.out.println("음악 플레이어 ON, 볼륨:" + data.volume);
        } else {
            System.out.println("음악 플레이어 OFF");
        }
    }

객체지향이 나오면서 데이터와 기능을 하나로 묶어서 사용할수 있게 되었다.(응집도 향상)

1. 클래스와 메서드

클래스는 데이터인 멤버 변수 뿐 아니라 기능역할을 하는 메서드도 포함할 수 있다.

public class ValueData {
    int value;

    void add() {
        value++;
        System.out.println("숫자 증가 value=" + value);
    }
}

이 클래스의 객체는 멤버변수와 기능을 수행하는 add() 메서드도 함께 존재한다. 객체는 자신의 메서드를 통해 자신의 멤버변수에 접근가능하다. 메인에서는 아래와같이 사용가능하다.

    public static void main(String[] args) {
        ValueData valueData = new ValueData();
        valueData.add();
        valueData.add();
        valueData.add();
        System.out.println("최종 숫자=" + valueData.value);
    }
  1. 캡슐화
    속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는것을 캡슐화라고 한다.
    예를들어, MusicPlayer 내부 코드가 변경하는 경우 다른 코드는 변경하지 않아도 된다.
public class MusicPlayer {

    int volume = 0;
    boolean isOn = false;

    void on() {
        isOn = true;
        System.out.println("음악 플레이어를 시작합니다");
    }

    void off() {
        isOn = false;
        System.out.println("음악 플레이어를 종료합니다.");
    }

    void volumeUp() {
        volume++;
        System.out.println("음악 플레이어 볼륨:" + volume);
    }

MusicPlayer 사용처 코드 변동없음

    public static void main(String[] args) {
        MusicPlayer player = new MusicPlayer();
        //음악 플레이어 켜기
        player.on();
        //볼륨 증가
        player.volumeUp();
        //볼륨 증가
        player.volumeUp();
        //볼륨 감소
        player.volumeDown();
        //음악 플레이어 상태
        player.showStatus();
        //음악 플레이어 끄기
        player.off();
    }
profile
백엔드 개발공부 로그를 기록합니다

0개의 댓글