과정을 즐기자

추상 클래스와 인터페이스 본문

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");  // 부모 클래스의 일반 메소드를 구현할 수도 있다. (선택)
    }
}

'Java' 카테고리의 다른 글

자바가 Call By Reference가 아닌 이유  (0) 2023.08.05
enum class로 상수를 관리해야하는 이유  (0) 2023.06.22
Equals와 HashCode 비교  (0) 2022.12.13
Call by Value, Call by Reference  (0) 2022.10.25
static 변수와 static 메소드  (0) 2022.09.18