자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 된다.
하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.
자바에서는 인터페이스(interface)라는 것을 통해 다중 상속을 지원하고 있다.
인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀
을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미한다.
추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함하지만, 인터페이스(interface)는 오로지 추상 메소드
와 상수
만을 포함한다.
자바8에 와서는 default 메소드
와 static 메소드
도 추가로 지원하고 있다.
💡인터페이스 멤버의 제약사항
1. 모든 멤버변수는 public static final
이어야 하며, 생략할 수 있다.
2. 모든 메소드는 public abstract
이어야 하며, 생략할 수 있다. (자바8 부터 static 메소드와 디폴트 메소드는 예외)
접근제어자 interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 타입 메소드이름(매개변수);
...
}
//인터페이스의 구현
calss 클래스이름 implements 인터페이스이름 {
...
}
상속(inheritance)과 인터페이스(interface)의 동시 사용으로 다중 상속과 같은 효과를 볼 수 있다.
interface School {
public static final int MAX_CLASS = 20;
public static final int MAX_PERSON_PER_CLASS = 40;
public abstract void printSchool();
}
class Student implements School {
public void printSchool() {
System.out.println("00 University");
}
}
class Person {
public String name;
public void printName() {
System.out.println("Name: " + name);
}
}
class Student2 extends Person implements School {
Student2(String name) {
this.name = name;
}
public void printSchool() {
System.out.println("11 University");
}
}
public class Main {
public static void main(String[] args) {
//인터페이스 기본 사용
Student s1 = new Student();
s1.printSchool(); //00 University 출력
System.out.println(s1.MAX_CLASS); //20 출력
System.out.println(s1.MAX_PERSON_PER_CLASS); //40 출력
//다중 상속처럼 사용하기
Student2 s2 = new Student2("A");
s2.printSchool(); //11 University 출력
s2.printName(); //Name: A 출력
}
}