[Spring 3-3] 결합도 예제

임승현·2023년 2월 10일

Spring

목록 보기
5/46

❌결합도가 높은 예제

※ src/main/java 폴더에 xyz.itwill01.old 패키지 생성

📢 결합도가 높은면 안좋은점!!

  1. 클래스 하나를 수정하면 다른 묶여있는 클래스도 수정해야함
  2. 비효율적

📃HelloMessageObject.java

※ xyz.itwill01.old 패키지에 HelloMessageObject.java 클래스 생성

package xyz.itwill01.old;
//
public class HelloMessageObject {
	public String getHelloMessage() {
		return "Hello!!!";
	}
}

📃MessagePrint.java

※ xyz.itwill01.old 패키지에 MessagePrint.java 클래스 생성

package xyz.itwill01.old;
//
public class MessagePrint {
	public void helloMessagePrint() {
		HelloMessageObject object=new HelloMessageObject();
		String message=object.getHelloMessage();
		System.out.println("message = "+message);
	}
	//Hi를 출력하기 위해 코드 뜯어고쳐야함
	public void hiMessagePrint() {
		HiMessageObject object=new HiMessageObject();
		String message=object.getHiMessage();
		System.out.println("message = "+message);
	}
}

📃MessagePrintApp.java

※ xyz.itwill01.old 패키지에 MessagePrintApp.java 클래스 생성

package xyz.itwill01.old;
//
public class MessagePrintApp {
	public static void main(String[] args) {
		MessagePrint print=new MessagePrint();
		//print.helloMessagePrint();
		print.hiMessagePrint();
	}
}

📢Hi!!! 메세지를 출력하기 위해서 2개의 클래스 수정함

📃HiMessageObject.java

※ xyz.itwill01.old 패키지에 HiMessageObject.java 클래스 생성

package xyz.itwill01.old;
//
public class HiMessageObject {
	public String getHiMessage() {
		return "Hi!!!";
	}
}

⭕결합도가 낮은 예제(Factory 클래스)

※ src/main/java 폴더에 xyz.itwill02.factory 패키지 생성

🌈인터페이스 생성

📢인터페이스를 상속받은 클래스는 반드시 인터페이스에 작성된 모든 추상메소드를 오버라이드 선언
→ 인터페이스를 상속받은 클래스에 메소드 작성 규칙 제공 - 인터페이스 : 작업명세서 역활

📢인터페이스로 참조변수를 생성하면 참조변수에는 인터페이스를 상속받은 모든 자식클래스의 객체를 저장 가능
→ 인터페이스로 생성된 참조변수로 추상메소드를 호출하면 참조변수에 저장된 자식클래스 객체의 오버라이드 메소드가 호출 - 오버라이드에 의한 다형성 : 객체간의 결합도 감소

📃MessageObject.java(인터페이스)

※ xyz.itwill02.factory 패키지에 MessageObject.java 인터페이스 생성

package xyz.itwill02.factory;
//
//인터페이스를 상속받은 클래스는 반드시 인터페이스에 작성된 모든 추상메소드를 오버라이드 선언
//→ 인터페이스를 상속받은 클래스에 메소드 작성 규칙 제공 - 인터페이스 : 작업명세서 역활
//인터페이스로 참조변수를 생성하면 참조변수에는 인터페이스를 상속받은 모든 자식클래스의 객체를 저장 가능
//→ 인터페이스로 생성된 참조변수로 추상메소드를 호출하면 참조변수에 저장된 자식클래스 객체의 오버라이드 메소드가 호출 - 오버라이드에 의한 다형성 : 객체간의 결합도 감소
public interface MessageObject {
	String getMessage();
}

🌈출력할 메세지 작성(오버라이드)

📢Factory 클래스에 의해 생성되어 제공되는 클래스는 반드시 인터페이스를 상속받아 작성

📃HelloMessageObject.java(클래스)

※ xyz.itwill02.factory 패키지에 HelloMessageObject.java 클래스 생성

package xyz.itwill02.factory;
//
//Factory 클래스에 의해 생성되어 제공되는 클래스는 반드시 인터페이스를 상속받아 작성
public class HelloMessageObject implements MessageObject {//Add unimplemented methods 클릭해서 오버라이드 생성
	@Override
	public String getMessage() {
		// TODO Auto-generated method stub
		return "Hello!!!";
	}
}

🌈Factory 클래스 생성

📢Factory 디자인 패턴을 이용하여 작성된 클래스 - Factory 클래스 또는 Provider 클래스
→ 프로그램 개발에 필요한 객체를 생성하여 제공하는 기능의 클래스 - 컨테이너(Container)

📃MessageObjectFactory.java(클래스)

※ xyz.itwill02.factory 패키지에 MessageObjectFactory.java 클래스 생성

package xyz.itwill02.factory;
//
//Factory 디자인 패턴을 이용하여 작성된 클래스 - Factory 클래스 또는 Provider 클래스
//→ 프로그램 개발에 필요한 객체를 생성하여 제공하는 기능의 클래스 - 컨테이너(Container)
public class MessageObjectFactory {
	private static MessageObjectFactory _factory;
	//
	private MessageObjectFactory() {//생성자를 은닉화(public → private)
		// TODO Auto-generated constructor stub
	}
	//
	static {
		_factory=new MessageObjectFactory();
	}
	//
	public static MessageObjectFactory getFactory() {
		return _factory;
	}
	//
	//Factory 클래스에 의해 제공될 객체를 구분하기 위한 상수(Constant)
	public static final int HELLO_MSG=1;
	public static final int HI_MSG=2;//HI!!! 메세지 출력을 위해서 추가
	//
	//매개변수로 전달받은 값을 비교하여 프로그램 개발에 필요한 객체를 생성하여 반환하는 메소드
	public MessageObject getMessageObject(int messageObject) {
		MessageObject object=null;
		switch (messageObject) {
		case HELLO_MSG:
			object=new HelloMessageObject();
			break;
		case HI_MSG://HI!!! 메세지 출력을 위해서 추가
			object=new HiMessageObject();
			break;	
		}
		return object;
	}
}

🌈객체를 저장하기 위한 필드

📃MessagePrint.java(클래스)

※ xyz.itwill02.factory 패키지에 MessagePrint.java 클래스 생성

package xyz.itwill02.factory;
//
public class MessagePrint {
	public void messagePrint() {
		//객체를 직접 생성하여 메소드 호출 - 객체간의 결합도가 높아 유지보수의 효율성 감소
		//MessageObject object=new HelloMessageObject();//결합도가 높아짐
		//
		//필요한 객체를 Factory 클래스로부터 제공받아 메소드 호출 - IoC(Inversion of Control)
		//→ IoC(Inversion of Control) : 객체간의 결합도를 낮춰 유지보수의 효율성 증가
		//MessageObject object=MessageObjectFactory.getFactory().getMessageObject(1);
		MessageObject object=MessageObjectFactory.getFactory().getMessageObject(2);//HI!!! 메세지 출력을 위해서 추가
		//
		//인터페이스로 생성된 참조변수의 추상메소드를 호출한 경우 참조변수에 저장된 자식클래스 객체의 오버라이드 메소드 호출 - 묵시적 객체 형변환 : 오버라이드에 의한 다형성
		String message=object.getMessage();
		System.out.println("message = "+message);
	}
}

🌈메세지 호출

📃MessagePrintApp.java(클래스)

※ xyz.itwill02.factory 패키지에 MessagePrintApp.java 클래스 생성

package xyz.itwill02.factory;
//
public class MessagePrintApp {
	public static void main(String[] args) {
		MessagePrint print=new MessagePrint();
		print.messagePrint();
	}
}

🌈Hi!!! 메세지 출력

📢Hi!!!을 출력하기 위해 위에 코드 수정
1. MessageObjectFactory.java
2. MessagePrint.java

📃HiMessageObject.java(클래스)

※ xyz.itwill02.factory 패키지에 HiMessageObject.java 클래스 생성

package xyz.itwill02.factory;
//
public class HiMessageObject implements MessageObject {
	@Override
	public String getMessage() {
		// TODO Auto-generated method stub
		return "Hi!!!";
	}
}

0개의 댓글