하나의 클래스가 여러개의 인터페이스를 구현 할 수 있다.
클래스 A는 메소드 x나 z 중 하나라도 구현하지 않으면 오류가 발생한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package org.opentutorials.javatutorials.interfaces.example3; interface I1{ public void x(); } interface I2{ public void z(); } class A implements I1, I2{ public void x(){} public void z(){} } |
인터페이스도 상속이 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package org.opentutorials.javatutorials.interfaces.example3; interface I3{ public void x(); } interface I4 extends I3{ public void z(); } class B implements I4{ public void x(){} public void z(){} } |
인터페이스의 맴버는 반드시 public이다.
아래 코드는 오류를 발생한다.
인터페이스는 그 인터페이스를 구현한 클래스를 어떻게 조작할 것인가를 규정한다.
그렇기 때문에 외부에서 제어 할 수 있는 가장 개방적인 접근 제어자인 public만을 허용한다.
public을 생략하면 접근 제어자 default가 되는 것이 아니라 public이 된다.
왜냐하면 인터페이스의 맴버는 무조건 public이기 때문이다.
1 2 3 4 5 | package org.opentutorials.javatutorials.interfaces.example3; interface I5{ private void x(); } |
abstract vs interface
인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다.
인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면
추상 클래스는 일반적인 클래스다.
또한 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고,
추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.