아무리 이론으로 설명을 해도 사실 나는 잘 이해 못해서, 코드로 추가 설명을 하고자 한다.
코드에 대한 설명은 아래와 같다
import java.io.*;
class CPU{
private DEEPCOOL_LS720_ARGB deepcooler;
public CPU(){
this.deepcooler = new DEEPCOOL_LS720_ARGB();
}
public void turnOn(){
deepcooler.spinning();
}
}
class DEEPCOOL_LS720_ARGB{
public void spinning(){
System.out.println("[DLA]쿨러 동작중");
}
}
class Thermalright_Peerless_Assassin_120_SE{
public void spinning(){
System.out.println("[TPA]쿨러 동작중");
}
}
위의 문제점은?
1. DEEPCOOL_LS720_ARGB클래스가 없으면 Person 클래스를 생성할 수 없다(= 정의할 수없다는 뜻)
2. 만약, DEEPCOOL_LS720_ARGB이 아닌 Thermalright_Peerless_Assassin_120_SE모델의 쿨러로 바꾸고 싶다면 많은 코드 수정이 필요하다.
import java.io.*;
class CPU{
private Thermalright_Peerless_Assassin_120_SE pearlessAssassinCooler; //(고친 부분)
public CPU(){
this.pearlessAssassinCooler
= new Thermalright_Peerless_Assassin_120_SE(); //(고친 부분)
}
public void turnOn(){
pearlessAssassinCooler.spinning(); //(고친 부분)
}
}
class DEEPCOOL_LS720_ARGB{
public void spinning(){
System.out.println("[DLA]쿨러 동작중");
}
}
class Thermalright_Peerless_Assassin_120_SE{
public void spinning(){
System.out.println("[TPA]쿨러 동작중");
}
}
=> 이러한 것이 바로 강한 결합(=유지보수 측면에서 매우 안좋음)이라고 한다.
interface Cooler{
void spinning();
}
class CPU{
private Cooler cooler;
public CPU(Cooler cooler){
this.cooler = cooler;
}
public void turnOn(){
cooler.spinning();
}
}
class DEEPCOOL_LS720_ARGB implements Cooler{
public void spinning(){
System.out.println("[DLA]쿨러 동작중");
}
}
class Thermalright_Peerless_Assassin_120_SE implements Cooler {
public void spinning() {
System.out.println("[TPA]쿨러 동작중");
}
}
=> 다시말해, CPU는 해당 cooler가 어느 모델인지 알필요가 없다는 뜻,,,(그냥 자신을 시원하게 해주는 대상이라면 OK...)