Strategy Pattern
전략 패턴이란 각각의 알고리즘을 교환이 가능하도록 정의, 캡슐화를 한 다음, 서로 교환해서 사용할 수 있는 패턴입니다. 즉, 객체들이 할 수 있는 동작을 각각의 전략으로 만들어 놓고 동적으로 동작을 변경해야 한다면 전략만 변경하여 동작이 바뀌도록 하는 패턴입니다.
이러한 패턴을 사용하면 OCP에 위배되지 않고 시스템이 거대해졌을 때, 메소드의 중복을 해결할 수 있습니다.
여러 알고리즘을 하나의 추상적인 접근점에서 서로 교환가능하도록 하는 패턴
추상적인 접근점 💨 인터페이스
인터페이스에 공통의 기능을 선언하고, 각각의 객체에 구현하는 형태
❓ 정의대로면 알고리즘을 교환이 가능하도록 정의후 캡슐화를 해야하는데,
인터페이스를 캡슐화가 가능할까?
캡슐화의 정의
- 객체의 필드(속성), 메소드를 하나로 묶고, 실제 구현 내용을 외부에 감춤다.
- 외부 객체는 객체 내부의 구조를 얻지 못하며, 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
- 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다.
- 자바 언어는 캡슐화된 멤버를 노출 시킬 것인지 숨길 것인지 결정하기 위해 접근 제한자를 사용한다.
❓ 인터페이스에서 사용하는 접근제한자는 뭐가 있을까?
접근제한자 관련해서 찾아보던중
인터페이스와 추상클래스의 차이가 눈에 들어왔다.
인터페이스와 추상클래스의 차이를 다중 상속여부와 상수외에 필드를 유무로
구분짓고 있었는데 접근제한자를 간과하고 있었다.
추상 클래스는 protected를 사용해서 캡슐화의 특징을 이용할 수 있다.
🚫 protected는 필드, 메소드 생성자에 선언가능
그래서 생각하게 되었던 점은 추상 클래스와 인터페이스를 이용하여 공개되어도 되는 메소드와 공개 되지 말아야 할 메소드들을 분리하여 구현할 수 있다는 점이다.
(⛔테스트할 때 주의해야 할점은 protected 접근제한자는 동일 패키지 및 상속 클래스에 한하여 접근이 가능하기 때문에 패키지를 따로 둘것.)
개방폐쇄의 원칙
YOU SHOULD BE ABLE TO EXTEND A CLASSES BEHAVIOR, WITHOUT MODIFYING IT.
💨 기존 구성요소를 건들지 않고 쉽게 확장이 가능하게 만들어야 한다.
추상클래스인 damage로부터 상속받는 자식클래스 abstractSword
상속받은 print이지만 protected 접근제한자를 통해 다른 상위객체를 수정 할 일 없이 사용 못하게 막았다.
메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미한다.
메소드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것.
리턴값만 다르게 갖는 오버로딩은 작성할 수 없다.
이름이 같지만 매개변수가 각기 다른 3개의 메소드를 출력해 보았다.
콘솔에 출력이 잘 나온것을 확인할 수 있다.
오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이다.
메소드의 이름과 타입, 파라미터도 동일, 상속받은 메소드를 고쳐쓰는 것.
추상메소드와 상수를 가지는 인터페이스를 상속받아서 구현
장점
1. 알고리즘마다 사용되는 코드의 중복을 방지하고 쉽게 대처할 수 있다.
2. 확장성이 용이해서 다양한 알고리즘을 쉽게 추가가능하다.
3. 클라이언트와 독립적이므로 알고리즘 변경이 용이하다.
단점
1. 전략의 갯수만큼 객체도 무한정 늘어난다.
2. 클라이언트가 사용할 객체를 직접 결정해야한다.
but 객체간의 차이에 대해 알기 부담스러울 수 있다.
Weapon을 전략적으로 고를수도, 맨손으로 싸울수도 있게 독립적이다.