Adventure Time - Finn 3
본문 바로가기
Spring

결합도(Coupling)

by hyun9_9 2024. 2. 21.

결합도(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)가 나오는 현상

'Spring' 카테고리의 다른 글

<bean>  (1) 2024.02.26
컨테이너  (0) 2024.02.25
프레임워크란  (0) 2024.02.19
Spring 경량  (0) 2024.02.17
Spring AOP  (0) 2024.02.16