객체 지향 프로그래밍

황상익·2024년 3월 26일

Inflearn JAVA

목록 보기
14/61
  1. 절치지향 프로그래밍 -> 시작

절차 지향 프로그래밍은 이름 그대로 절차를 지향.
프로그램의 흐름을 순차적으로 따르며, 처리.

  1. 객체지향 프로그래밍

객체지향 프로그래밍은 이름 그대로 객체를 지향. 쉽게 이야기해서 객체를 중요
객체지행 프로그래밍은 실제 세꼐의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식

public class MusicPlaterMain1 {
    public static void main(String[] args) {
        int volume = 0;
        boolean isOn = false;

        System.out.println("음악 플레이어 켜짐");
        volume++;
        System.out.println("음악 플레이어 볼륨" + volume);
        volume++;
        System.out.println("음악 플레이어 볼륨" + volume);
        volume--;
        System.out.println("음악 플레이어 볼륨" + volume);

        if (isOn) {
            System.out.println("음악 플에이어 On, 볼륨" + volume);
        }

        isOn = false;
        System.out.println("음악플레이어 off");
    }
}

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

public class MusicPlayerData {
    int volume = 0;
    boolean isOn = false;
}
public class MusicPlaterMain {
    public static void main(String[] args) {
        MusicPlayerData data = new MusicPlayerData();
       on(data);
       increaseVolume(data);
       decreaseVolume(data);
       showStatus(data);
       off(data);
    }

    public static void increaseVolume(MusicPlayerData data){
        data.volume++;
        System.out.println("음량 증가");
    }

    static void decreaseVolume(MusicPlayerData data){
        data.volume--;
        System.out.println("음량 감소");
    }

    public static void on(MusicPlayerData data){
        data.isOn = true;
        System.out.println("ON");
    }

    static void showStatus(MusicPlayerData data){
        if (data.isOn){
            System.out.println("ON");
        } else {
            System.out.println("OFF");
        }
    }

    static void off(MusicPlayerData data){
        data.isOn = false;
        System.out.println("OFF");
    }
}

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

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

절차 지향 프로그래밍의 한계
클래스를 사용해서 관련된 데이터를 하나로 묶고, 또 메서드를 사용해서 각각의 기능을 모듈
한계 -> 데이터와 기능이 분리.

클래스와 메서드

public class Value {
    int val;

    void add(){
        val++;
        System.out.println("val = " + val);
    }
}
public class ValObjMain {
    public static void main(String[] args) {
        Value value = new Value();
        value.add();
        value.add();
        value.add();
        System.out.println("value = " + value);
    }
}
public class ValueDataMain {
    public static void main(String[] args) {
        Value value = new Value();
        add(value);
        add(value);
        add(value);

        System.out.println("value = " + value.val);
    }

    static void add(Value value){
        value.val++;
        System.out.println("value.val = " + value.val);
    }
}


ValueData라는 인스턴스를 생성하고, 외부에서 ValueData.value에 접근해 숫자를 하나씩 증가.
add 기능을 추가해서 메서드를 함께 정의

참고)
여기서 만드는 add는 static 키워드 사용x


valueObj라는 객체를 생성 -> 이 객체는 멤버 변수 뿐만 아니라 내부 기능을 수행하는 add

인스턴스의 메서드 호출

인스턴스의 메서드를 호출하는 방법은 멤버 변수를 사용. .을 찍어서 객체에 접근한 다음 원하는 메서드 호출

객체 지향 프로그래밍

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 = " + volume);
    }

    void volumeDown(){
        volume--;
        System.out.println("volume = " + volume);
    }

    void setVolumeStatus(){
        if (isOn){
            System.out.println("ON");
        } else {
            System.out.println("OFF");
        }
    }
}
public class MusicPlayerMain {
    public static void main(String[] args) {
        MusicPlayer player = new MusicPlayer();
        player.on();
        player.volumeUp();
        player.volumeDown();
        player.setVolumeStatus();
        player.off();
    }
}

MusicPlayer를 사용하는 입장에서는 이제 MusicPlayer 내부에 어떤 속성이 있는지 몰라도 됨.
단순히 제공하는 기능 중에 필요한 기능을 호출해서 사용

캡슐화
MusicPlayer를 보면 음악 플레이어를 구성하기 위한 속성, 기능이 마치 하나의 캡슐에 쌓여있다.
속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것

문제풀이

public class Rectangle {
    public int width;
    public int height;
    public int area;

    public int calculateArea(int width, int height) {
        return width * height;
    }

    public int calculatePerimeter(int width, int height){
        return 2 * (width + height);
    }

    public boolean isSquare(int width, int height){
        if (width == height){
            return true;
        }
        return false;
    }
}
public class RectangleMain {
    public static void main(String[] args) {
        Rectangle r = new Rectangle();
        int area = r.calculateArea(5, 8);
        System.out.println("area = " + area);

        int perimeter = r.calculatePerimeter(5, 8);
        System.out.println("perimeter = " + perimeter);

        boolean square = r.isSquare(5, 8);
        System.out.println("square = " + square);
    }
}
public class Account {
    public int balance;


    public void deposit(int amount) {
        balance += amount;
    }

    public void withdraw(int amount) {
        if (balance >= amount) {
            balance -= amount;
        }
        System.out.println("잔액부족");
    }

    public void printBalance(){
        System.out.println(balance);
    }
}
public class AccountMain {
    public static void main(String[] args) {
        Account account = new Account();
        account.deposit(10000);
        account.withdraw(9000);
        account.withdraw(2000);
        System.out.println("account = " + account.balance);
    }
}
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글