Day 34

ChangWoo·2023년 5월 9일
0

자바의 정석

목록 보기
34/71
post-thumbnail

ch 7-39 인터페이스의 장점(1)

인터페이스의 장점

두 대상(객체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 코드를 변경하지 않아도 된다.(느슨한 결합) / 속도가 느림.

직접적인 관계의 두 클래스(강한 결합) / 인터페이스 미사용

  • A 클래스가 B클래스의 메서드를 직접 호출
  • 속도가 빠르지만, 유연하지 않고, 변경이 불리하다.

간접적인 관계의 두 클래스(느슨한 결합) / 인터페이스 사용

  • B 클래스를 B의 method()를 추상 메서드로 갖는 인터페이스 + 인터페이스를 구현하도록 한 것으로 분리했다.
  • 그에 따라 A 클래스도 B를 사용하는 것이 아닌 I를 사용하는 것으로 바뀌었다. (= B와 관계가 없어졌다.)
  • 나중에 C 클래스가 새로 생기더라도 A 클래스를 변경하지 않아도 OK.
  • 속도가 느리지만, 유연하고, 변경이 유리하다.

ch 7-39 인터페이스의 장점(2)

인터페이스의 장점

  • 개발시간을 단축할 수 있다.
    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) {
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글