결합도(Coupling)에 대하여...(day61)
결합도를 낮추기위한 다향한 개발자들의 노력이 있어왔습니다
1) 인터페이스를 활용하는 방법
=> 객체가 변경되어도
메서드를 추가 변경하지 않아도 ㄱㅊ
2) 팩토리 패턴을 활용하는 방법
=>코드에 new가 있었는데, new 가 없어짐
코드에 new 가 없을수록 결합도가 낮은것!!
package test;
public class User {//Client(브라우저)
public static void main(String[] args) {
BeanFactory beanFactory=new BeanFactory();
Phone phone =(Phone)beanFactory.getBean(args[0]);
phone.powerOn();
phone.call();
phone.powerOff();
// Phone phone =new GalaxyPhone();
// phone.powerOn();
// phone.call();
// phone.powerOff();
//[결론]
//유사한 서비스를 제공하는 객체들끼리는
//메서드 시근니쳐를 맞춰줄 필요가 있다!
//-> 메서드 시그니쳐를 강제
//-> 인터페이스 설계가 필요!
//=> "다형성"을 실현하여 코드에 적용한 대표적인 사례!!!
// :똑샅은 메서드를 호출했어도,
// 메서드를 수행하는 주체(주어,대상)에 따라
// 다른 결과(output)가 나오는 현상
}
}
package test;
public class IPhone implements Phone{
private String userName;
public void initMethod() {
this.userName="홍길동";
}
public void powerOn() {
System.out.println("아이폰 전원 ON");
}
public void powerOff() {
System.out.println("아이폰 전원 OFF");
}
public void call() {
System.out.println("아이폰 전화");
}
}
package test;
public class GalaxyPhone implements Phone{
public void turnOn() {
System.out.println("갤럭시 전원 ON");
}
public void turnOff() {
System.out.println("갤럭시 전원 OFF");
}
public void talk() {
System.out.println("갤럭시 전화 통화 연결");
}
@Override
public void powerOn() {
// TODO Auto-generated method stub
System.out.println("갤럭시 전원 ON");
}
@Override
public void powerOff() {
// TODO Auto-generated method stub
System.out.println("갤럭시 전원 OFF");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("갤럭시 전화 통화 연결");
}
}
package test;
public interface Phone {
//인터페이스
//== 아, 메서드 오버라이딩 강제하려는거구나!
//== 메서드 시그니쳐를 맞춰야하는 상황인가보다~
//"다형성"을 코드에 적용한 사례
public void powerOn();
public void powerOff();
public void call();
}
package test;
import java.util.ArrayList;
//Bean == 객체 == 기능단위
//기능 단위로 코드를 작성해놓은 객체
public class BeanFactory {
//팩토리 패턴을 구현하기 위한 크랠스
//팩토리 패턴이란?
//: 객체명을 요청하면
//해당객체를 제공하는 것
// //버전 1
// public Phone getPhone(String phoneName) {
// if(phoneName.equals("iphone")) {
// return new IPhone();
// }
// else if(phoneName.equals("galaxy")) {
// return new GalaxyPhone();
// }
// return null;
// }
//
// //버전 2
// public Phone getPhone(String phoneName) {
//
// phoneName=phoneName.toUpperCase();
//
// if(phoneName.equals("IPHONE")) {
// return new IPhone();
// }
// else if(phoneName.equals("GALAXY")) {
// return new GalaxyPhone();
// }
// return null;
// }
//버전 3
private ArrayList<String> iDatas;
private ArrayList<String> gDatas;
public BeanFactory() {
iDatas= new ArrayList<String>();
iDatas.add("IPHONE");
iDatas.add("APPLE");
gDatas = new ArrayList<String>();
gDatas.add("GALAXY");
gDatas.add("SAMSUNG");
}
private boolean isIPHONNE(String phoneName) {
for(String data:iDatas) {
if(phoneName.equals(data)) {
return true;
}
}
return false;
}
private boolean isGALAXY(String phoneName) {
for(String data:gDatas) {
if(phoneName.equals(data)) {
return true;
}
}
return false;
}
//Object == 자바의 최상위 클래스
public Object getBean(String beanName) {
beanName=beanName.toUpperCase();
if(isIPHONNE(beanName)) {
return new IPhone();
}
else if(isGALAXY(beanName)) {
return new GalaxyPhone();
}
return null;
}
}
[결론]
유사한 서비스를 제공하는 객체들끼리는
메서드 시근니쳐를 맞춰줄 필요가 있다!
-> 메서드 시그니쳐를 강제
-> 인터페이스 설계가 필요!
=> "다형성"을 실현하여 코드에 적용한 대표적인 사례!!!
:똑샅은 메서드를 호출했어도,
메서드를 수행하는 주체(주어,대상)에 따라
다른 결과(output)가 나오는 현상