절차 지향 프로그래밍

package oop1;

import java.util.Scanner;

public class MusicPlayerMain2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        MusicPlayerData data = new MusicPlayerData();
        on(data);
        menu();
        while (true){
            System.out.print("메뉴를 선택해주세요: ");
            int num = scanner.nextInt();
            if (num == 1) {
                volumeUp(data);
            } else if (num == 2) {
                volumeDown(data);
            } else if (num == 3) {
                printState(data);
            } else if(num == 4){
                on(data);
            } else if(num == 5){
                off(data);
            } else{
                System.out.println("메뉴를 다시 선택해주세요.");
            }
        }
    }
    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){
        if (data.volume > 0){
            data.volume --;
        }
        System.out.println("음악 플레이어 볼륨: "+data.volume);
    }
    static void printState(MusicPlayerData data){
        System.out.println("음악 플레이어 상태 확인");
        if(data.isOn){
            System.out.println("음악 볼륨: "+data.volume+" 음악 플레이어: ON");
        }else{
            System.out.println("음악 플레이어: OFF");
        }
    }
    static void menu(){
        System.out.println("1. 음악 플레이어 볼륨 up");
        System.out.println("2. 음악 플레이어 볼륨 down");
        System.out.println("3. 음악 플레이어 state");
        System.out.println("4. 음악 플레이어 on");
        System.out.println("5. 음악 플레이어 off");
    }
}

package oop1;

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

위의 코드는 모듈화는 했지만 절차 지향 프로그래밍 기법을 따른다.

절차 지향의 한계

위의 코드의 한계는 바로 데이터와 기능이 분리되어 있다는 점이다. 데이터는 MusicPlayerData에 있지만, 그 데이터를 사용하는 기능은 MusicPlayerMain2에 있는 각각의 메서드에 분리되어 있다.

이렇게 데이터와 기능이 분리되어 있으면 유지 보수 관점에서도 관리 포인트가 2곳으로 늘어난다.

하지만, 객체 지향 프로그래밍이 나오면서 데이터와 기능을 온전히 하나로 묶어서 사용할 수 있게 되었다.

객체 지향 프로그래밍

모든 사물을 속성과 기능을 가진 객체로 생각하는 것이다. 객체에는 속성과 기능만 존재한다.

객체들의 모임으로 파악하고자 하는 것.

각각의 객체는 메세지를 주고받고, 데이터를 처리할 수 있다.

프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.

자동차