24. 인터페이스
인터페이스에 대해 알아가보자.
24. 인터페이스
인터페이스
인터페이스의 존재이유
인터페이스를 사용하게 되면 프로그래밍의 일관성을 제공해준다.
- 메서드를 만들 때 동일한 기능을 만드는데 메서드가 다르다면 프로그래밍의 일관성이 사라진다.
- 호출도 따로따로 지정해주어야해서 불편함.
호출자와 피호출자
1
2
Worker w;
w = ? // Worker 인터페이스의 규칙에 따라 만든 클래스(+ 자식 클래스)의 인스턴스
인터페이스와 개발자
웹 어플리케이션을 실행하는 서버 구현 시…
- Servlet Container에 Server와 HttpSession이라는 인터페이스가 있고 이 서버를 구현하는 구현체를 개발자가 작성하기만하면된다.
- 내부적인 서버가 돌아가는 코드를 알 필요없이 해당 메서드만 호출하여 사용하면되기 때문에 편리하다.
default 메서드
default 메서드란?
- 추상 메서드만 사용 가능한 인터페이스 내에서 구현을 할 수 있게 해주는 문법
1 2 3 4 5 6
public interface MyInterface { // 기본 메서드 default void myMethod() { System.out.println("This is a default method"); } }
- ToolA와 ToolB는 f3이 필요 없지만 interface를 구현함으로써 f3 추상 메서드를 무조건 구현해야한다.
- 이를 default 메서드를 통해서 인터페이스에서 임시적으로 구현 후 ToolC에서 직접 구현하여 사용할 수 있다.
인터페이스 상속과 구현
왼쪽 처럼 인터페이스를 상속 받은 인터페이스 B에 대해 동작하는 원리를 알아보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
My obj = new My();
obj.m1();
obj.m2();
obj.x();
B obj2 = obj;
obj2.m2();
obj2.m1();
obj2.x(); // 에러
A obj3 = obj;
obj3.m1();
obj3.m2(); // 에러
obj3.x(); // 에러
인터페이스 다중 상속
왼쪽 처럼 interface를 다중 상속을 받은 인터페이스 C가 있다고 하자.
1
2
3
interface C extends A, B{
void m3();
}
위처럼 인터페이스에 인터페이스를 다중 상속 받을 경우 쉼표로 구분해 사용 할 수 있다.
x( ) 메서드 처럼 중복되어 있는 경우에도 최종 구현하는 클래스에서 하나만 만들면 되기에 문제가 없다.
다만…. 아래처럼 리턴 값이 다른 x( ) 메서드 일 경우에는 에러가 난다.
1
2
interface A{ int x(); } // 자바는 리턴 타입만 다른 메서드를 중복해서 만들 수 없다.(파라미터는 가능)
interface B{ void x(); } // Overloading 규칙을 어기기 때문에 실행 불가.
인터페이스 다중 구현
왼쪽 처럼 인터페이스를 다중 구현하는 클래스 My가 있다고 하자.
1
2
3
4
5
class My implements A, B{
void m1(){ - }
void m2(){ - }
void x(){ - }
}
위 처럼 인터페이스를 다중 구현 할 때도 마찬가지로 쉼표로 구분한다.
인터페이스의 상속처럼 x( ) 메서드 처럼 중복되는 경우 하나만 구현하면 되고 리턴 값이 다른 경우 오버로딩 규칙을 어기기 때문에 에러가 난다.
인터페이스와 추상 클래스
- 인터페이스와 추상 클래스를 같이 쓸 경우 모든 메서드를 전부 구현해야한다는 부담감이 줄어든다.
짤지식
- 인터페이스 = (Protocol= 프로토콜)이라고도 부름
- 인터페이스에 선언된 메서드는 인터페이스의 클래스 이름으로 호출, 클래스에 선언된 메서드도 클래스의 이름으로 호출하는게 좋다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.