푸들푸들

[JAVA] 절차 지향, 객체 지향 프로그래밍 본문

SELF-STUDY/JAVA 김영한

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

COCO_develop 2025. 3. 26. 18:18
  • 절차 지향 프로그래밍
    • 실행 순서를 중요시. "어떻게" 중심
    • 데이터와 해당 테이터에 대한 처리 방식 분리
  • 객체 지향 프로그래밍
    • 객체들 간의 상호작용 중심. "무엇을" 중심
    • 데이터와 그 데이터에 대한 행동(메서드)이 하나의 객체 안에 포

- 대치되는 개념X

 

 

예제

--> 절차 지향

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

        // 볼륨 감소
        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 - 데이터 묶음

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

volum -> data.volume

 

-->  절차 지향 3 - 메서드 추출

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

 - 각 기능이 모듈화 됨 = 중복 제거, 유지보수 용이

 - but, 데이터와 기능이 분리되어있음 -> 데이터를 수정하면 기능도 따로 수정해야함

 

-> 클래스

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

클래스 내부에 멤버 변수 뿐만 아니라 메서드도 함께 포함할 수 O

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

  - add() 메서드에 static XX: 메서드는 객체를 생성해야 호출 가능. static이 붙으면 객체를 생성하지 않고도 메서드 호출 가능

 public class ValueObjectMain {
     public static void main(String[] args) {
        ValueObject valueObject = new ValueObject(); // 인스턴스 생성
        
        valueObject.add();
        valueObject.add();
        valueObject.add();
        
        System.out.println("최종 숫자=" + valueObject.value);
 	}
 }

 

예제

객체 지향 음악 플레이어

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

  - 캡슐화: 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것

->

public class MusicPlayerMain4 {
    public static void main(String[] args) {
        MusicPlayer player = new MusicPlayer();
        //음악 플레이어 켜기
        player.on();
        //볼륨 증가
        player.volumeUp();
        //볼륨 증가
        player.volumeUp();
        //볼륨 감소
        player.volumeDown();
        //음악 플레이어 상태
        player.showStatus();
        //음악 플레이어 끄기
        player.off();
    }
}

 

 

예제1

 public class RectangleProceduralMain {
     public static void main(String[] args) {
         int width = 5;
         int height = 8;
         int area = calculateArea(width, height);
         System.out.println("넓이: " + area);
     
         int perimeter = calculatePerimeter(width, height);
         System.out.println("둘레 길이: " + perimeter);

         boolean square = isSquare(width, height);
         System.out.println("정사각형 여부: " + square);
     }
     
     static int calculateArea(int width, int height) {
    	 return width * height;
     }
     
     static int calculatePerimeter(int width, int height) {
     	return 2 * (width + height);
     }
    
     static boolean isSquare(int width, int height) {
     	return width == height;
     }
 }

= 절차 지향 코드

 

-> 답: 객체 지향 코드

public class Rectangle {
     int width;
     int height;
     
   int calculateArea() {
     return width * height;
    }
    
   int calculatePerimeter() {
     return 2 * (width + height);
    }
    
   boolean isSquare() {
     return this.width == this.height;
    }
 }
public class RectangleOopMain {
    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);
    }
 }

 

예제2

-> 답

class Account {
    int balance; // 잔액

    void deposit(int amount) {
    	balance += amount;
    }
    void withdraw(int amount) {
    	if (balance >= amount) {
            balance -= amount;
    	} else {
     		System.out.println("잔액 부족");
        }
    }
 }
 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.balance);
    }
 }

- 결과

 

'SELF-STUDY > JAVA 김영한' 카테고리의 다른 글

[JAVA] 패키지  (0) 2025.04.04
[JAVA] 생성자  (0) 2025.04.03
[JAVA] 변수와 초기화  (1) 2025.03.25
[JAVA] 기본형, 참조형  (0) 2025.03.25
[JAVA] 클래스, 객체  (0) 2025.03.20