개발을 하면서 익히 들어봤을 low coupling과 high cohesion 중 coupling에 관한 내용이다.
결합도가 약하게 결합되어 있을수록 하나의 객체에서 생긴 변화가 다른 객체에 끼칠 범위가 줄어든다. 소프트웨어를 개발하면서 변화라는 숙명은 피할 수가 없는데 약하게 결합될 수록 다른 객체에서 수정할 일이 적어지니 약한 결합도는 개발자로서는 밤을 새지 않기 위해 중요히 여겨야 할 사항이다.
class Moniter{
private NoteBook pc;
public void setPC(NoteBook pc){
this.pc = pc;
}
public void printDeviceModel(){
pc.printModel(); // >> "NoteBook"
}
}
모니터 객체는 NoteBook 객체와 강하게 결합되어 있다.
그 이유는 다른 객체타입을 pc라는 변수에 연결 할 수 없기 때문이다.
다른 객체를 연결하기 위해서는 객체의 타입을 바꿔줘야한다.
class Moniter{
private DeskTop pc;
public void setPC(DeskTop pc){
this.pc = pc;
}
public void printDeviceModel(){
pc.printModel(); // >> "DeskTop"
}
}
모니터는 어떤 노트북, 어떤 데스크탑이 와도 연결할 수 있는 범용성을 가져야한다. 때문에 위와 같이 Moniter에서 모든 NoteBook 타입을 DeskTop으로 바꾸는 일은 없어야한다. (모니터를 노트북에 연결하다가 데스크탑에다가 연결하기 위해 모니터 부품을 헤집는 일은 없어야한다.)
NoteBook 객체는 다음과 같다. (DeskTop 객체도 같은 맥락이다)
class NoteBook{
public void printModel(){
System.out.println("NoteBook");
}
}
강하게 결합되어 있던 모니터와 노트북을 어떻게하면 느슨하게 결합할 수 있을까.
-> 사실 노트북 객체와 데스크탑 객체는 추상적으로 하는 역할은 같다. 둘 다 각자 모델을 프린트하는 역할을 수행하고 있다. 때문에 퍼블릭 인터페이스를 기준으로 다형성을 통해 두 객체의 내부 구현을 구분할 필요가 있다.
interface Device{
public void printModel();
}
class Moniter{
private Device pc;
public void setPC(Device pc){
this.pc = pc;
}
public void printDeviceModel(){
pc.printModel();
}
}
class NoteBook implements Device{
public void printModel(){
System.out.println("NoteBook");
}
}
이렇게 하면 모니터에서 setPC(noteBook)과 printDeviceModel을 실행하면 "NoteBook"이 출력된다. 그리고 setPC(desktop)이면 "DeskTop"이 출력된다.
모니터는 Device라는 인터페이스를 의존한다. 즉 모니터는 Device의 구현체가 무엇이던 간에 printModel을 통해서 자신의 모델을 출력할 것이라는 걸 알고 있기 때문이다.