강한 결합이란 무엇이고 약한 결합은 무엇일까..?
강한 결합, 약한 결합.. 말로만 들으면 어떤 의미인지 짐작하기가 어렵다. 코드를 보기 전에 먼저 예시를 차로 들어서 설명을 하자면
차에서 엔진은 쉽게 교체 할 수 없는 부품이고 차에 종속적인 부분이다. 하지만 바퀴의 경우 경우에 따라 바껴야 하며 차에 종속적이지 않다.
차로 예로 들었을때 엔진은 강한 결합이고, 바퀴는 약한 결합이라고 볼 수 있다. 마지막으로 하나의 예시를 더 든다면 테스크 탑의 경우 장소에 고정되기에 강한 결합이라고 볼 수 있고 노트북의 경우 장소에 고정적이지 않기 때문에 약한 결합이라고 볼 수 있다.
이제 코드를 본다면 강한 결합을 간단하게 아래의 코드로 설명할 수 있다.
Mario 게임을 만든다고 가정을 해보자. Mario 게임의 방향키인 오른쪽, 왼쪽, 점프, 아래 총 4개의 조작 방법과 조작 방법을 눌렀을 때
아래와 같이 동작 방법이 정의 되어있다고 할 수 있다.
여기까지는 문제가 없어 보이지만 여기서 만약 Mario 게임이 아닌 다른 게임을 추가 한다고 했을 때 문제가 생긴다.
package com.udamy.springpractice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringPracticeApplication {
public static void main(String[] args) {
SpringApplication.run(SpringPracticeApplication.class, args);
var marioGame = new MarioGame();
var gameRunner = new GameRunner(marioGame);
gameRunner.run();
}
}
package com.udamy.springpractice;
public class GameRunner {
MarioGame game;
public GameRunner(MarioGame game){
this.game = game;
}
public void run() {
System.out.println("Running game: " + game);
game.up();
game.down();
game.left();
game.right();
}
}
package com.udamy.springpractice;
public class MarioGame {
public void up(){
System.out.println("Jump");
}
public void down(){
System.out.println("Go into a hole");
}
public void right(){
System.out.println("Go back");
}
public void left(){
System.out.println("Accelerate");
}
}
GameRunner의 코드 상에서는 이미 MarioGame을 선언한 후 해당 Class를 사용하도록 정의 되어 있기에 다른 클래스
GameRunner 생성자에서 사용할 수 없게 된다.
그렇다면 결국 아래와 같이 이미 선언된 MarioGame을 주석 처리 한 후 다른 Class를 넣어야 하는 데 이 경우 코드를 변경해야 하고
기존의 MarioGame은 동작하지 않게 된다. 이것이 강한 결합이다.
package com.udamy.springpractice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringPracticeApplication {
public static void main(String[] args) {
SpringApplication.run(SpringPracticeApplication.class, args);
// var marioGame = new MarioGame();
var superContraGame = new SuperContraGame();
// var gameRunner = new GameRunner(marioGame);
var gameRunner = new GameRunner(superContraGame);
gameRunner.run();
}
}
package com.udamy.springpractice;
public class SuperContraGame {
public void up(){
System.out.println("up");
}
public void down(){
System.out.println("Sit down");
}
public void right(){
System.out.println("Go back");
}
public void left(){
System.out.println("Shoot a bullet");
}
}
package com.udamy.springpractice;
public class GameRunner {
private SuperContraGame game;
// MarioGame game;
public GameRunner(SuperContraGame game){
this.game = game;
}
// public GameRunner(MarioGame game){
// this.game = game;
// }
public void run() {
System.out.println("Running game: " + game);
game.up();
game.down();
game.left();
game.right();
}
}
'JAVA' 카테고리의 다른 글
CodeTree 3일차 (0) | 2024.05.08 |
---|---|
CodeTree 2일차 (0) | 2024.05.07 |
이것이 자바다 7강 (0) | 2023.01.13 |
이것이 Java다 2강 (0) | 2023.01.03 |
이것이 Java다 1강 (0) | 2023.01.03 |