ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • KOSA - 5일차 - 2 Java 기초 | 객체 지향을 적용한 디자인 패턴(전략 패턴)
    KOSA 2024. 4. 2. 20:30
    728x90

    1. 디자인 패턴이란?

     - 디자인 패턴은 소프트웨어 디자인에서 주어진 컨텍스트 내에서 일반적으로 발생하는 문제에 대한 재사용 가능한 일반적인 솔루션

    2. 디자인 패턴 사용 이유

    1. 유연성 : 디자인 패턴을 사용하면 코드가 유연해지며 개체가 서로 느슨하게 결합되어 코드를 쉽게 변경할 수 있으므로 올바른 수준의 추상화를 제공하는데 도움이 된다.
    2. 재사용성 : 느슨하게 결합되고 결합된 객체 및 클래스는 코드를 더 재사용할 수 있게 만들며 이러한 종류의 코드는 고도로 결합된 코드에 비해 테스트하기 쉽다.
    3. 공유 어휘 : 공유 어휘를 사용하면 코드와 생각을 다른 팀원과 쉽게 공유할 수 있으며 코드와 관련된 팀원 간의 이해를 높일 수 있다.
    4. 모범 사례 캡처 : 디자인 패턴은 문제에 성공적으로 적용된 솔루션을 캡쳐하며 이러한 패턴과 관련 문제를 학습함으로써 미숙한 개발자는 소프트웨어 디자인에 대해 많은 것을 배울 수 있다.

    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();
        }
    }

     

     

    사실 아직 정확하게 전략 패턴이 무엇인지 이해는 안 가지만, 코드를 자주 짜보면서 익혀보는 걸로 하자.

Designed by Tistory.