부트캠프(17일차)

성준혁·2022년 11월 22일
0
post-thumbnail

오늘은 부트캠프 17일차이다. 오전에는 OOP 4일차 수업을 듣고 SOLID원칙 중 LSP, DIP, 추가적으로 템플릿 메서드에 대해 공부하고 정리를 하였고, 오후에는 내일부터 프로젝트를 진행하게 되서 자바 기초 문법을 다시 복습을 하였다. 파이썬과 자바, 알고리즘을 같이 공부하다보니 뒤죽박죽 섞이는 느낌이 강하지만 그래도 다양하게 알고 가는 것이 많아 좋았다.

오늘 배운것

1. LSP(Liskov Substitution Principle, 리스코프 치환 원칙)

-상위 타입의 객체를 하위 타입의 객체로 치환해도, 프로그램은 정상적으로 동작해야 한다.
-아래 예제에서 정사각형-직사각형 관계보다 포괄적으로 도형을 상속하도록 리팩터링 하고, 하위 클래스는 상위 클래스에서 정의한 원칙에 벗어나지 않도록 해야 한다.

  • LSP 위배
// 직사각형
class Rectangle {
    int width = -1;
    int height = -1;

    public getWidth() {
        return this.width;
    }
    public setWidth(int w) {
        this.width = w;
    }
        public getHeight() {
        return this.height;
    }
    public setHeight(int h) {
        this.height = h;
    }
    public getArea() {
        return this.width * this.width;
    }
}
//직사각형을 상속하는 정사각형 
class Squre extends Rectangle {
    @override
    public setWidth(int w) {
        this.width = w;
        this.height = w;
    }
    @override
    public setHeight(int h) {
        this.width = h;
        this.height = h;
    }
}

2. DIP(Dependency Inversion Principle, 의존관계 역전 원칙)

-소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다.
-상위 모듈은 하위 모듈에 의존해서는 안된다.
-상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
-추상화는 세부 사항에 의존해서는 안된다.
-세부사항이 추상화에 의존해야 한다.

  • DIP 위배
public class DIP_NO {
    public static void main(String[] args) {
        Work man = new Work();
        man.doDrink();
    }
}

class Work extends Ame {
}

class Ame {
    void doDrink(){
         System.out.println("아메를 마신다.")
    }
}

class Latte {
    void doDrink(){
         System.out.println("라떼를 마신다.")
    }
}

class Capu {
    void doDrink(){
         System.out.println("카푸를 마신다.")
    }
}
  • DIP GOOD
public class DIP_NO {
    public static void main(String[] args) {
        Work man = new Work();
        man.doCoffee();
    }
}

class Work{
    Cofe.coffee =  new Ame();
    Cofe.coffee = new Latte();

    void doCoffee() {
          System.out.println(coffee.doDrink());
    }
}

interface Coffee {
    String doDrink();
}

class Ame implements Coffee {
    public String doDrink(){
         return "아메를 마신다."
    }
}

class Latte implements Coffee {
    public String doDrink(){
         return "라떼를 마신다."
    }
}

3. 템플릿 메서드 패턴(Template Method Pattern)

-전체적으로 동일하면서 부분적으로 다른 구문으로 구성된 메서드의 코드 중복을 최소화
-동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현

  • 적용 전
    -밑에 두 개의 코드를 보면 중복되는 코드가 많다.
public class IceAmericano {
    public void makeIceAmericano() {
        boilWater();
        putEspresso();
        putIce();
        putSyrup();
    }
    private void boilWater() {
         System.out.println("물을 끓인다.")
    }
    private void putEspresso() {
         System.out.println("끓는 물에 에스프레소를 넣는다.")
    }
    private void putIce() {
         System.out.println("얼음을 넣는다.")
    }
    private void putSyrup() {
         System.out.println("시럽을 넣는다.")
    }
}
public class IceLatte {
    public void makeIceAmericano() {
        boilWater();
        putEspresso();
        putIce();
        putSyrup();
    }
    private void boilWater() {
         System.out.println("물을 끓인다.")
    }
    private void putEspresso() {
         System.out.println("끓는 물에 에스프레소를 넣는다.")
    }
    private void putIce() {
         System.out.println("얼음을 넣는다.")
    }
    private void putSyrup() {
         System.out.println("시럽을 넣는다.")
    }
}
  • 적용 후
    -상속을 통해 공통된 부분을 받고 추상화된 메서드를 오버라이딩하여 자신의 방식으로 변형한다.
    -확실히 템플릿 메서드 패턴을 접목하니 위의 코드보다 개선이 되었음을 알 수 있다.
public abstract class Coffee {
    final void makeCoffee() {
        boilWater();
        putEspresso();
        putIce();
        putSyrup();
    }
    // SubClass에게 확장/변화가 필요한 코드만 코딩하도록 한다.
    abstract void putExtra();

    // 공통된 부분은 상위 클래스에서 해결하여 코드 중복을 최소화 시킨다.
    private void boilWater() {
         System.out.println("물을 끓인다.")
    }
    private void putEspresso() {
         System.out.println("끓는 물에 에스프레소를 넣는다.")
    }
    private void putIce() {
         System.out.println("얼음을 넣는다.")
    }
}
public class IceAmericano extends Coffee {
    @Override
    void putExtra() {
        System.out.println("시럽을 넣는다.")
    }
}
public class IceLatte extends Coffee {
    @Override
    void putExtra() {
        System.out.println("우유를 넣는다.")
    }
}

0개의 댓글