JAVA

강한 결합과 약한 결합의 차이는 뭘까?

challnum 2024. 6. 10. 21:48
강한 결합이란 무엇이고 약한 결합은 무엇일까..?

 

강한 결합, 약한 결합.. 말로만 들으면 어떤 의미인지 짐작하기가 어렵다. 코드를 보기 전에 먼저 예시를 차로 들어서 설명을 하자면 

차에서 엔진은 쉽게 교체 할 수 없는 부품이고 차에 종속적인 부분이다. 하지만 바퀴의 경우 경우에 따라 바껴야 하며 차에 종속적이지 않다.

 

차로 예로 들었을때 엔진은 강한 결합이고, 바퀴는 약한 결합이라고 볼 수 있다. 마지막으로 하나의 예시를 더 든다면 테스크 탑의 경우 장소에 고정되기에 강한 결합이라고 볼 수 있고 노트북의 경우 장소에 고정적이지 않기 때문에 약한 결합이라고 볼 수 있다.

 

이제 코드를 본다면 강한 결합을 간단하게 아래의 코드로 설명할 수 있다.

 

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