Skip to Content
Suffering builds character

12. 인터페이스

  1. 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)
  2. 메서드를 사용(호출)하는 쪽(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() 출력

interface1

클래스 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 Aclass B 대신 interface I를 사용해서 작성할 수 있음
여기서 포인트는 class A를 작성하는데 있어서 class B는 사용되지 않았다는 것

따라서 class Aclass B의 관계는 직접적인 관계에서 간접적인 관계로 변경되었음

A.java
class A { public void methodA(I i){ i.methodB(); }

interface2

class A는 인터페이스만 이용하기 때문에 실제로 사용되는 class B의 이름을 몰라도 됨 오직 직접적인 관계에 있는 interface I의 영향만 받음

→ Interface가 대신 해결해주기 때문에 class Cclass D든 A는 그 대상을 몰라도 되고, class Aclass B결합도(Coupling)는 낮아졌음

Last updated on