객체 지향 프로그래밍

장원재·2025년 1월 6일
0

java

목록 보기
17/19

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

이 둘의 차이점을 명확하게 구분한다면, 객체지향에 대한 이해가 더욱 쉬워진다. 먼저 절차 지향은 말 그대로 절차를 지향한다. 즉, 프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다. 반면에 객체 지향은 말 그대로 객체를 지향한다. 이는 실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍 하는 방식이다.

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

절차지향 프로그래밍

//메인에서 활용할 클래스
public class MusicPlayerData {
    int volume = 0;
    boolean isOn = false;
}
//메인
public class MusicPlayerMain3 {
    public static void main(String[] args) {
        MusicPlayerData data = new MusicPlayerData();
        on(data);
        volumeUp(data);
        volumeUp(data);
        volumeDown(data);
        showStatus(data);
        off(data);
    }

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

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

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

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

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

}
  • 여러 기능을 메서드로 만들어서 기능이 모듈화가 되었다. 이를 통해 중복 로직 제거가 가능하고, 기능을 수정할 때 메서드 내부만 변경하면 되며, 메서드 이름을 추가함으로써 코드를 더욱 쉽게 이해할 수 있도록 만들었다.
  • 절차지향은 사용할 데이터와 기능이 따로 분리되어 있는 한계가 있다. 위의 코드에서 데이터는 MusicPlayerData 객체에 존재하고, 기능은 MusicPlayerMain3 에 존재한다. 따라서 이후에 MusicPlayerData 데이터가 변경되면 MusicPlayerMain3 의 메서드도 변경 해야 한다. 즉, 유지 보수 관점에서 관리 포인트가 2곳으로 늘어난다.

객체 지향 프로그래밍

위의 절차 지향 프로그래밍 코드를 객체 지향으로 바꾸면 아래와 같다.

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);
    }

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

    void showStatus() {
        System.out.println("음악 플레이어 상태 확인");
        if (isOn) {
            System.out.println("음악 플레이어 온 볼륨:" + volume);
        } else {
            System.out.println("음악 플레이어 off");
        }
    }
}
public class MusicPlayerMain4 {
    public static void main(String[] args) {
        MusicPlayer player = new MusicPlayer();
        player.on();
        player.volumeUp();
        player.volumeUp();
        player.volumeDown();
        player.showStatus();
        player.off();
    }
}
  • 클래스 내부에 데이터와 관련된 기능(메서드)가 함께 포함되어 있다. 따라서 MusicPlayer 객체를 생성하고, 필요한 기능(메서드)를 호출하기만 하면 된다. MusicPlayer 를 사용하는 입장에서는 이제 MusicPlayer 내부의 어떤 데이터가 있는지 전혀 몰라도 된다. 그냥 필요한 기능을 호출해서 사용하기만 하면 된다.
  • 따라서 MusicPlayer 내부 코드가 바뀐 경우에 다른 코드를 변경하지 않아도 된다.

MusicPlayer 를 보면 음악 플레이어를 구상하기 위한 속성과 기능이 마치 하나의 캡슐에 쌓여있는 것 같다. 이처럼 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라고 한다.

profile
데이터 분석에 관심있는 백앤드 개발자 지망생입니다

0개의 댓글

관련 채용 정보