TIL/JAVA

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

아람2 2024. 12. 6. 21:08
반응형

듣고 있는 강의 - 김영한의 실전 자바 기본편 

절차 지향 프로그래밍 - 시작 

절차 지향 프로그래밍

이름 그대로 절차를 지향한다, 실행 순서를 중요하게 생각하는 방식이다 

프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다 

"어떻게" 를 중심으로 프로그래밍 한다 

객체 지향 프로그래밍

이름 그대로 객체를 지향한다, 객체를 중요하게 생각하는 방식이다 

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

"무엇을" 을 중심으로 프로그래밍 한다 

둘의 중요한 차이

절차 지향 - 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다 

객체 지향 - 데이터와 그 데이터에 대한 행동 (메서드) 이 하나의 '객체' 안에 함께 포함되어 있다 

+ 객체란, 세상의 모든 사물을 단순하게 추상화해보면 속성 (데이터) 과 기능으로 나눌 수 있다 

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

절챠 지향 예제 코드 

public class MusicPlayerMain1 {
	public static void main(String[] args) {
        int volume = 0;
        boolean isOn = false;
	...
        volume++;
        System.out.println("음악 플레이어 볼륨 "+volume);
    ...

순서대로 프로그램이 작동한다 

객체 지향 예제 코드

public class MusicPlayerData {
    int volume; // 볼륨
    boolean isOn; // 전원
}

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

        data.volume = 0;
        data.isOn = false;
        ...
        data.volume++;
        System.out.println("음악 플레이어 볼륨 "+data.volume);
        ...

MusicPlayerData 라는 클래스를 만들어 음악 플레이어와 관련된 데이터는 해당 클래스에서 관리한다 

음악 플레이어에 사용되는 volumn, isOn 속성을 MusicPlayerData 의 멤버 변수에 포함했다

다양한 변수들이 추가되더라도, 음악 플레이어와 관련된 변수들은 MusicPlayerData data 객체에 속해있으므로 쉽게 구분할 수 있다 

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

package oop1;

public class MusicPlayerData {
    int volume; // 볼륨
    boolean isOn; // 전원
}

public class MusicPlayerMain3 {
    /* 음악 플레이어 만들기 - 절챠 지향 프로그래밍
    * 1. 음악 플레이어를 켜고 끌 수 있어야 한다
    * 2. 음악 플레이어의 볼륨을 증가, 감소할 수 있어야 한다
    * 3. 음악 플레이어의 상태를 확인할 수 있어야 한다 */
    /* MusicPlayerMain2 리팩토링 - 메서드 추출 */

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

        data.volume = 0;

        // 음악 플레이어 켜기
        on(data);

        // 볼륨 +1
        volumeUp(data);
        // 볼륨 +1
        volumeUp(data);
        // 볼륨 -1
        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("음악 플레이어를 종료합니다 ");
    }

    // Volume Up
    static void volumeUp (MusicPlayerData data) {
        data.volume++;
        System.out.println("음악 플레이어 볼륨 "+data.volume);
    }

    // Volume Down
    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 에서 각각의 메서드에 분리되어 있다 

 

데이터와 그 데이터를 사용하는 기능은 매우 밀접하게 연관되어 있기 때문에,

관련 데이터가 변경되면 메서드들도 함께 변경해야 한다 

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

 

객체 지향 프로그래밍이 나오면서 데이터와 기능을 온전히 하나로 묶어서 관리할 수 있다 

클래스와 메서드 

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

자바 같은 객체 지향 언어는 클래스 내부에 속성 (데이터) 과 기능 (메서드) 을 함께 포함할 수 있다 

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

 

객체 지향 프로그래밍

지금까지 개발한 음악 플레이어는 데이터와 기능이 분리되어 있었는데, 이제 데이터와 기능을 하나로 묶어서 

데이터와 기능을 온전히 하나의 클래스에 담을 것이다, 음악 플레이어라는 객체를 지향해 보자

음악 플레이어가 어떤 속성 (데이터) 을 가지고 어떤 기능 (메서드) 을 제공하는지에 초점을 맞추어야 한다 

이것을 어떻게 사용할지는 분리해서 생각하면 된다

음악 플레이어를 만들어서 제공하는 개발자와 음악 플레이어를 사용하는 개발자가 분리되어 있다고 생각하면 된다 

음악 플레이어

속성 - volumn, isOn

기능 - on(), off(), volumnUp(), volumnDown(), showStatus()

 

Music Player 의 기능과 속성을 담는 클래스 

package oop1;

public class MusicPlayer {
    /* 음악 플레이어의 모든 기능과 속성을 하나의 클래스에 담기 */
    int volume; // 볼륨
    boolean isOn; // 전원

    // 음악 플레이어 켜기
    void on () {
        isOn = true;
        System.out.println("음악 플레이어 시작 ");
    }

    // 음악 플레이어 끄기
    void off () {
        isOn = false;
        System.out.println("음악 플레이어를 종료합니다 ");
    }

    // Volume Up
    void volumeUp () {
        volume++;
        System.out.println("음악 플레이어 볼륨 "+volume);
    }

    // Volume Down
    void volumeDown () {
        volume--;
        System.out.println("음악 플레이어 볼륨 "+volume);
    }

    // 상태 확인
    void showStatus () {
        System.out.println("음악 플레이어 상태 확인 ");
        if (isOn) {
            System.out.println("음악 플레이어 ON, 볼륨 "+volume);
        } else {
            System.out.println("음악 플레이어 OFF ");
        }
    }
}

 

만들어진 MusicPlayer 의 기능과 속성을 이용해서 음악 플레이어를 사용하는 클래스 

MusicPlayer 를 사용하는 입장에서는 MusicPlayer 의 데이터인 volume, isOn 같은 데이터는 사용하지 않고 

MusicPlayer 가 제공하는 기능 중에 필요한 기능을 호출해서 사용하기만 하면 된다 

package oop1;

public class MusicPlayerMain4 {
    public static void main(String[] args) {
        /* MusicPlayer 를 어떻게 만들었는지 모르겠지만 (개발자A)
         * MusicPlayer 를 가지고 음악 플레이어를 만드는 (개발자B) 함수 */

        // MusicPlayer 객체 생성
        MusicPlayer player = new MusicPlayer();

        // 음악 플레이어 켜기
        player.on();
        // 볼륨 증가
        player.volumeUp();
        // 볼륨 증가
        player.volumeUp();
        // 볼륨 감소
        player.volumeDown();
        // 음악 플레이어 상태
        player.showStatus();
        // 음악 플레이어 끄기
        player.off();
    }
}

 

캡슐화 

MusicPlayer 를 보면 음악 플레이어를 구성하기 위한 속성과 기능이 마치 하나의 캡슐에 쌓여 있는 모습 같다 

이렇게 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라고 한다 

MusicPlayer 내부 코드 (ex. 필드 이름) 가 변하는 경우에 다른 (외부) 코드는 변경하지 않아도 된다 

단, 메서드 이름을 변경한다면 MusicPlayer 를 사용하는 곳의 코드도 변경해야 한다 

반응형

'TIL > JAVA' 카테고리의 다른 글

[JAVA] 생성자  (0) 2024.12.11
[JAVA] 어노테이션 Annotation  (2) 2024.12.10
[JAVA] 변수와 초기화  (0) 2024.12.02
[JAVA] 기본형과 참조형  (2) 2024.11.26
[JAVA][기본] 클래스 Class  (4) 2024.11.16