Abstract 추상 클래스 & 메서드

  • 해당 클래스/메서드가 추상 클래스/메서드임을 명시하는 예약어
  • 추상 메서드(abstract method)
    • 선언부만 작성하고 구현부는 작성하지 않은 채 남겨둔 메서드
    • 접근제한자와 abstract 키워드의 순서는 상관없음
    • 오버라이딩 메서드에는 abstract를 사용하지 않음
  • 추상 클래스(abstract class)
    • abstract class로 선언된 클래스
    • 추상 클래스는 추상 메서드를 선언해 놓고 자식 클래스에서 메서드를 재구현하도록 유도하는 클래스, 미완성 설계도
    • 추상 클래스는 추상 메서드를 포함하지 않을 수 있음
    • 하지만 추상 메서드를 포함하는 클래스는 반드시 추상 클래스
    • 메서드와 내용이 추상적이기에 객체를 생성할 수 없음
    • static final이 아닌 필드를 가질 수 있고 public/protected/private
      모두 사용 가능
    • 여러 개의 추상 클래스를 상속 받을 수 없음(클래스 간 다중 상속x)
      • 클래스 간, 인터페이스 간 상속은 extends 키워드 사용
    • 추상 클래스의 장점
      • 공통 부분을 구현/설계함으로 개발, 유지보수 용이
      • 자식 클래스에게 추상 메서드를 반드시 구현하도록 강요함으로 표준화 정도를 높임
// Abstract Class/Method ex)
abstract class Animal { // abstract class로 추상 클래스 선언
    int position;

    // abstract method => 선언부만 작성
    // 접근제한자와 abstract의 순서는 상관x
    public abstract void speak(); 
    
    void run() { // 일반 메서드 작성 가능
        position++;
    }
}

public class Cat extends Animal { // 추상 클래스를 상속
    public void speak() { // 추상 메서드 구현
        System.out.println("야옹");
    }
}

인터페이스(Interface)

  • 추상 클래스와 비슷하게 다른 클래스 작성을 돕는 목적
  • 추상 클래스보다 추상화 정도가 높아 일반 메서드/변수 등을 가질 수 없음
  • 구현된 것이 아무것도 없는 기본 설계도
  • interface로 선언, static final 변수와 추상 메서드의 집합
    • 모든 메서드는 public abstract로 선언해야한다.
    • 모든 멤버 변수는 public static final로 선언해야한다.
    • 둘 다 컴파일 시 자동 생성되므로 생략가능
  • 인터페이스는 다중 상속을 지원, implements
  • 선 extends 후 implements
  • 디폴트 메서드(Default Method)
    • 인터페이스에 있는 구현 메서드, default로 선언 + 구현부 존재
    • java 8 이후 디폴트 메서드의 등장으로 추상 메서드만 존재할 수 있던 인터페이스에 구현 메서드도 존재
    • 객체지향 5대 원칙 중 하나인 개방 폐쇄 원칙(OCP)으로 인해 생겨남
    • 인터페이스에 추상 메서드를 추가시 모든 구현체에 구현을 해줘야하는 문제점을 디폴트 메서드를 사용해 추가 변경을 막아줌
      => OCP에서 확장에 개방되어 있고, 변경에 닫혀있는 코드를 설계할 수 있게 됨
// Interface ex)
public interface Person {
    // public static final 생략 가능
    public static final int eyes = 2;  

    // public abstract 생략 가능
    public abstract void talk();

    // default 메서드
    default void defaultMethod() {
        ...
    }
}

public class Heebum implements Person { // 인터페이스 상속
    public void talk() { // 추상 메서드 구현
        ...
    }
}

Leave a comment