냥코딩쟝

자바문법을 어느정도 공부하고 spring프로젝트를 만들기 전에, 간단한 디자인 패턴을 알고 가는것이 중요하다고 생각되어서 좋은책을 찾아 읽고, 간단하게 포스팅해보자고 한다.

 

디자인패턴의 세계로 떠나기

 

duck클래스에 fly()메소드를 추가해서 상속을 받게 했는데 고무오리도 날게 되었다...

-> 상속을 생각해보자

 

 

 

 

DecoyDuck

quack(){

//아무것도 하지 않도록 오버라이드

}

display(){//가짜 오리}

fly(){

//아무것도 하지 않도록 오버라이드}

 

바뀌는 부분과 그렇지 않은 부분 분리하기

fly() quack()은 Duck 클래스에 있는오리 종류에 따라 달라지는 부분이다

fly()와 quack()을 Duck클래스로부터 분리하려면 2개의 메소드 모두 

Duck 클래스에서 끄집어내서 각 행동을 나타낼 클래스 집합을 새로 만들어야합니다

 

상속은 올바른 해결책이 아닙니다

-상속을 계속 활용한다면 규격이 바뀔 때마다 프로그램에 추가했던 Duck 서브 클래스fly()

quack()메소드를 일일이 살펴보고 상황에따라 오버라이드 해야한다

fly()를 duck 슈퍼클래스에서 빼고 fly메소드가 들어잇는 Flyable 인테페이스를 만들 수 있다.

 

 

 

 

인터페이스 설계하기

fly() Duck 슈퍼클래스를 빼고 fly()메소드가 들어있는 Flyable인터페이스를 만들 수 있다. 오리에게만 fly()메소드를 넣을 수 잇다. 모든 오리가 꽥꽥거리는 건 아니니까

quackable라는 인터페이스도 만드는것이 좋은것일까?

==> 바부... 코드 중복은 생각 못했나요??? 서브클래스에서 날아다닐 수 있는 48개의 코드를 전부 바꿔야하는걸요?

 

 

소프트 웨어 개발 불변의 진리

문제를 명확하게 파악하기

자바인터페이스는 구현된 코드가 없으므로 코드를 재사용할 수 없다.

 

문제를 명확하게 파악하기

서브클래스마다 오리의 행동이 바뀔 수 있는데도 모든 서브클래스에서 한 가지 행동만 사용

디자인 원칙- 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다

 

=달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 '캡슐화'한다

그러면 코드를 변경하는 과정에서 의도치 않게 발생하는 일을 줄이면서 시스템 유연성을 향상시킬 수 있습니다

 

요구 사항이 있을 때마다 바뀌는 부분이 있다면 분리 해야합니다

 

"바뀌는 부분은 따로 뽑아서 캡슐화한다. 그러면 나중에 바뀌지 않는 부분에는 영향을 미치지 않고 그 부분만 

고치거나 확장할 수 있다"

 

fly quack은 duck클래스에 있는 오리 종류에 따라 달라진다

fly quack을 duck 클래스로부터 분리하려면 2개의 메소드를 모두 

duck 클래스에서 끄집어내서 각 행동을 나타낼 클래스 집합을 새로 만들어야한다

 

인터페이스에 맞춰서 프로그래밍한다

상위형식에 맞춰서 프로그래밍한다

여기서는 인터페이스라는 단어가 중의적으로 쓰였다.인터페이스는 자바의 구졸를 지정하는 용도

인터페이스라는 개념을 지정하는 용도로 쓰인다.

Dog d = new Dog();

d.bark();

 

인터페이스와 상위형식에 맞춰서 프로그래밍 한다면

Animal animal = new Dog();

animal.makeSound();

Dog라는 걸 알고 있긴 하지만 다형성을 활용해서 

Animal의 레퍼런스를 써도 됩니다

 

a= getAnimal();

a.makeSound();

 

더바람직한 방법은 상위 형식의 인스턴스를 만드는 과정을 

(new Dog()같은식으로 ) 직접 코드로 만드는 대신 구체적으로 구현된 객체를 

실행 시에 대입한다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

profile

냥코딩쟝

@yejang

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!