티스토리 뷰

1. 추상화란?

💡유연성을 확보하기 위해 공통적인 것을 추출하고 공통적이지 않은 것을 제거하는 것을 의미.
추상화 과정을 통해 객체(Object)가 도출이 되며, 이러한 객체를 생성하기 위해 클래스를 설계.
즉, 추상화는 현실세계의 복잡한 사건을 단순화하여 새로운 객체 지향 세계를 창조해나가는 과정.

2. 행위를 중심으로 추상화

2-1. 시스템 요구사항

1. 카레이서는 시동걸기, 엑셀레이터 밟기, 브레이크 밟기, 시동 끄기를 할 수 있다.
2. 자동차는 시동걸기, 앞으로가기, 멈추기 , 시동끄기를 할 수 있다.
3. 자동차는 처음에 멈춘 상태로 대기하고 있는다.
4. 카레이서는 먼저 자동차에 시동을 건다. 이미 걸려있는 경우 다시 시동을 걸 수 없다.
5. 카레이서가 엑셀레이터를 밟으면 시동이 걸린 상태일 경우 자동차는 시속이 10km/h 증가하며 앞으로 나간다.
6. 자동차가 달리는 중인 경우 브레이크를 밟으면 자동차의 시속은 0으로 떨어지며 멈춘다.
7. 브레이크를 밟을 때 자동차가 달리는 중이 아니라면 이미 멈춰있는 상태라고 안내한다.
8. 카레이서가 시동을 끄면 더 이상 자동차는 움직이지 않는다.
9. 자동차가 달리는 중이라면 시동을 끌 수 없다.

2-2. 필요한 객체

카레이서, 자동차

2-3. 상호작용

- 카레이서가 수신할 수 있는 메세지 (카레이서가 해야 하는 일)
1. 시동을 걸어라
2. 엑셀레이터를 밟아라
3. 브레이크를 밟아라
4. 시동을 꺼라

- 자동차가 수신할 수 있는 메세지 (자동차가 해야 하는 일)
1. 시동을 걸어라
2. 앞으로 가라
3. 멈춰라
4. 시동을 꺼라

1. 시동 걸기
 ---------                           ----------                           --------
 | 사용자 |  ---> 시동을 걸어라 ---> | 카레이서 | ---> 시동을 걸어라 --->   | 자동차 |
 ---------  <-------------------     ---------- <---------------------    ---------

2. 가속 하기
  ---------                                 ----------                         --------
  | 사용자 |  ---> 엑셀레이터를 밟아라 ---> | 카레이서 | ---> 앞으로 가라 --->   | 자동차 |
  ---------  <------------------------     ---------- <--------------------   ---------

3. 정지하기
  ---------                               ----------                     --------
  | 사용자 |  ---> 브레이크를 밟아라 ---> | 카레이서 | ---> 멈춰라 --->   | 자동차 |
  ---------  <-----------------------    ----------   <--------------   ---------

4. 시동 끄기
  ---------                        ----------                          --------
  | 사용자 |  ---> 시동을 꺼라 ---> | 카레이서 | ---> 시동을 꺼라 --->   | 자동차 |
  ---------  <-------------------   ---------- <------------------     ---------

2-4. 클래스 설계하기

1. 카레이서 클래스
 - 속성 : 자동차
 - 행위 : 시동을걸어라, 엑셀레이터를 밟아라, 브레이크를 밟아라, 시동을 꺼라.

2. 자동차 클래스
 - 속성 : 시동상태, 현재시속
 - 메소드 : 시동을걸어라, 앞으로 가라, 멈춰라, 시동을 꺼라

2-5. 결과

package com.ohgiraffers.section03.abstraction;

import java.util.Scanner;

public class Application {
    public static void main(String[] args) {

        // 기능을 통해 속성을 뽑아낸다.

        /* 수업목표. 객체지향 프로그래밍에 대해 이해하고 객체와 클래스를 설계해 추상화를 이해할 수 있다. */
        /* 필기.
        *   추상화란?
        *    공통된 부분을 추출하고 공통되지 않고 불필요한 부분을 제거한다는 의미를 가지며,
        *    추상화의 목적은 유연성을 확보하기 위함이다.
        *    유연성 확보는 여러 곳에 적용될 수 있는 유연한 객체를 의미하며, 재사용성이 높아질 수 있게 한다는 의미이다.
        *    (우리는 자연스러게 추상화를 이루었지만 그렇게 추상화된 클래스로 유연한 객체들을 생성할 수 있다.)
        *   // 영상 다시 보고 정리해보자!!
        *
        * 필기.
        *  1. 협력(애플리케이션에 구현에 필요한 객체간의 상호작용)
        *  2. 책임(객체가 협력에 참여하기 위해 수행해야할 책임(기능))
        *  3. 역할(객체의 책임이 모여 하나의 역할이 된다.)
        * */

        Scanner sc = new Scanner(System.in);
        CarRacer racer = new CarRacer();

        int input = 0;
        do {
            System.out.println("====== 카레이싱 프로그램 =======");
            System.out.println("1. 시동 걸기"); // 책임 4가지
            System.out.println("2. 전진");
            System.out.println("3. 정지");
            System.out.println("4. 시동 끄기");
            System.out.println("9. 프로그램 종료");
            System.out.print("메뉴 선택: ");
            input = sc.nextInt();
            switch (input) {
                case 1:
                    racer.startUp();
                    break;
                case 2:
                    racer.stopAccelator();
                    break;
                case 3:
                    racer.stepBreak();
                    break;
                case 4:
                    racer.turnOff();
                    break;
                case 9:
                    System.out.println("프로그램을 종료하겠습니다.");
                    break;
                default:
                    System.out.println("잘못된 메뉴를 선택하셨습니다.");

            }

        } while (input != 9);
    }
}
package com.ohgiraffers.section03.abstraction;

public class CarRacer {
    private Car myCar = new Car();  // 하브루타!

    public void startUp() {
        this.myCar.StartUp();
    }

    public void stopAccelator() {
        this.myCar.go();

    }

    public void stepBreak() {
        this.myCar.stop();
    }

    public void turnOff() {
        this.myCar.turnOff();
    }
}
package com.ohgiraffers.section03.abstraction;

public class Car {
    private boolean isOn = false;
    private int speed;

    public void StartUp() {
        if (this.isOn) {     // 시동이 걸려 있다면
            System.out.println("이미 시동이 걸려 있습니다.");
        } else {             // 시동이 꺼져 있다면
            this.isOn = true;
            System.out.println("시동을 걸었습니다. 부릉부릉!~");
        }
    }

    public void go() {
        if (isOn) {             // 시동이 켜져 있어야 달릴 수 있음
            speed += 10;
            System.out.println("차가 앞으로 움직입니다. 현재 속도는 " + this.speed);
        } else {
            System.out.println("차의 시동이 걸려있지 않습니다. 시동을 먼저 걸어주세요.");
        }
    }

    public void stop() {
        if (isOn) {
            if (speed > 0) {
                speed = 0;
                System.out.println("급 브레이크를 밟았습니다. 차를 멈춥니다.");
            } else {
                System.out.println("차는 이미 멈춰 있는 상태입니다.");
            }
        } else {
            System.out.println("차의 시동이 걸려있지 않습니다. 시동을 먼저 걸어주세요.");
        }
    }

    public void turnOff() {
        if (isOn) {
            if (speed > 0) {
                System.out.println("달리는 상태에서 시동을 끌 수 없습니다. 차를 우선 멈춰주세요.");
            } else {
                isOn = false;
                System.out.println("시동을 끕니다. 다시 운행하시려면 시동을 켜 주세요!~ Bye~");
            }
        } else {
            System.out.println("이미 시동이 꺼져 있는 상태입니다. 시동 상태를 확인해 주세요.");
        }
    }
}

racer 객체가 stack에서 myCar 객체의 주소값을 가지고 있고 또 myCar는 Car 값의 주소값을 가지고 있다.

3. 데이터를 중심으로 추상화

💡 객체지향에서 중요한 것은 행위(메소드)이지만, 데이터를 중심으로 추상화하여 객체 및 클래스를 설계하는 경우도 존재.
대표적으로 DTO 같은 클래스
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함