인터페이스(interface)
인터페이스 역할은 어떤 클래스(객체)가 있고 그 클래스가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메소드들을 구현해야 한다.
인터페이스와 상속은 다르다.
상속이 상위 클래스의 기능을 하위 클래스가 물려 받는 것이라고 한다면, 인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다.
클래스를 선언 할 때는 class를 사용하지만 인터페이스는 interface를 사용한다.
상속은 extends를 사용하지만 인터페이스는 implements를 사용한다.
간단한 코드를 통해 살펴보자

클래스 A 뒤의 implements I는 이 클래스가 인터페이스 I를 구현하고 있다는 의미다.
그것은 3행의 interface I의 맴버인 public void z() 메소드를 클래스 A가 반드시 포함하고 있어야 한다는 뜻이다.
인터페이스의 의미를 좀 더 분명하게 하기 위해서 9행의 public void z(){}를 삭제하면, 컴파일 에러가 발생할 것이다.
그렇다면 인터페이스는 왜 사용하는 것일까?
예를 들어 계산기 기능이 필요한 프로젝트를 진행하는데 계산기 클래스를 개발자 A가 만들고, 사용하는 로직을 만드는 것은 개발자 B가 한다고 가정하자. 개발자 A는 setOprands에서 매개변수를 2개만 사용할 줄 알았는데 개발자 B는 메소드에서 변수 3개를 받을 것이라고 생각하여 코드를 작성하였다. 커뮤니케이션 문제로 이러한 문제가 발생하게 되고 프로젝트 진행에 차질이 생기게 된다.
이러한 문제를 해결하기 위해서는 협업자 상호간의 구체적인 약속을 해야 한다. 이럴 때 인터페이스를 사용한다!
아래 코드를 살펴보자

Calculator는 인터페이스 Calculatable를 구현하고있다.
인터페이스 안에 있는 메소드를 모두 구현하기 위해 아래와 같이 코드를 작성하였다.

위에 있는 인터페이스에 따라서 구현된 클래스가 작성되기 전
인터페이스를 구현한 가짜 클래스를 임시로 사용해서 만든 앱은 아래와 같다(CalculatorDummy)
class CalculatorDummy implements Calculatable{
public void setOprands(int first, int second, int third){
}
public int sum(){
return 60;
}
public int avg(){
return 20;
}
}
public class CalculatorConsumer {
public static void main(String[] args) {
CalculatorDummy c = new CalculatorDummy();
c.setOprands(10, 20, 30);
System.out.println(c.sum()+c.avg());
}
}
인터페이스에 따라서 구현된 클래스(Calculator)를 통해 아래와 같이 실제 로직을 작성하였다.

인터페이스 규칙
인터페이스에도 규칙이 있다.
1) 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있다.
interface I1{
public void x();
}
interface I2{
public void z();
}
class A implements I1, I2{
public void x(){}
public void z(){}
}
2) 인터페이스도 상속이 된다.
interface I3{
public void x();
}
interface I4 extends I3{
public void z();
}
class B implements I4{
public void x(){}
public void z(){}
}
3) 인터페이스의 멤버는 반드시 public이다.
interface I5{
private void x();
}
abstract vs interface
인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다. 인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면 추상 클래스는 일반적인 클래스다. 또 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고, 추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.
'TIL > Java' 카테고리의 다른 글
[Java] finally (0) | 2022.01.27 |
---|---|
[Java] 다형성(Polymorphism) (0) | 2022.01.27 |
[Java] abstract (0) | 2022.01.25 |
[Java] 패키지 (0) | 2022.01.21 |
[Java] 메소드 오버로딩(Method Overloading) (0) | 2022.01.20 |