인터페이스는 abstract, final과 함께 자바의 대표적인 규제이다. 어떤 객체가 있고, 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메소드들을 구현해야 한다. 만약 인터페이스에서 강제하고 있는 메소드를 구현하지 않으면 이 애플리케이션은 컴파일이 되지 않는다.
interface I {
public void z();
}
class A implements I {
public void z() {}
}
class A implements I
는 클래스A가 인터페이스I를 구현하고 있다는 뜻으로, 즉 interface I의 멤버인 public void z()
메소드를 클래스A가 반드시 포함하고 있어야 한다는 것이다. 만약 클래스A 내의 public void z() {}
를 삭제하면 컴파일 에러가 발생할 것이다.
인터페이스와 상속은 다르다.
클래스 A는 인터페이스I를 '구현'한다.
public interface Calculatable{
public void setOprands(int first, int second, int third);
public int sum();
public int avg();
}
이 인터페이스를 따라서 클래스를 구현해보자.
class Calculator implements Calculatable {
int first, second, third;
public void setOprands(int first, int second, int third) {
this.first = first;
this.second = second;
this.third = third;
}
public int sum() {
return this.fist + this.second + this.third;
}
public int avg() {
return (this.fist + this.second + this.third)/3;
}
}
public calss CalculatorConsumer {
public static void main(String[] args) {
Calculator c = new Calculator();
c.setOprands(10,20,30);
System.out.println(c.sum() + c.avg());
}
}
인터페이스를 이용하면 서로 동일한 메소드를 만들도록 규약을 정해서 코드를 작성할 수 있으므로 다른 개발자가 구현하는 방식에 덜 영향을 받을 수 있다.
- 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있음
클래스 A는 메소드 x, z중 하나라도 구현하지 않으면 오류가 발생함
interface I1 {
public void x();
}
interface I2 {
public void z();
}
class A implements I1, I2 {
public void x() {}
public void z() {}
}
- 인터페이스도 상속이 됨
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이 된다.
interface I5 {
private void x();
]
인터페이스와 추상 클래스는 비슷한 듯 다르다.
Reference
1. interface