9osari.log
← 목록으로

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

2025년 4월 6일 · #java#김영한-java-기본

프로그래밍은 크게 두 가지로 나뉘는데 그 두가지를 절차지향 프로그래밍과 객체지향 프로그래밍 이라 한다.

절차지향 프로그래밍(Procedural Programming)

👉“순서대로 실행되는 일련의 과정(절차)을 중심으로 코드를 작성하는 방식”

객체지향 프로그래밍(OOP: Object-Oriented Programming)

👉“현실 세계처럼 객체를 중심으로 프로그램을 구성하는 방식” 객체는 속성과 기능만 존재

ex) 자동차라는 객체

속성: 색깔, 차종, 크기 기능: 엑셀, 브레이크, 문 열기 닫기

컴퓨터

속성: cpu, 램, 그래픽카드, 메인보드 기능: 킨다, 끈다

객체지향과 절차지향의 차이

절차지향 프로그래밍 실습

절차지향으로 음악플레이어를 만들어보자

요구사항

public class MusicPlayerData {
    int volume = 0;
    boolean isOn = false;
}
public class MusicPlayerMain2 {
    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");
        }
    }
}

음악 플레이어의 기능들을 메서드를 사용해 분리했다. 그로인해 모듈화 되었다

모듈화의 장점

👉레고를 조립하듯 필요한 레고들만 가져와 사용하면 된다. 즉 필요한 기능이 있는 메서드만 호출해 음악플레이어 프로그램을 만들 수 있다.

절차지향 프로그래밍의 한계

static void on(MusicPlayerData data) {
    data.isOn = true;
}

데이터와 기능 분리

on() 함수는 MusicPlayerData에 직접 접근해 데이터를 바꾸고 있음.

MusicPlayerData는 데이터를 담는 그릇역할만 진짜 행동들은 main이나 다른함수에서 하고있음

👉 데이터와 행동이 따로노니까 유지보수나 확장이 힘듦;;;

스파게티 코드

기능이 많아질 수록 사용하는 함수가 많아지고, main에서부터 순서(절차적)를 정확이 지켜야 안터지고 돌아감 누가 언제 뭘 바꿨는지 파악하기 힘들고 하나 고치면 여기저기 다 영향받음 → 유지보수 지옥 → 스파게티 코드

재사용 어려움

volumeUp(data) 같은 함수는 오직 MusicPlayerData만 쓰도록 설계

다른 프로그램에서 사용할 수 없어 따로 수정해 줘야함;;

재사용과 확장성 ⬇️

👉 절차지향은 프로그램이 단순할 땐 괜찮지만,

기능이 많아질수록 유지보수, 확장성, 재사용성에서 한계가 드러남.

객체지향 프로그래밍 실습

데이터와 기능을 하나로 묶어 음악플레이어라는 개념을 하나의 클래스에 담아보자 즉 음악플레이어라는 객체를 지향해보자

속성: volum, isOn

기능: on, off, volumeUp, volumeDown, showStatus

public class MusicPlayer {
    int volume;
    boolean isOn;

    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 static void main(String[] args) {
  MusicPlayer player = new MusicPlayer();

  player.on();
  player.volumeUp();
  player.volumeUp();
  player.volumeDown();
  player.showStatus();
  player.off();
}

MusicPlayer 객체를 생성하고 필요한 메서드만 호출하면 된다. 이걸 다른 사람이 사용하는 입장에서는 MusicPlayer 내부에서 어떻게 돌아가는지 몰라도 필요한 기능을 호출해 사용하면 된다.

캡슐화

MusicPlayer 클래스를 보면 마치 하나의 캡슐에 쌓여있는 것 같다 이렇게 속성과 기능을 하나로 묶어 필요한 기능을 메서드를 통해 외부에 제공하는걸 ‘캡슐화’ 라고 한다.


출처: 김영한의 실전 자바 - 기본편

···
← PREV [JAVA] 기본형과 참조형 NEXT → [JAVA] 생성자