인터페이스란? 서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템을 말한다.
인터페이스는 어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의
메소드들을 구현해야 한다. (그 인터페이스를 구현한 클래스를 어떻게 조작할 것인가를 규정)
인터페이스와 상속은 다르다.
상속이 상위 클래스의 기능을 하위 클래스가 물려 받는 것이라고 한다면,
인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다.
인터페이스는 데이터를 저장할 수 없기 때문에 저장할 인스턴스 및 정적 필드를 선언할 수 없고
대신 상수 필드만 사용 가능하다. 따라서 static final을 생략해도 자동적으로 컴파일 과정에서 붙게 된다.
그리고 메소드는 최종적으로 객체에서 실행되므로 인터페이스의 메소드는 실행 블록이 필요없는
추상 메소드로 선언한다. 따라서 abstract를 생략해도 자동적으로 컴파일 과정에서 붙게 된다.
→ 추상 메소드에서는 { }를 이용한 메소드 구현이 불가능 하다 ex) public int plus(int i, int j){ }; (X)
+ 자바 8의 인터페이스에서는 default 메소드와 static 메소드를 사용할 수 있다.
static 메소드에서는 인터페이스명.메소드명();으로 사용해야 한다.
public interface Calculatable {
public void setOprands(int first, int second, int third) ;
// 5,6번째 줄에 {}가 붙으면 오류 발생
// 추상 메소드 -> Calculator에 구현 o
public int sum();
public int avg();
// default 메소드 -> Calculator에 구현 x
defualt int sum2(int x,int y){
return x+y;
}
// static 메소드 -> Calculator에 구현 x
public static int sum3(int x,int y){
return x+y;
}
// 클래스 Calculator는 인터페이스 Calculatable를 구현한다.
// Calculatable가 가진 기능들을 Calculator도 갖게 하겠다는 것이다.
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.first + this.second + this.third;
}
public int avg() {
return (this.first + this.second + this.third) / 3;
}
// default 메소드 오버라이딩 가능 -> Calculatable에서 default int sum2 메소드가 있어야 함
public int sum2(int x,int y){
return x+y;
}
}
public class CalculatorConsumer {
public static void main(String[] args) {
// 참조 변수의 타입으로 인터페이스도 사용 가능 -> 인터페이스가 가지고 있는 기능만 사용 가능
Calculator c = new Calculator();
// Calculatable c = new Calculator(); 도 가능
c.setOprands(10, 20, 30);
System.out.println(c.sum()+c.avg());
// static 메소드 사용법 : c.sum3(1,2); 불가능
Calculator.sum3(1,2);
}
}
// 결과 -> 80
인터페이스를 사용하는 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있다는 장점이 있다.
인터페이스는 하나의 객체가 아니라 여러 객체들을 사용할 수 있기 때문이다.
인터페이스의 규칙은 아래와 같다.
인터페이스의 멤버는 반드시 public이다.
하나의 클래스가 여러 개의 인터페이스를 구현할 수 있다.
인터페이스도 상속이 가능하다.
인터페이스와 abstract의 차이는 아래와 같다. 인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를
가지고 있는 반면 추상 클래스는 일반적인 클래스다. 또 인터페이스는 구체적인 로직이나 상태를
가지고 있을 수 없고, 추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.
즉, 추상 클래스에서는 메소드를 미리 구현해놓을 수 있지만 인터페이스에서는 메소드를 미리 구현할 수 없어
implements된 클래스에서 메소드를 구현해야 한다는 것이다.