package chap_08.camera;

public abstract class Camera {

    public void takePicture() {
        System.out.println("사진을 촬영합니다.");
    }

    public void recordVideo() {
        System.out.println("동영상을 녹화합니다.");
    }

    public abstract void showMainFeature(); // 구현해야 하는 메소드
    // 이런 식으로 그냥 메인 카메라에서 설계도를 잡아주는 느낌이네 기본 기능 얹어주고
}
package chap_08.camera;

public class FactoryCam extends Camera{

    @Override
    public void showMainFeature() {
        System.out.println("화재 감지");
    }
}
package chap_08.camera;

public class speedCam extends Camera{
    @Override
    public void showMainFeature() {
        System.out.println("속도 측정, 번호 인식");
    }
}
package chap_08;

import chap_07.camera.SpeedCam;
import chap_08.camera.Camera;
import chap_08.camera.FactoryCam;

public class _01_AbstractClass {
    public static void main(String[] args) {
        // 데이터 추상화(Data Abstraction)
        //디테일한 부분은 숨기고 꼭 필요한 정보만 공개하는 과정
        // abstract
        // 추상 클래스 (아직 완성되지 않은 클래스)
        // 추상 메소드 (추상 클래스 내부에서만 사용 가능한, 껍데기만 있는 메소드)

        // 추상 클래스라 객체 생성 불가능 오 그냥 객체 생성 안 되게 하는 거임 ㅇㅇ
        // Camera camera =  new Camera();
        FactoryCam factoryCam = new FactoryCam();
        factoryCam.showMainFeature();

        SpeedCam speedCam = new SpeedCam();
        speedCam.showMainFeature();
        speedCam.recordVideo();
    }
}
package chap_08.reporter;

public interface Reportable {
    void report(); // 신고
}
package chap_08.reporter;

public class NormalReporter implements Reportable {

    @Override
    public void report() {
        System.out.println("일반 화재 신고를 진행합니다.");
    }
}
package chap_08.reporter;

public class VideoReporter implements Reportable{

    @Override
    public void report() {
        System.out.println("직전 30초 영상과 함께 신고를 진행합니다.");
    }
}