Java

[인프런] 절차 지향 프로그래밍

sejin2 2024. 5. 21. 12:25

프로그래밍 방식은 크게 절차 지향 프로그래밍과 객체 지향 프로그래밍으로 나눌 수 있다.

절자지향프로그래밍

- 절차 지향 프로그래밍은 이름 그대로 절차를 지향한다. 실행 순서를 중요하게 생각하는 방식이다.
- 프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다. 

객체지향프로그래밍

- 객체를 중요하게 생각하는 방식이다.
- 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식이다.

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

절차지향 프로그래밍으로 코드 구성

public class MusicPlayerMain1 {
    public static void main(String[] args) {
        int volume = 0;
        boolean isOn = false;

        // 음악플레이어 켜기
        isOn = true;
        System.out.println("음악 플레이어를 시작합니다.");

        // 볼륨 증가
        volume++;
        System.out.println("음악 플레이어 볼륨 : " + volume);
        // 볼륨 증가
        volume++;
        System.out.println("음악 플레이어 볼륨 : " + volume);
        // 볼륨 감소
        // 볼륨 증가
        volume--;
        System.out.println("음악 플레이어 볼륨 : " + volume);
        // 음악 플레이어 상태
        System.out.println("음악 플레이어 상태 확인");
        if (isOn) {
            System.out.println("음악 플레이어 ON, 볼륨 : " + volume);
        } else {
            System.out.println("음악 플레이어 OFF");
        }
        // 음악 플레이어 종료
        isOn = false;
        System.out.println("음악 플레이어를 종료합니다. ");
    }
}

데이터 묶음

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


public class MusicPlayerMain2 {
    public static void main(String[] args) {
        MusicPlayerData data = new MusicPlayerData();

        // 음악플레이어 켜기
        data.isOn = true;
        System.out.println("음악 플레이어를 시작합니다.");
        // 볼륨 증가
        data.volume++;
        System.out.println("음악 플레이어 볼륨 : " + data.volume);
        // 볼륨 증가
        data.volume++;
        System.out.println("음악 플레이어 볼륨 : " + data.volume);
        // 볼륨 감소
        // 볼륨 증가
        data.volume--;
        System.out.println("음악 플레이어 볼륨 : " + data.volume);
        // 음악 플레이어 상태
        System.out.println("음악 플레이어 상태 확인");
        if (data.isOn) {
            System.out.println("음악 플레이어 ON, 볼륨 : " + data.volume);
        } else {
            System.out.println("음악 플레이어 OFF");
        }
        // 음악 플레이어 종료
        data.isOn = false;
        System.out.println("음악 플레이어를 종료합니다. ");
    }
}

MusicPlayerData라는 클래스를 생성해 데이터를 묶어서 사용해주었다. 
이후에 프로그램 로직이 더 복잡해져서 변수들이 추가되더라도 음악 플레이어와 관련된 변수들은 MusicPlayerData data 객체에 포함되어 있으므로 쉽게 구분할 수 있다.

메서드 추출

위에 코드를 보면 중복되는 부분들이 있다. ( 볼륨 증가 부분 )
각각의 기능들은 이후에 재사용될 가능성이 높다.
- 음악 플레이어 켜고 끄기
- 볼륨 증가, 감소
- 음악 플레이어 상태 출력
=> 이러한 부분을 메서드로 추출해낸다.

public class MusicPlayerMain2 {
    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");
        }
    }
}

각각의 기능을 메서드로 만든 덕분에 각각의 기능이 모듈화 되었다.
- 중복 제거 : 로직 중복 제거
- 변경 영향 범위 : 기능을 수정할 때 메서드 내부만 변경
- 메서드 이름 추가 : 메서드 이름을 통해 코드를 더 쉽게 이해 가능

모듈화 : 블럭을 생각하면 된다. 필요한 블럭을 가져다 사용할 수 있다. 여기서는 음악 플레이어의 기능이 필요하면 해당 기능을 메서드 호출 만으로 쉽게 사용할 수 있다. 음악 플레이어와 관련된 메서드를 조립해서 프로그램을 작성할 수 있다.

절차 지향프로그래밍의 한계

클래스를 사용해서 관련된 데이터를 하나로 묶고, 메서드를 사용해서 각각의 기능을 모듈화했다. 따라서 깔끔하고 읽기 좋고, 유지보수 하기 좋은 코드를 작성할 수 있다.

하지만 현재 작성한 코드의 한계는 데이터와 기능이 분리되어 있다는 점이다. 음악 플레이어의 데이터는 MusicPlayerData에 있는데, 그 데이터를 사용하는 기능은 MusicPlayerMain3에 있다. 그래서 음악 플레이어와 관련된 데이터는 MusicPlaterData를 사용해야 하고, 음악 플레이어와 관련된 기능은 MusicPlayerMain3의 각 메서드를 사용해야 한다.

데이터와 그 데이터를 사용하는 기능은 매우 밀접하게 연관되어 있다. 각각의 메서드를 보면 모두 MusicPlayerData의 데이터를 사용한다. 따라서 이후에 관련 데이터가 변경되면 메서드들도 함께 변경해야 한다. 이렇게 데이터와 기능이 분리되어 있으면 유지보수 관점에서도 관리해야할 포인트가 2곳으로 늘어난다. 

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

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편

'Java' 카테고리의 다른 글

[인프런] 객체 지향 프로그래밍  (0) 2024.05.21
[인프런] 클래스와 메서드  (0) 2024.05.21
[인프런] null과 NullPointerException  (1) 2024.05.20
[인프런] 변수와 초기화  (0) 2024.05.20
[인프런] 기본형과 참조형  (0) 2024.05.20