강력한 결합(인터페이스 없는 경우)
우선 강한 결합력을 가지는 예제를 보자.
맥북을 샀는데 키보드는 반드시 애플의 매직 키보드만 써야한다고 생각해보자.
그렇게 되면 맥북 클래스는 반드시 매직키보드를 사용해야한다. 코드로 봐보자.
먼저 실행부분인 Program.java에서 맥북 클래스를 만든다. 이때 사용자는 단지 맥북 클래스만을 만들었을 뿐인데. MacBook.java를 보면 사용자가 시키지도 않은 MagicKeyBoard를 만들어버린다. 이는 MacBook클래스와 MagicKeyBoard클래스가 아주 강한 결합력을 가졌다고 할 수 있다.
사용자가 맥북으로(Program.java의 7번째 라인) typing을 하기 위해서는 반드시 매직키보드가 만들어져야하는 것이다. 심지어 사용자는 매직 키보드가 만들어 졌는지도 모른다(사용자는 매직키보드 구매를 원하지도 않았는데,,,걍 강매시켜버렸다고 생각해보자.)
이러한 상황은 어이가 없다. 맥북으로 타이핑을 하려면 반드시 매직 키보드를 써야하는 상황인 것이다. 사람들이 이에 거세게 불매하다가
애플사에서 이제 MacOS를 구현한 키보드라면 키보드는 딴거 써도 됩니다^^ 라고 했다 해보자.
MacOS라는 인터페이스를 구현했다면 이제 맥북으로 매직키보드 외의 키보드로도 타이핑을 할 수 있게 되는 것이다. 다음 코드를 보자.
느슨한 결합(인터페이스 사용)
맥북 클래스와 매직키보드 클래스 사이에 MacOS라는 인터페이스가 생겼다. 키보드 클래스가 MacOS를 구현(implements)했다면 맥북에다가 그 키보드로도 타이핑을 할 수 있게 된 것이다. 맥북 클래스의 setOS부분을 보면 MacOS형 타입으로 들어온 키보드를 참조한다. 이때 매개변수로 들어온 키보드가 MacOS를 구현하지 않았다면, 참조가 불가능하게 되어 해당 키보드는 맥북에서 사용할 수 없을 것이다.
이제 맥북과 매직키보드의 결합력이 확실히 낮아졌다. 맥북 객체를 만든다고 해서 매직키보드 객체를 생성하는 것이 아니다. 키보드는 사용자가 정한다. (Program.java를 보면 사용자가 직접 매직키보드 객체를 생성하여 맥북에 set하는 것을 볼 수 있다.)
이제 사용자가 어떤 키보를 생성할지 정할 수 있게 되었다.
이는 인터페이스를 사용해서 가능하게 된 것이다. 즉 객체들간의 결합력을 줄이고 더 유연한 프로그래밍이 가능해진다.
새로운 로지텍 키보드를 만들어서 적용한 예도 봐보자.
위에서 보는 것 처럼 로지텍 키보드로 MacOS를 구현하였고, 사용자는 이제 매직 키보드가 아닌 다른 키보드를 사용해서 타이핑 할 수 있게 되었다.
설정파일을 통해 키보드 변경하기
그런데 만약 키보드를 바꾸려면 Program.java에서 키보드 객체를 만들어서 설정해줘야 한다.
이것을 설정파일을 통해 키보드를 바꾸는 방식으로 코드를 수정해보자. Program.java의 코드만 수정하면 된다.
위의 코드는 setting.txt파일을 읽어서 그 정보를 바탕으로 키보드를 교체하는 코드이다.(원래는 txt파일이 아닌 xml또는 어노테이션을 사용함)
불러온 txt파일이 문자열을 바탕으로 클래스 정보를 일고, 그 클래스 정보를 바탕으로 객체를 만들어 인터페이스인 MacOS가 참조하게 한다.(MacOS 인터페이스형 참조변수는 본인을 구현한 모든 객체들을 참조할 수 있기 때문)
이렇게 되면 코드르 수정하지 않고 setting.txt파일의 내용만 바꾸면 키보드를 교체할 수 있다.
'java' 카테고리의 다른 글
Lambda 01 (0) | 2021.12.23 |
---|---|
Serializable (0) | 2021.11.21 |
자바의 다형성 (0) | 2021.03.25 |
Java - 4강 추상 클래스, 템플릿 메서드, final예약어 (0) | 2021.02.21 |
Java -3강 다형성, instanceof, 다운캐스팅 (0) | 2021.02.21 |