인터페이스는 애초에 미완성인 메서드를 가지고있기 때문에 동일한 이름의 필드 또는 메서드를 이용할 수 있다는 장점이있다.
즉, 역할과 구현을 분리시켜 놓았기때문에 동일한 역할이어도 구현을 다르게 할 수 있게된다.
따라서 인터페이스는 역할만을 가지고 있으며 그것에 의존하는 객체는 동일한 이름의 역할을 구현하게 된다.
public class InterfaceExample {
public static void main(String[] args) {
User user = new User(); // User 클래스 객체 생성
user.callProvider(new Provider()); // Provider 객체 생성 후에 매개변수로 전달
}
}
class User { // User 클래스
public void callProvider(Provider provider) { // Provider 객체를 매개변수로 받는 callProvider 메서드
provider.call();
}
}
class Provider { //Provider 클래스
public void call() {
System.out.println("무야호~");
}
}
- 위의 코드를 보면 따로 인터페이스 없이 구현이 되어있는데, 갑자기 Provider를 Provider2 로 변경해야 한다면 어떻게 될까
- 그렇게되면, User클래스의 callProvider의 참조변수,
user.callProvider(new Provider());안의 Provider를 바꿔야할 것이다.- 한개의 클래스만 표현하고 있지만, 수천개의 클래스를 바꿔야할 수도 있다.
따라서 다음과 같이 고칠 수 있다.
interface Cover { // 인터페이스 정의
public abstract void call();
}
public class Interface4 {
public static void main(String[] args) {
User user = new User();
user.callProvider(new Provider2());
}
}
class User {
public void callProvider(Cover cover) { // 매개변수의 다형성 활용
cover.call();
}
}
class Provider implements Cover {
public void call() {
System.out.println("무야호~");
}
}
class Provider2 implements Cover {
public void call() {
System.out.println("야호~");
}
}
//출력값
야호~
- 위의 코드에서 인터페이스는 call이라는 메서드의 역할만가지고 있다.
- 결국 인터페이스의 목적은 main 에서
user.callProvider(new Provider2());의 참조변수만을 바꾸면서 기능을 구현하는데에있다.- 기존코드는 User의 참조변수까지 바꿔야했지만, 인터페이스인 Cover만을 참조해주면 call 메서드에 한하여 여러가지로 구현이 가능하게된다.