본문 바로가기
[김영한 자바 강좌] 정리/기본

[김영한의 실전 자바 (기본편)] 섹션3 - 객체지향 프로그래밍

by haeyoon 2024. 4. 20.

1. 절차 지향 프로그래밍 

[코드1]

package oop1;

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

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

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

→ 출력:

 

[코드2] 각각의 기능을 모두 메서드화

package oop1;

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

public class MusicPlayerMain2 {
    public static void main(String[] args) {
        MusicPlayerData data = new MusicPlayerData();
        // 음악 플레이어 켜기
        on(data);
        //볼륨 증가
        volumeUp(data);
        //볼륨 감소
        volumeDown(data);
        //음악 플레이어 상태
        showStatus(data);
        //음악 플레이어 끄기
        off(data);
    }
    static void off(MusicPlayerData data) {
        data.isOn = false;
        System.out.println("음악 플레이어를 종료합니다.");
    }
    static void on(MusicPlayerData data) {
        data.isOn = true;
        System.out.println("음악 플레이어를 시작합니다.");
    }

    static void volumeDown(MusicPlayerData data){
        data.volume--;
        System.out.println("음악 플레이어 볼륨:" + data.volume);
    }
    static void volumeUp(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)와 기능(MusicPlayerMain2)이 따로 분리되어 있다

 


 

2. 클래스와 메서드

[코드1]

package oop1;

public class ValueData {
    int value;
}
package oop1;

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

 

 = 데이터인 value와 value의 값을 증가시키는 기능인 add()메서드가 서로 분리되어 있다

 

[코드2]

자바와 같은 객체 지향 언어는 클래스 내부에 속성(Data)와 기능(메서드)를 함께 포함할 수 있다.

= 객체 지향 프로그래밍

package oop1;

public class ValueData {
    int value;

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

+ 객체를 생성해야 하는 add() 메서드에는 static 키워드를 사용하지 않는다

package oop1;

public class ValueDataMain {
    public static void main(String[] args) {
        ValueData valueData = new ValueData();
        valueData.add();
        valueData.add();
        valueData.add();
        System.out.println("최종 숫자 = "+ valueData.value);

    }
}


 

3. 객체 지향 프로그래밍

음악플레이어 만들기~

 - 속성: volume, isOn

 - 기능: on(), off(), volumeUp(), volumeDown(), showStatus()

[코드1]

package oop1;

public class MusicPlayer {
    int volume = 0;
    boolean isOn = false;

    void off() {
        isOn = false;
        System.out.println("음악 플레이어를 종료합니다.");
    }
    void on() {
        isOn = true;
        System.out.println("음악 플레이어를 시작합니다.");
    }
    void volumeDown(){
        volume--;
        System.out.println("음악 플레이어 볼륨:" + volume);
    }
    void volumeUp(){
        volume++;
        System.out.println("음악 플레이어 볼륨:" + volume);
    }
    void showStatus(){
        System.out.println("음악 플레이어 상태 확인");
        if(isOn){
            System.out.println("음악 플레이어 On, 볼륨: "+ volume);
        } else{
            System.out.println("음악 플레이어 Off, 볼륨: ");
        }
    }
}

자신의 변수를 사용하기 때문에 각 함수의 매개변수가 필요 없다.

 

∴ MusicPlayer 클래스에 음악플레이어에 필요한 속성과 기능을 모두 정의했다. 음악플레이어를 사용하는데 필요한 모든 속성과 기능을 하나의 클래스에 포함했다.

=캡슐화

package oop1;

public class MusicPlayerMain4 {
    public static void main(String[] args) {
        MusicPlayer player = new MusicPlayer();
        player.on();
        player.volumeUp();
        player.volumeUp();
        player.volumeDown();
        player.off();
    }
}

 

[예제] 직사각형의 넓이, 둘레, 정사각형 여부 구하기

package oop1.ex;

public class Rectangle {
    int width ;
    int height ;

    int calculateArea (){
        return width * height;
    }
    int calculatePerimeter (){
        return 2 * (width+height);
    }
    boolean isSquare(){
        return width == height;
    }

}
package oop1.ex;

public class RectangleMain {
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.width = 5;
        rectangle.height = 8;

        int area = rectangle.calculateArea();
        System.out.println("넓이: "+ area);

        int perimeter = rectangle.calculatePerimeter();
        System.out.println("둘레: "+ perimeter);

        boolean square = rectangle.isSquare();
        System.out.println("정사각형 여부: "+ square);

    }
}