-
KOSA - 5일차 - 2 Java 기초 | 객체 지향을 적용한 디자인 패턴(전략 패턴)KOSA 2024. 4. 2. 20:30728x90
1. 디자인 패턴이란?
- 디자인 패턴은 소프트웨어 디자인에서 주어진 컨텍스트 내에서 일반적으로 발생하는 문제에 대한 재사용 가능한 일반적인 솔루션
2. 디자인 패턴 사용 이유
- 유연성 : 디자인 패턴을 사용하면 코드가 유연해지며 개체가 서로 느슨하게 결합되어 코드를 쉽게 변경할 수 있으므로 올바른 수준의 추상화를 제공하는데 도움이 된다.
- 재사용성 : 느슨하게 결합되고 결합된 객체 및 클래스는 코드를 더 재사용할 수 있게 만들며 이러한 종류의 코드는 고도로 결합된 코드에 비해 테스트하기 쉽다.
- 공유 어휘 : 공유 어휘를 사용하면 코드와 생각을 다른 팀원과 쉽게 공유할 수 있으며 코드와 관련된 팀원 간의 이해를 높일 수 있다.
- 모범 사례 캡처 : 디자인 패턴은 문제에 성공적으로 적용된 솔루션을 캡쳐하며 이러한 패턴과 관련 문제를 학습함으로써 미숙한 개발자는 소프트웨어 디자인에 대해 많은 것을 배울 수 있다.
3. 디자인 패턴 분류
1. 생성패턴
- 생성 디자인 패턴은 인스턴스화 프로세스를 디자인하는 데 사용된다.
2. 구조패턴
- 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴이다. 예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴.
3. 행위패턴
- 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴이다. 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.
그중 이번 수업시간엔 전략패턴이라는 것을 다뤄보았다.
Strategy Patten(전략 패턴)이란?
- 같은 기능이지만 서로 다른 전략을 가진 클래스들을 각각 캡슐화하여 상호교환할 수 있도록 하는 패턴
수업시간에 각자 자유 주제로 전략패턴을 생각하며 코드를 짜보았다.
나는 이동수단(배, 비행기, 자동차)을 주제로 전략패턴을 짜보았다.
첫 번째로 클래스다이어그램이다.(draw.io로 그렸는데 일단 참고만..)
- Transportation(이동수단 인터페이스)
public abstract class Transportation { MovementBehavior movementBehavior; Fuel fuel; public void setMovementBehavior(MovementBehavior movementBehavior) { this.movementBehavior = movementBehavior; } public void setFuel(Fuel fuel) { this.fuel = fuel; } public void move(){ movementBehavior.move(); } public void fill(){ fuel.fill(); } }
- Car
public class Car extends Transportation{ public Car() { movementBehavior = new GroundMovement(); fuel = new Refueling(); } }
- Ship
public class Ship extends Transportation { public Ship() { movementBehavior = new WaterMovement(); fuel = new ShipFueling(); } }
- Airplane
public class Airplane extends Transportation{ public Airplane() { movementBehavior = new AirborneMovement(); fuel = new AircraftRefueling(); } }
- MovementBehavior(움직이는 인터페이스)
public interface MovementBehavior { public void move(); }
- WaterMovement
public class WaterMovement implements MovementBehavior{ public void move(){ System.out.println("배가 물 위를 항해합니다."); } }
- GroundMovement
public class GroundMovement implements MovementBehavior{ public void move(){ System.out.println("자동차가 땅 위에서 움직입니다."); } }
- AirborneMovement
public class AirborneMovement implements MovementBehavior{ public void move(){ System.out.println("비행기가 하늘 위를 날아다닙니다."); } }
- Fuel(연료 주입하는 방법이 담긴 인터페이스)
public interface Fuel { public void fill(); }
- ShipFueling
public class ShipFueling implements Fuel { public void fill(){ System.out.println("선박유를 주유합니다."); } }
- Refueling
public class Refueling implements Fuel { public void fill(){ System.out.println("기름을 주유합니다."); } }
- AircraftRefueling
public class AircraftRefueling implements Fuel { public void fill(){ System.out.println("항공유를 주유합니다."); } }
- TestDrive(main)
public class TestDrive { public static void main(String[] args) { Transportation car = new Car(); Transportation ship = new Ship(); Transportation airplane = new Airplane(); car.move(); car.fill(); car.setFuel(new AircraftRefueling()); car.fill(); System.out.println(); ship.move(); ship.fill(); System.out.println(); airplane.move(); airplane.fill(); System.out.println(); } }
사실 아직 정확하게 전략 패턴이 무엇인지 이해는 안 가지만, 코드를 자주 짜보면서 익혀보는 걸로 하자.
'KOSA' 카테고리의 다른 글
KOSA - 7일차 -1 Java 기초 | Lambda, Collection's Framework (0) 2024.04.04 KOSA - 6일차 Java 기초 | 생성자 (0) 2024.04.04 KOSA - 5일차 - 1 Java 기초 | 다형성, 인터페이스 (0) 2024.04.02 KOSA - 4일차 - 2 Java 기초 | 상속 (0) 2024.03.29 KOSA - 4일차 - 1 Java 기초 | Array, Method, 메모리 구조, String메서드 (1) 2024.03.29