프로그래밍 방식

→ 객체 지향과 절차 지향은 대치 되는 이론이 아니다.

→ 객체 지향 프로그램일지라도 절차는 중요하다.

→ 어디에 초점이 집중 되어있는지 나눈다.

  • 절차 지향 방식 프로그래밍
    • 이름 그래도 실행 순서를 중요하게 하는 방식
    • 프로그램의 흐름을 순차적으로 따르며 처리하는 방식
  • 객체 지향 방식 프로그래밍
    • 이름 그대로 객체를 지향하는 방식
    • 실제 세계의 사물이나 사건을 객체로 보고, 객체들 간의 상호 작용을 중심으로 프로그래밍 하는 방식 → 즉 “무엇” 을 중심으로 프로그래밍 한다.
  • 차이점 → 절차 지향 방식은 데이터에 대한 처리 방식이 분리 되어 있지만 객체 지향 방식에서는 데이터와 그 데이터의 처리 방식이 하나의 객체 안에 포함되어 있다.

 

절차 지향 프로그램을 → 순차적으로 개선 하기

  • 다음은 절차 지향 프로그래밍으로 코드를 짠 것이다. 🔽
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("음악 플레이어를 종료 합니다.");
    }
}

​

 

  • 순서대로 코드가 실행 되었다.
음악 플레이어를 시작합니다.
음악 플레이어 볼륨 : 1
음악 플레이어 볼륨 : 2
음악 플레이어 볼륨 : 1
음악 플레이어 상태 확인
음악 플레이어 ON, 볼륨 : 1
음악 플레이어를 종료 합니다.

// 코드를 짠 대로 위에서부터 순서대로 코드를 실행 한 것이다.

 

  • 절차 지향 프로그램 → 클래스 묶기
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("음악 플레이어를 종료 합니다.");
    }
}

 

이런식으로 볼륨과 상태를 하나의 클래스로 묶어 관리하기때문에 관리가 쉬워진다.

 

  • 절차 지향 프로그램 → 메서드 추출
// 뮤직플레이어2 에서 선언한 클래스를 동일하게 사용한다.

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

    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 에 나뉘어 담겨있다.
    • MusicPlayerData 의 맴버 변수의 변수 명이나 타입이 변경되면 MusicPlayerMain3 내부의 메서드도 함께 변경이 되어야 한다.
    • 이런식으로 데이터와 기능이 분리되어있으면 관리포인트가 2곳으로 나뉘어 있게 된다.

객체 지향 프로그래밍

→ 속성과 기능이 한 곳에 정의됨

  • 클래스와 메서드
    • 해당 코드는 데이터인 value 와 데이터를 사용하는 기능인 add() 메서드를 함께 정의 했다.
    public class ValueData {
        int value;
    
        void add() {
            value++;
            System.out.println("숫자 증가 value = " + value);
        }
    }
    // 이런 코드를 객체 지향 프로그래밍이라고 할 수 있다.
    // 속성과 기능이 한 곳에 정의 된것
    
    • 참고 → 메서드는 원래 객체를 생성해야 호출 할 수 있다. 하지만 static 이 붙으면 객체 생성 없이 메서드 호출이 가능하다. (나중에 설명 예정)
    public class ValueObjectMain {
        public static void main(String[] args) {
            ValueData valueData = new ValueData();
            valueData.add();
            valueData.add();
            valueData.add();
            System.out.println("최종 숫자 = " + valueData.value);
        }
    }
    
    
    이렇게 클래스 내부의 메서드도 호출 할 수 있다.
    • 정리
      • 클래스 속성 (데이터, 멤버 변수)과 기능(메서드)을 정의할 수 있다.
      • 객체는 자신의 메서드를 통해 멤버 변수에 접근할 수 있다.
  • 객체 지향 프로그래밍
    • 위에서 만든 음악 플레이어를 활용할 것 인데
    • 지금은 음악 플레이어 라는 개념을 중요하게 생각하고 객체 지향적으로 프로그램을 작성할 예정이다.
    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("음악 플레이어 ON, 볼륨 : " + 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의 데이터 (변수) 가 무었이 들어있는지 신경 쓰지 않고 단순하게 기능만 호출해서 사용할 수 있게 된다.
    • 속성과 기능이 마치 하나로 뭉쳐있는 것을 캡슐화 라고 한다.

'자바 공부 > [ 完 ] 자바 실전 - 기본편' 카테고리의 다른 글

6. 접근 제어자  (0) 2024.03.07
5. 패키지  (0) 2024.03.06
4. 생성자  (0) 2024.03.06
2. 기본형과 참조형  (0) 2024.03.01
1. 클래스와 데이터  (0) 2024.02.28

+ Recent posts