Java - Object Oriented Programming

CYSSSSSSSSS·2024년 4월 17일
0

자바

목록 보기
16/26

Java

Object Oriented Programming

절차지향 프로그래밍

  • 순서를 중요시하는 프로그래밍
  • 프로그램 흐름을 순차적으로 진행하는 프로그래밍 방식

객체지향 프로그래밍

  • 객체를 지향하는 프로그래밍
  • 객체들 간의 상호작용을 중심으로 프로그래밍 하는 방식이다.

차이점

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

Procedural Programming ex

음악 플레이어 만들기

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

public class MusiPlayerMain1 {
    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("음악 플레이어가 종료됩니다.");

    }
}
  • 순서에 맞게 점진적으로 진행하는 프로그래밍 방식이다.

데이터 묶음

  • 앞서 작성한 음악 플레이어에 클래스를 도입해서 만들어보자
  • 음악 데이터에 관한 정보를 MusicPlayerData라는 클래스를 만들어서 사용해 보자
package oop1;

public class MusiPlayerMain2 {
    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("음악 플레이어가 종료됩니다.");

    }
}
  • 클래스화 하여 객체를 사용해서 데이터를 관리 한다면 좀더 관리하기 편하고 구분하기 쉬워진다.

메서드 추출

  • 위에 코드를 보면 볼륨증가/볼륨감소는 한번만 사용하는것이 아닌 여러번 사용가능한 기능들이다.
  • 이를 간단하게 메서드로 만들어서 호출만으로 기능을 사용하게 만들수 있다.
package oop1;

public class MusiPlayerMain2 {
    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는 데이터만 사용하고 있고 기능은 MusicPlayerMain에 관리 되어 있다.
  • 데이터와 메서드 관리를 두 파일에서 관리해줘야 한다.
  • 이러한 단점을 극복하는 프로그래밍 방식이 객체지향 프로그래밍 방식이다.

클래스와 메서드

  • 클래스는 데이터를 관리하는 멤버 변수 뿐만 아니라 메서드 관리도 가능하다.
package oop1;

public class ValueData {
    int value;

    // 메서드 작성
    void add(){
        value++;
        System.out.println("숫자 증가 value = " + value);
    }
}
  • 메서드는 객체를 생성해야 호출할 수 있다. static이 붙으면 객체를 생성하지 않고 메서드를 호출이 가능하다.
  • 멤버 변수 + 메서드를 같이 정의하면서 관리의 편리성의 늘어나면서 데이터와 기능을 응집시키면서 프로그래밍 수정에도 용의하다.

인스턴스 메서드 호출 과정

  • 객체 안에 정의된 메서드를 호출한다.
  • 해당 객체가 가르킨 주소에서 호출한 메서드를 찾는다.
  • 객체 안에서 사용되는 멤버 변수는 클래스 안에서 정의된 멤버 변수를 찾는다.
  • 함수를 정상적으로 실행 한다.

객체지향 프로그래밍

  • 객체지향으로 만들었던 음악 프로그램을 절차지향으로 바꿔보자

음악 플레이어

  • 속성 : volume , isOn
  • 기능 : on() , off() , volumeUp() , volumeDown() , showState()
package oop1;

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");
        }
    }
}
package oop1;

public class MusicPlayerMain4 {
    public static void main(String[] args) {
        MusicPlayer player = new MusicPlayer();
        // ON
        player.on();
        //up
        player.volumeUp();
        //up
        player.volumeUp();
        //down
        player.volumeDown();
        //state
        player.showStatus();
        //off
        player.off();
    }
}
  • 음악 플레이어를 사용하는 입장에서는 기능만 단순하게 사용하면 된다.

캡슐화

  • 위에 MusicPlayer는 속성과 기능을 하나에 감싸는 듯한 모습을 보이고 있다.
  • 속성과 기능을 하나로 묶에서 필요한 기능을 외부에 제공하는 것을 캡슐화 라고 한다.
  • 내부에서 기능을 수정하면 매우 편하게 바뀔수 있다.
profile
개발자 되고 싶어요

0개의 댓글

관련 채용 정보