본문 바로가기

프로그래밍언어/Java

[Java 기본] 절차 지향 프로그래밍

절차 지향 프로그래밍


절차지향 프로그래밍 


프로그램의 흐름을 순차적으로 처리하는 방식. 즉, "어떻게"를 중심으로 프로그래밍 한다.

 

객체지향 프로그래밍 


실제 세계의 사물이나 사건을 객체로 보고, 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식. 즉, "무엇을" 중심으로 프로그래밍한다.

 

 

절차지향 VS 객체지향 


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

 

설명은 어려우니 코드를 통해 이해해보자.

 

음악 플레이어 만들기


요구사항

  • 음악 플레이어를 켜고 끌 수 있어야 된다.
  • 음악 플레이어의 볼륨을 증가, 감소할 수 있어야 한다. 
  • 음악 플레이어의 상태를 확인할 수 있어야 한다. 

절자지향

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

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

    }

=> 순서대로 프로그램이 작동하도록 단순하게 작성했다. 

 

절차지향 프로그래밍2 - 데이터 묶음 


위의 코드를 클래스를 도입해서 개선해보자. 

  • MusicPlayerData라는 클래스 생성. 음악 플레이어에 사용되는 데이터들을 멤버 변수로 사용하자.

MusicPlayerData

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

 

MusicPlayerMain 메인 메서드 수정

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

        // 음악플레이어 상태
        if(data.isOn) {
            System.out.println("음악 플레이어 ON, 볼륨: " + data.volume);
        } else {
            System.out.println("음악 플레이어 OFF ");
        }
        //음악 플레이어 끄기
        data.isOn = false;
        System.out.println("음악 플레이어를 종료합니다.");

    }

=> 이후에 프로그램이 더 복잡해져서 다양한 변수들이 추가되더라도 관련 변수들은 MusicPlayerData 객체에 속해있으므로 관리가 용이

 

절차지향 프로그래밍3 - 메서드 추출 


코드를 보면 볼륨증가, 감소하는 부분이 중복된다. 

재사용될 가능성이 높은 부분을 찾아보자.

  • 음악 플레이어 켜기, 끄기
  • 볼륨 증가, 감소
  • 음악 플레이어 상태 출력
public class MusicPlayerMain2 {
    public static void main(String[] args) {
        MusicPlayerData data = new MusicPlayerData();

        //음악 플레이어 켜기
        on(data);
        
        //볼륨 증가
        volmeUp(data);
        volmeUp(data);

        //볼륨 감소
        volmeDown(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 volmeUp(MusicPlayerData data) {
        data.volume++;
        System.out.println("음악 플레이어 볼륨 : " + data.volume);
    }

    static void volmeDown(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에 있다. 

 

데이터와 데이터를 사용하는 기능은 매우 밀접하게 연관되어 있다. 메서드를 보면 매개변수가 전부 MusicPlayerData인 것을 확인할 수 있다. 따라서 이후에 관련 데이터가 변경이 되면 메서드도 같이 수정해야된다. 음악 플레이어 상태에 '대기'상태가 추가된다고 생각해보자. 데이터 타입이 바뀌므로 이를 쓰는 메서드를 전부 찾아서 수정해주어야 한다. 

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.