오늘은 "객체간의 결합도와 다형성"이라는 주제의 자바 세션을 들었다.
다형성은 자바에서 핵심 개념이고, 다형성으로 코드의 결합도를 낮출 수 있다는 건 알기는 했지만 코드로 어떻게 적용해야 할지 어려웠었다. (개인 과제에서도 적용하지 못 했다ㅠㅠ)
이번 세션을 들으며 코드로 실습해보니 이해가 잘 돼서 감을 좀 잡았다😊
그리고 의존성 주입 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 |