-

객체간의 결합도와 다형성, 인터페이스

오늘은 "객체간의 결합도와 다형성"이라는 주제의 자바 세션을 들었다. 

다형성은 자바에서 핵심 개념이고, 다형성으로 코드의 결합도를 낮출 수 있다는 건 알기는 했지만 코드로 어떻게 적용해야 할지 어려웠었다. (개인 과제에서도 적용하지 못 했다ㅠㅠ)

이번 세션을 들으며 코드로 실습해보니 이해가 잘 돼서 감을 좀 잡았다😊 

그리고 의존성 주입 DI, 제어의 역전 IoC 은 이름은 생소한데 코드보면 어떤 느낌인지 알 것 같다ㅎ.. (스프링에서 중요한 개념이니까 더 공부 해야겠다.)


다형성

- 같은 타입의 참조변수가 여러가지 형태를 가질 수 있는 것

- 인터페이스상속을 통해 다양한 타입을 받을 수 있는 구조 설계함으로써 객체간의 결합도를 낮출 수 있다.

 

인터페이스 예시

가스 엔진을 사용하는 자동차의 전기 엔진이 개발되어 사용하려고 한다. 

 

* 인터페이스 사용 전

가스 엔진만 사용하는 Car 클래스에 전기 엔진 속성과 생성자, 기능을 추가해야 한다. (강결합, 유지보수 어려움)

package senario1.directBinding;

public class Car {
    // 속성
    private GasEngine gasEngine;
//    private ElectricEngine electricEngine; //수정
    // 생성자
    public Car(){
        this.gasEngine = new GasEngine();
//        this.electricEngine = new ElectricEngine(); //수정
    }
    public void driveWithGasEngine(){
        System.out.println("자동차가 주행됩니다. ");
        this.gasEngine.run();
    }
//    public void driveWithElectricEngine(){ //수정
//        System.out.println("자동차가 주행됩니다. ");
//        this.electricEngine.run();
//    }
}
package senario1.directBinding;

public class Main {
    public static void main(String[] args) {

        Car carA = new Car();
        carA.driveWithGasEngine();
//        carA.driveWithElectricEngine(); // 수정
    }
}

 

* 인터페이스 사용 후

새로운 엔진이 추가되어도 자동차 객체를 수정하지 않아도 된다.

-> 인터페이스를 통해 다형성을 구현함

package senario1.looseCoupling;

public interface Engine { // 엔진 인터페이스
    void run();
}
// 전기 엔진
package senario1.looseCoupling;

public class ElectricEngine implements Engine{

    @Override
    public void run() {
        System.out.println("전기 엔진이 동작합니다.");
    }
}

// 가스 엔진
package senario1.looseCoupling;

public class GasEngine implements Engine{
    @Override
    public void run() {
        System.out.println("가스 엔진이 동작합니다.");
    }
}

인터페이스를 implements로 받는다면, 인터페이스의 기능을 반드시 구현해야 한다. 

package senario1.looseCoupling;

public class Car {
    // 속성
    private Engine engine; // 속성으로 Engine 인터페이스를 가지고 있음

    // 생성자
    public Car(Engine engine){ // 구현체를 직접 의존하지 않고, 인터페이스를 의존
        this.engine = engine; 
    }
    // 기능
    public void drive(){
        this.engine.run();
    }
}
package senario1.looseCoupling;

public class Main {
    public static void main(String[] args) {
        GasEngine gasEngine = new GasEngine();
        ElectricEngine electricEngine = new ElectricEngine();

//		Car Car = new Car(electricEngine); //가스 엔진이 동작합니다.
        Car Car = new Car(electricEngine); //전기 엔진이 동작합니다.
        
        Car.drive();
    }
}

 

 

 

'TIL' 카테고리의 다른 글

29일차)  (0) 2024.12.13
스프링 컨테이너, 빈, 싱글톤  (0) 2024.12.11
알고리즘, 키오스크 과제 리팩토링  (0) 2024.11.27
자바 동등성과 동일성 , equals()와 hashCode()  (0) 2024.11.22
10일차)  (1) 2024.11.15