티스토리 뷰

반응형

- SRP(Single Responsibility Principle) 단일 책임의 원칙

   : 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야한다.

 

class 강아지{
 final static Boolean 수컷 = true;
 final static Boolean 암컷 = false;
 Boolean 성별;
 
 void 소변보다(){
 	if(this.성별 == 수컷){ //한쪽 다리를 들고 소변을 본다.}
    else{ //뒷 두다를 굽혀 앉은 자세로 소변을 본다.}
   }
 }
abstract class 강아지{  abstract void 소변보다() }

class 수컷강아지 extends 강아지{
	void 소변보다(){ //한쪽 다리를 들고 소변을 본다.}
}

class 암컷강아지 extends 강아지{
	void 소변보다(){ //뒷 두다리 앉은 자세로 소변본다.}
}

남자클래스와  여자클래스의 공통점이 없다면 사람 클래스를 제거하고, 공통점이 많다면 사람클래스를 상위클래스로 해서 공통점을 사람클래스에 두고 각 클래스는 사람클래스를 상속하고 차이점만 각자 구현.

 

 

 

- OCP(Open Closed Principle) 개방 패쇄 원칙

  :자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀 있어야 한다.

  : 기능 추가시 기존코드 변경에 대해 close

 

직원은 교대라고 하는 확장 행위에는 열려있고, 직원교대란 주변변화에 수님의 구매행위는 영향을 받지 않음

-> 직원이 바뀐다고 해서 손님이 구매라는 행위를 하는데는 영향이 없다. 

 

public abstract class Beverage {
    String description = "제목없음";

    public String getDescription(){
        return description;
    }

    public abstract double cost();
}
public class Espresso extends Beverage {
    public Espresso() {
        description = "에스프레소";
    }

    @Override
    public double cost() {
        return 0;
    }
}
public abstract class CondimentDecorator extends Beverage{
    Beverage beverage;
    public abstract String getDescription();
}
public class Mocha extends CondimentDecorator{

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public double cost() {
        return beverage.cost()+.20;
    }

    @Override
    public String getDescription() {
        return beverage.description+", 모카";
    }
}

 

 

- LSP (Liskov Substitution Principle) 리스코프 치환 원칙

  : 기반 클래스의 사용자는 그 기반 클래스에서 유도된 클래스에 대해 아무것도 알 필요가 없어야 한다.

 -> 사용자는 파생 클래스에 대해서 아무것도 알 필요가 없다.

  하위 클래스 is a kind of 상위 클래스 : 하위 분류는 상위 분류의 한 종류이다. (자식 타입은 부모타입이 사용되는 곳에 대체 되어 사용될 수 있어야 함)

  구현 클래스 is able to 인터페이스 : 구현 분류는 인터페이스 할 수 있어야 한다.

 

 

- ISP (Interface Segregation Principle) 인터페이스 분리 원칙

  : 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.

  인터페이스 최소주의 원칙 : 인터페이스를 통해 메서드를 외부에 제공할 때는 최소한의 메서드만 제공하라

 

 

- DIP (Dependency Inversion Principle) 의존 역전 원칙

: 자주 변경하는 concreate(r구체적인)클래스 대신 인터페이스나 추상 클래스에 의존하라

*concreate클래스 : 자주 변경되는 클래스로, 별할 가능성이 높은 비즈니스 규칙을 담은 클래스

 

만약 어떤 클래스에서 상속받아야 한다면, 기반 클래스를 추상 클래스로 만들어라.

어떤 클래스의참조를 가져야 한다면, 참조 대상이 되는 클래스를 추상 클래스로 만들어라.

만약 어떤 함수를 호출해야 한다면, 호출되는 함수를 추상 함수로 만들어라.

public interface PizzaIngredientFactory {
    public Dough createDough();
    public Sauce createSauce();
    public Cheese createCheese();
    public Veggies[] createVeggies();
    public Clams createClam();
}
public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
    @Override
    public Dough createDough() {
        return new ThinCrustDough();
    }

    @Override
    public Sauce createSauce() {
        return new MarinaraSauce();
    }

    @Override
    public Cheese createCheese() {
        return new ReggianoCheese();
    }

    @Override
    public Veggies[] createVeggies() {
        Veggies veggies[] = {new Galic(), new Onion(), newMushroom};
        return veggies;
    }

    @Override
    public Clams createClam() {
        return new FreshClams();
    }
}
public class CheesePizza extends Pizza{
    PizzaIngredientFactory pizzaIngredientFactory;
    public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory){
        this.pizzaIngredientFactory = pizzaIngredientFactory;
    }
    
    void prepare(){
        System.out.println("준비 중" +name);
        dough = pizzaIngredientFactory.createDough();
        sauce = pizzaIngredientFactory.createSauce();
        cheese = pizzaIngredientFactory.createCheese();
    }
}
반응형

'JAVA' 카테고리의 다른 글

자바 문자열 파싱(parsing) : StringTokenizer  (0) 2023.01.27
[JAVA] JVM  (0) 2023.01.14
[JAVA] Stream  (0) 2022.09.14
ArrayList 정렬 : Comparable 과 Comparator  (0) 2020.01.06
향상된 For 문(+ArrayList에서 index 가져오기)  (0) 2020.01.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함