본문 바로가기

인강 보습 (인프런,유데미,패스트캠퍼스)/나도코딩의 자바 기본편

추상 클래스와 인터페이스

1. 추상 클래스

 

_01_AbstractClass

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

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

        *추상 클래스지만 부모 클래스로 호출 가능. (Camera factoryCam = new FactoryCam(); ) 

 

Camera

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

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

    public abstract void showMainFeature(); // 구현해야 하는 메소드. 상속하는 자식 클래스에서 구현해야 함.
}

         *abstract, 즉 추상 클래스는 자식 클래스에서 구현

         *추상 클래스에서는 객체를 가질 수 없음        

 

FactoryCam

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

SpeedCam

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

 

 

2. 인터페이스 

 

import chap_08.reporter.*;

public class _02_Interface {
    public static void main(String[] args) {
        // 인터페이스
        Reportable normalReporter = new NormalReporter();
        normalReporter.report();

        Reportable videoReporter = new VideoReporter();
        videoReporter.report();

        *인터페이스를 통해 참조 가능 

 

2. 인터페이스 (2)

 

 

Detectable 인터페이스 

public interface Detectable {
    void detect(); // 감지
}

        *참고로 인터페이스 내의 모든 객체는 public abstract가 들어가는 것임 (따로 적어줄 필요는 없음)

        *인터페이스 내에 변수를 정의하는 것은 자동으로 public static final 형태임 (따로 적어줄 필요는 없음)

 

FireDetector 클래스

public class FireDetector implements Detectable {
    @Override
    public void detect() {
        System.out.println("일반 성능으로 화재를 감지합니다.");
    }
}

_02_Interface 클래스 

Detectable fireDetector = new FireDetector();
fireDetector.detect();

Detectable advancedFireDetector = new AdvancedFireDetector();
advancedFireDetector.detect();

FactoryCam 클래스 

public class FactoryCam extends Camera implements Detectable, Reportable {
    private Detectable detector;
    private Reportable reporter;

    public void setDetector(Detectable detector) {
        this.detector = detector;
    }

    public void setReporter(Reportable reporter) {
        this.reporter = reporter;
    }

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

    @Override
    public void detect() {
        detector.detect();
    }

    @Override
    public void report() {
        reporter.report();
    }

_02_Interface 클래스 

FactoryCam factoryCam = new FactoryCam();
factoryCam.setDetector(advancedFireDetector);
factoryCam.setReporter(videoReporter);

factoryCam.detect();
factoryCam.report();