강의내용정리/Java

[Java] 객체 지향 프로그래밍

송병민 2025. 1. 20. 17:15

절차 지향 프로그래밍

프로그래밍 방식은 크게 절차 지향 프로그래밍, 객체 지향 프로그래밍으로 나뉜다

  • 절차 지향 프로그래밍
    • 절차 지향 프로그래밍은 이름 그대로 절차를 지향
    • 실행 순서를 중요하게 생각하는 방식
    • 프로그램의 흐름을 순차적으로 따라서 처리하는 방식 ('어떻게'를 중심)
  • 객체 지향 프로그래밍
    • 객체를 중요하게 생각하는 방식
    • 실제 세계의 사물이나 사건을 객체로 보고, 객체들 간의 상호작용을 중심으로 프로그래밍 ('무엇을' 중심)
  • 차이점
    • 절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있지만, 객체 지향에서는 데이터와 그 데이터에 대한 행동(메서드)이 하나의 객체안에 포함되어 있다

 

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 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 클래스에 음악 플레이어 관련된 데이터를 추출해서 객체로 사용

 

  • 메서드 추출
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");
        }
    }

각각의 기능을 메서드로 분리해 모듈화

  • 중복된 로직을 제거하고 메서드로 호출
  • 기능 수정시 메서드 내부만 수정
  • 메서드 이름이 추가되어 코드를 더 쉽게 이해

※ 메서드를 분리 했지만 데이터와 기능이 밀접하게 연관되어 있어 유지보수 관점에서 관리 포인트가 2곳으로 나눠져있다. 예를 들어, MusicPlayerData 클래스의 volume 변수의 이름이 변경되면 MusicPlayerMain3 에서 사용하고 있는 volume 변수를 전부 변경해줘야한다

클래스와 메서드 

클래스는 데이터인 멤버 변수 뿐 아니라 기능 역할을 하는 메서드를 포함할 수 있다

public class ValueData {
    int value;
}

public class ValueDataMain {
    public static void main(String[] args) {
        ValueData valueData = new ValueData();
        add(valueData);
        add(valueData);
        add(valueData);

        System.out.println("최종 숫자 : " + valueData.value);
    }

    static void add (ValueData valueData) {
        valueData.value++;
        System.out.println("숫자 증가 value = " + valueData.value);
    }
}

클래스는 속성(데이터, 멤버 변수)과 기능(메서드)을 정의할 수 있다

객체는 자신의 메서드를 통해 자신의 멤버 변수에 접근할 수 있다

객체의 메서드 내부에서 접근하는 멤버 변수는 객체 자신의 멤버 변수이다

객체 지향 프로그래밍

MusicPlayer 클래스를 객체 지향 프로그래밍으로 리사이클해보자

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 클래스에 음악 플레이어를 구성하기 위한 속성과 기능이 하나로 → 캡슐화

 

캡슐화란?

  • 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것
  • 내부 코드가 변하는 경우 다른 코드를 변경할 필요가 없음

'강의내용정리 > Java' 카테고리의 다른 글

[Java] 생성자  (0) 2025.01.20
[Java] 기본형과 참조형  (0) 2025.01.13
[Java] 클래스와 객체  (0) 2025.01.13