Java

추상 클래스와 인터페이스

320Hwany 2022. 11. 10. 11:25

추상 클래스

  1. 추상 클래스는 변수를 가질 수 있다.
  2. 일반 메소드, 추상 메소드 둘 다 있을 수 있다. 자식 클래스에서 일반 메소드는 재정의 할 수도 있고 그냥 사용할 수도 있다.
    하지만 추상 메소드는 반드시 재정의 해야한다.
  3. 단일 상속을 지원한다.

코드로 이러한 특징들을 확인해보자

public abstract class AbstractParent {

    public int number = 10;  // 변수 선언 가능

    public void hello() {
        System.out.println("hello");    // 일반 메소드 구현가능
    }

    public abstract void hi();  // 추상 메소드 사용가능
}
public class AbstractChild extends AbstractParent {

    @Override
    public void hi() {
        System.out.println("hi");   // 추상 메소드를 자식 클래스에서 구현해야 한다. (필수)
    }

    @Override
    public void hello() {
        System.out.println("hello hello");  // 일반 메소드지만 재정의하여 사용할 수도 있다. (선택)
    }
}

인터페이스

  1. 인터페이스는 public static final로만 선언된 변수만 가질 수 있고 이는 생략할 수 있다.
  2. 기본적으로 메소드는 public abstract가 생략되어 있다. 추상 메소드로 자식 클래스에서 구현할 필요가 있다.
  3. 다중 상속을 지원한다.

자바 버전이 올라갈 수록 인터페이스가 추상클래스의 기능을 점점 더 갖게 되었다.
default 메소드로 인터페이스에서도 일반 메소드를 구현할 수 있게 되고 private으로 메소드를 정의할 수도 있게 되었다.

코드로 이러한 특징들을 확인해보자

public interface InterfaceParent1 {

    int number = 0; // public static final 생략 가능

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

    default void hi() {
        System.out.println("hi"); // default 메소드로 일반 메소드를 구현할 수도 있다.
    }

    private void hiHello() {
        System.out.println("hi hello");  // private 으로 일반 메소드를 구현할 수도 있다.
    }
}
public class InterfaceChild implements InterfaceParent1, InterfaceParent2 {

    @Override
    public void hello() {
        System.out.println("hello"); // 부모 클래스의 추상 메소드를 구현 해야한다. (필수)
    }

    @Override
    public void hi() {
        System.out.println("hi hi");  // 부모 클래스의 일반 메소드를 구현할 수도 있다. (선택)
    }
}