자바가 다중 상속을 지원하지 않는 것은 지금쯤 잘 알고있는 사실일 것이다.
하지만 다중 상속의 이점은 버릴 수 없는 가치있는 존재이다. 그 때문에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원한다.
public interface AClass {
// 상수
int a = 3;
// 추상 메서드
public abstract getA(a);
}
위와 같이 나타낼 수 있으며, 인터페이스를 선언할 때에는 접근 제어자와 함께 interface 키워드를 사용하면 된다.
단, 클래스와는 달리 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메서드는 public abstract이어야 한다.
모든 인터페이스에 공통으로 적용되는 부분으로 이와 같은 제어자는 생략 가능하다.
class 클래스이름 implement 인터페이스 이름 { ... }
위와 같은 형태로 자바에서 인터페이스를 구현한다 아래는 그 예제를 보여준다.
interface Book { public abstract void open(); }
class BookA implements Book {
@Override
public void open() {
System.out.println("촤라락");
}
}
class BookB implements Book {
@Override
public void open() {
System.out.println("샥");
}
}
public class Polymorphism {
public static void main(String[] args) {
BookA aBook = new BookA();
BookB bBook = new BookB();
aBook.open();
bBook.open();
}
}

만약 모든 추상 메소드를 구현하지 않는다면, abstract 키워드를 사용하여 추상 클래스로 선언해야한다.
: 인터페이스 타입으로 객체를 생성할 수 있으며 해당 객체에 구현 클래스로 인스턴스화 할 수 있다.
nterface Book { public abstract void open(); }
class BookA implements Book {
@Override
public void open() {
System.out.println("촤라락");
}
}
class BookB implements Book {
@Override
public void open() {
System.out.println("샥");
}
}
public class Polymorphism {
public static void main(String[] args) {
BookA aBook = new BookA();
BookB bBook = new BookB();
Book book = new Book() { // 인터페이스 인스턴스화
@Override
public void open() {
System.out.println("슥삭슥삭");
}
};
aBook.open();
bBook.open();
book.open();
}
}
기본적으로 인터페이스 타입으로 선언한 객체는 구현 클래스 내에서 생성한 메서드, 필드를 사용할 수 없다.
앞서 말했던 것처럼 추상메서드는 다중 상속이 불가능하지만 인터페이스는 다중 상속이 가능하다.
interface Book { public abstract void open(); }
interface Cover { public abstract void page(); }
interface Main extends Book, Cover {
}
public class Polymorphism implements Book, Cover{
public static void main(String[] args) {
}
@Override
public void open() {
System.out.println("촤라락");
}
@Override
public void page() {
System.out.println("31p");
}
}
위에서 보는 것처럼 클래스에서 인터페이스를 상속받을 때에는 implement, 인터페이스에서 인터페이스를 상속받을 때에는 extends 로 상속 받는다.
interface Book {
static String nameOfBook() {
return "자바 어렵눙...";
}
}
interface Book {
static String nameOfBook() {
return "자바 어렵눙...";
}
}
public class Polymorphism {
public static void main(String[] args) {
System.out.println(Book.nameOfBook());
}
}
보는 것처럼 코드가 간단해진 것을 볼 수 있다.


위 그림을 보면 private로 작성되어 외부에 공개되지 않게 한 모습을 볼 수 있다.