두 대상(객체0간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
Ex) 사람 - 기계의 관계에서 기계를 바로 사용하기 보다 사람-껍데기-기계 관계라면, 기계를 사용하기 더 수월해지는데 껍데기=인터페이스라고 생각하면 된다.
- 중간 역할을 하는 매개체가 있기 때문에 변경에 유리해진다.
선언(설계)와 구현을 분리시킬 수 있게 한다.class B { public void method() { System.out,println("methodInB); } }
- 클래스 B가 있을 때 인터페이스를 이용하면 분리가 가능해진다.
interface I { public void method(); // class B의 메서드를 가지는 새로운 인터페이스를 선언 (= 선언부만 떼어내서 추상메서드로 만든다.) } class B implements I { public void method() { System.out.println("methodInB"); // class B가 인터페이스를 구현하도록 한다. } }
- 원래 껍데기+알맹이였던 class B를 interface I (껍데기) + class B (알맹이)로 분리한 것이다.
- 위의 코드는 유연하지 않고, 변경이 불리하다.
- 아래의 코드는 따로 분리가 되어있으므로 변경에 유리하고 유연한 코드가 된다.
인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 된다.(느슨한 결합)- A(User) -> B(Provider) : A가 B를 사용한다.(=A가 B에 의존한다.) / B를 C로 변경하려면, A도 코드를 변경해야한다.(강한 결합) / 속도가 빠름.
- A(User) -> I(B(Provider)) : 중간에 Interface가 있게 되면, A는 B와 직접적인 관계가 없고, Interface I와 관계가 있게 된다. / B를 C로 변경해도 A 코드를 변경하지 않아도 된다.(느슨한 결합) / 속도가 느림.
- 개발시간을 단축할 수 있다.
Ex) A(User) -> B(Provider) : A가 B를 사용하려면 먼저 B가 완성되어야 한다.
A(User) -> I(Interface) -> B(Provider) : B가 없어도 I만 있으면 된다.
- A는 추상메서드 호출 가능 / I는 추상메서드의 집합 / B는 추상메서드를 구현
- A가 B가 완성되지 않더라도 작성할 수 있게 된다.
- 변경에 유리한 유연한 설계가 가능하다.
- 표준화가 가능하다.
Ex) Java Application ---> DB(데이터베이스) : 데이터 모형 전달
Java Application <--- DB(데이터베이스) : 데이터 전달
- DB는 여러 사람이 data 공유 가능 but 종류가 다양해서 갑자기 바꾸게 되면 코드를 전체 다 바꿔야 한다.
- 그래서 중간에 Java의 표준인 JDBC라는 인터페이스를 두고 개발을 하면 DB가 변경되어도 OK.
- 서로 관계없는 클래스들의 관계를 맺어줄 수 있다.
Ex)
void repair (Tank t) { // Tank를 수리한다. } void repair (Dropship d) { // Dropship을 수리한다. }
- 오버로딩(같은 이름의 메서드)을 사용해야 한다.
void repair(GroundUnit gu) { // 매개변수로 넘겨진 지상유닛(GroundUnit)을 수리한다. }
- 다형성을 이용해서 GroundUnit을 만들어 SCV, Tank, Marine이 들어올 수 있다. (GroundUnit의 자손은 가능하나, AirUnit의 자손인 Dropship은 불가)
interface Repairable {} class SCV extends GroundUnit implements Repairable { //... } class Tank extends GroundUnit implements Repairable { //... } class Dropship extends AirUnit implements Repairable { //... }
- 수리가 가능한 것들만 관계를 따로 만들어준다.
- SCV, Tank, Dropship이 Repairable을 구현했다는 공통점이 생긴다.
void repari(Repariable r) { // Repairable을 구현한 것들만 가능. if (r instanceof Unit) { Unit u = (Unit) r; while (u.hitPoint != u.MAX_HP) { u.hitPoint++; // Unit의 HP를 증가시킨다. } } } // repair (Repairable r) {