추상메소드
미래에 만들어질 자식클래스들이 가져야 할 공통적인 속성과 동작을 뽑아서 일반화(부모클래스)를 만들 때에 어떠한 메소드가 반드시 자식클래스들에게는 필요한데 이 시점(일반화)에는 메소드의 body를 구체화 할 수 없고 자식들이 반드시 오버라이딩 하게끔 하기 위해 메소드의 body를 쓰지 않고 메소드의 선언부만 적는다. 이때 메소드의 body가 없음을 표시해야함 그때 메소드 이름 왼쪽에 abstract 키워드를 붙임 이것을 추상메소드라 함
추상 클래스의 장점
추상 메서드 선언 방법
abstract class 클래스명{
//어떤 기능을 수행할지 설명 기입
abstract void 메서드명();
}
추상 메서드를 포함하지 않아도 abstract class로 선언하면 이는 추상 클래스로 인지된다. 즉, 상속을 통해 인스턴스를 생성해야 한다.
추상 클래스 선언
abstract class Animal { // 추상클래스 선언
public Sound()
public void action { eat(); }
abstract public void eat(); // 추상 메서드 선언
}
추상 클래스 생성 방법
pulbic class test {
public static void main(String[] args) {
Animal a;
a = Animal(); // 컴파일 오류
}
}

추상클래스 상송
추상클래스 상속시 abstract 선언
abstract class Animal { // 추상클래스 선언
public Sound()
public void action { eat(); }
abstract public void eat(); // 추상 메서드 선언
}
abstract class dog extends Animal { // 추상클래스 선언
@Override
public void eat() {
System.out.printin("먹는다");
}
}
pulbic class test {
public static void main(String[] args) {
dog a = new dog // 컴파일 오류
}
}
추상 클래스 상속시 자식클래스 오버라이딩 구현
abstract class Animal { // 추상클래스 선언
public Sound()
public void action { eat(); }
abstract public void eat(); // 추상 메서드 선언
}
abstract class dog extends Animal { // 추상클래스 선언
public String toString() { return "dog"; }
}
pulbic class test {
public static void main(String[] args) {
dog a = new dog // 인스턴스 생성
a.eat();
}
}
// 추상 클래스 생성
public abstract class Camera {
public void takePicture() {
System.out.println("사진을 촬영합니다.");
}
public void recordVideo() {
System.out.println("동영상을 녹화합니다.");
}
// 추상 메소드 생성 - 이름을 적고 메소드 선언후 ;
public abstract void showMainFeature(); // 구현해야 하는 메소드
}
인터페이스 선언
접근제어자 interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
...
public abstract 메소드이름(매개변수목록);
...
}
모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 한다
public interface Detectable {
// interface에서 만들어지는 모든 메소드는 public abstract이 들어간다
// 변수를 만들면 public static final 이 기본 형태이다
void detect(); // 감지
}
public interface Reportable {
void report(); // 신고
}
인터페이스의 구현
class 클래스이름 implements 인터페이스이름 { ... }
만약 모든 추상 메소드를 구현하지 않는다면, abstract 키워드를 사용하여 추상 클래스로 선언해야 합니다.
public class NormalReporter implements Reportable {
@Override
public void report() {
System.out.println("일반 화재 신고를 진행합니다.");
}
}
상속과 구현을 동시에
class 클래스이름 extend 상위클래스이름 implements 인터페이스이름 { ... }
인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 여러 인터페이스를 상속받을 수 있다.
// 추상 클래스 생성
public abstract class Camera {
public void takePicture() {
System.out.println("사진을 촬영합니다.");
}
public void recordVideo() {
System.out.println("동영상을 녹화합니다.");
}
// 추상 메소드 생성 - 이름을 적고 메소드 선언후 ;
public abstract void showMainFeature(); // 구현해야 하는 메소드
}
public class FactoryCam extends Camera implements Detectable, Reportable {
private Detectable detector;
private Reportable reporter;
// 객체를 만들때 detector, 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();
}
}
참고
나도코딩 유튜브