자바에서는 추상클래스를 지원합니다. 이는 클래스는 제공하지만 실제로 생성되면 안되는 클래스를 의미합니다. 따라서 해당 추상클래스의 인스턴스를 생성할 수 없으며 상속을 목적으로 사용됩니다.
public abstract class MyAbstractClass {
public abstract void abstractMethod();
public void method() {
System.out.println("this is method");
}
}
추상 클래스를 작성하기 위해서는 접근제어자와 class 키워드 사이에 abstract 키워드를 추가해주어야 합니다.
추상클래스는 구현부가 없는 함수를 작성할 수 있는데 이를 추상 메서드라고 부릅니다. 해당 메서드는 앞에 public abstract 키워드를 명시적으로 작성해 주어야합니다. 또한 추상 클래스를 상속 받는 일반 클래스들은 반드시 추상 메서드의 구현부를 작성해주어야 합니다.
앞서 추상 클래스 내부에는 구현부가 존재하는 메서드, 구현부가 없는 추상 메서드가 존재할 수 있다고 하였습니다. 이때 모든 메서드가 추상메서드인 추상클래스를 순수 추상 클래스라고 부릅니다. 순수 추상클래스는 다음과 같은 특징을 가지고 있습니다.
추상 클래스를 사용할때 마다 매번 public abstract 키워드를 명시해 가며 개발하면 매우 번거롭습니다. 따라서 추상클래스를 더 쉽게 사용하도록 java 에서는 Interface를 지원합니다.
public interface InterfaceOne{
void method1();
}
추상 클래스와의 차이점은 다음과 같습니다.
abstract class 대신 interface 키워드 사용public abstract 키워드 생략 가능💡참고
interface 파일 또한 확장자는.java입니다.
다형성을 위해 순수 추상 클래스를 사용해도 되고 인터페이스를 사용해도 됩니다. 하지만 인터페이스를 사용하는 것을 권장합니다. 왜그럴까요?
인터페이스를 만드는 이유는 인터페이스를 구현하는 클래스에서 인터페이스의 메서드를 반드시 구현 하라는 제약을 주는것입니다. 추상 클래스는 누군가 메서드의 몸통부를 구현할 수 있습니다. 이는 더이상 순수 추상클래스가 아닙니다. 인터페이스는 모든 메서드가 추상메서드라서 이러한 문제를 차단할 수 있습니다.
java 에서 여러 부모 클래스를 상속 받는 행위, 즉 다중상속은 금지되어 있습니다. 하지만 여러 인터페이스를 상속받을 수 있습니다.

한 클래스가 두 클래스를 상속 받는다고 가정해 봅시다. 이때 두 부모클래스에 동일한 스펙을 가진 메서드가 존재할 경우 자식클래스에서는 어떤 메서드를 상속받을지 결정해야 합니다. 이를 다이아몬드 문제 라고 합니다.
인터페이스는 이러한 문제가 발생할까요??
정답은 발생하지 않는다 입니다.

왜냐하면 구현의 책임은 interface 가 아닌 이를 상속받는 클래스에 존재하기 때문입니다. 또한 오버라이딩 메서드는 항상 우선순위를 가지기 때문에 상속받은 클래스의 메서드가 실행됩니다. 따라서 인터페이스는 다중 상속을 허용합니다.
열심히 하시는 모습이 보기 좋습니다. 덕분에 인터페이스에 대한 개념을 알 수 있었네요 :)