12. 인터페이스
- 클래스를 사용하는 쪽(
User)과 클래스를 제공하는 쪽(Provider) - 메서드를 사용(호출)하는 쪽(
User)에서는 사용하려는 메서드(Provider)의 선언부(메서드명, 타입)만 알면 됨
A.java
class A {
public void methodA(B b){
b.methodB();
}
}B.java
class B{
public void methodB() {
System.out.println("methodB()");
}
}Main.java
class Main {
public static void main(String[] args){
A a = new A();
a.methodA(new B());//B b = new B();
//a.methodA(b);와 같음
}
}실행 결과?
→ methodB() 출력

클래스 A(User)는 클래스 B(Provider)의 메서드를 호출함
→ 두 클래스는 서로 직접적인 관계가 있음
A.java
class A{
public void methodA(B b){
b.methodB();
}
}만약 클래스 B의 methodB( )의 선언부(메서드명, 매개변수 타입, 개수 등)가 변경되면 이를 사용(호출)하는 클래스 A도 따라서 변경해야함(메서드명, 매개변수 타입, 개수 등)
즉, 서로 직접적인 관계가 될 경우 한 쪽(Provider)이 변경되면 다른 한 쪽(User)도 변경되어야 한다는 단점이 있음
두 클래스 간의 관계를 간접적으로 변경하려면?
class B에 정의할 메서드를 추상 메서드로 정의하는 interface I를 정의
→ class B(Provider)의 선언과 구현을 class A와 분리시킴
I.java
inteface I {
public abstract void methodB();
}B.java
class B implements I {//interface I를 구현한 구현 클래스
public void methodB(){
System.out.println("methodB in B class");
}
}C.java
class C implements I {
public void methodB() {
System.out.println("methodB in C class");
}
}이제 class A는 class B 대신 interface I를 사용해서 작성할 수 있음
여기서 포인트는 class A를 작성하는데 있어서 class B는 사용되지 않았다는 것
따라서 class A와 class B의 관계는 직접적인 관계에서 간접적인 관계로 변경되었음
A.java
class A {
public void methodA(I i){
i.methodB();
}
class A는 인터페이스만 이용하기 때문에 실제로 사용되는 class B의 이름을 몰라도 됨
오직 직접적인 관계에 있는 interface I의 영향만 받음
→ Interface가 대신 해결해주기 때문에 class C든 class D든 A는 그 대상을 몰라도 되고,
class A와 class B의 결합도(Coupling)는 낮아졌음
Last updated on