자바 기초 추상클래스, 인터페이스

웅평·2023년 12월 4일

추상메소드(abstract)

추상메소드
미래에 만들어질 자식클래스들이 가져야 할 공통적인 속성과 동작을 뽑아서 일반화(부모클래스)를 만들 때에 어떠한 메소드가 반드시 자식클래스들에게는 필요한데 이 시점(일반화)에는 메소드의 body를 구체화 할 수 없고 자식들이 반드시 오버라이딩 하게끔 하기 위해 메소드의 body를 쓰지 않고 메소드의 선언부만 적는다. 이때 메소드의 body가 없음을 표시해야함 그때 메소드 이름 왼쪽에 abstract 키워드를 붙임 이것을 추상메소드라 함

  • 추상화 클래스 : 아직 완성되지 않은 클래스 - 객체로 만들 수 없다
  • 추상 매소드 : 추상클래스 또는 인터페이스에서만 사용 가능, 껍데기만 있는 메소드
  • 데이터 추상화 : 몰라도 되는 부분은 숨기고 필요한 부분만 공개하는 과정
  • 추상메소드는 상속관계에서만 사용 가능하며 공통된 이름의 속성에서 부모클래스에서는 구체화하기 힘든 메소드이고 미래에 자식클래스에서 구체화가 필요한 메소드일 시 부모클래스에서 미리 일반화를 시켜 정의하는 메소드를 뜻하며 추상메소드는 body가 없어야하며 모든 자식클래스에서 반드시 오버라이딩해야한다
  • 추상클래스는 추상메소드를 갖는 클래스를 뜻하며 무조건 부모 클래스만 가능하다
  • 오버라이드한 메소드는 자식으로 선언하면 자식이 우선순위를 갖는다.
  • 오버라이드 했을때 부모의 메소드를 호출하고 싶으면 super.동일한이름메소드(); 하면된다.

추상 클래스의 장점

  1. 부모클래스에서 공통 부분을 구현과 설계가 완료되면 자식 클래스에서 상속받아 기능을 확장 시 이롭다.
  2. 자식 클래스에서 추상메서드를 반드시 구현하도록 강요한다. 이는 프로그램의 표준화 정도를 높인다.
  3. 공통 사항이 한곳에서 관리되어 개발 및 유지보수에 용이하다.
    배열 만들때 부모 클래스로 배열 만든다.

추상 메서드 선언 방법

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 선언

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(); // 구현해야 하는 메소드
}

인터페이스

  • 오직 추상 메서드와 상수(static final)만을 가지고 있는 것을 인터페이스라고 한다. 추상 클래스와 마찬가지로 인터페이스 또한 인터페이스의 선언되어있는 추상 메서드를 implements 하는 클래스에서 (반드시) 구현하도록 강제한다.
  • 추상메소드는 body를 구체화할 수 없다
  • 인터페이스는 abstract 생략이 가능하다
  • 인터페이스의 변수는 final이 생략이 가능하고 상수이다
  • 상수는 값이 있어야하고 변경 불가능이다
  • 다중 상속이 가능하다.

인터페이스 선언

접근제어자 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();
   }
}

참고
나도코딩 유튜브

0개의 댓글