상속 extends
✅상속은 자식이 부모의 멤버 변수와 메소드를 상속받아서 사용이 가능.
코드의 재사용성을 높이고 중복성을 최소화함.
✅자식 객체는 부모의 특징을 상속받아서 사용해서 코드의 효율을 높이고,
자식이 원하는 특징을 추가 및 확장.
부모 클래스의 필드인 model과 color를 상속
객체 생성시 상속받은 필드 값을 입력해서 생성.
상속받은 메소드와 선언한 메소드를 같이 출력.
구현 implements
✅인터페이스에 선언된 추상메소드들을 입맛에 맞게 오버라이딩하여 사용한다.
따라서 인터페이스에 정의한 메소드에 강제력이 생긴다.
(부모의 메소드를 반드시 오버라이딩(재정의)해야 한다.)
메소드이름이 같지만 각기 다른 출력으로 나타냄
상속과 구현의 차별점.
클래스에서 클래스로 다중상속은 불가능하지만, 인터페이스에서 인터페이스로 다중 상속은 가능, 구현 클래스에 인터페이스를 다중 구현 가능.
주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴.
기본 기능에 추가할 수 잇는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합 추가 기능의 조합을 설계.
디자인 원칙
OCP (Open-Closed Principle) :
클래스는 확장에 대해서는 열려 있어여 하지만 코드 변경에 대해서는 닫혀 있어야 한다.
즉, 기존 코드는 건드리지 말고
확장을 통해서 새로운 행동을 간단하게 추가 할 수 있도록 한다!
Component :
실질적인 인스턴스를 컨트롤하는 역할, 공통 기능을 정의
ConcreteComponent :
Component의 실질적인 인스턴스의 부분으로 책임의 주체의 역할, 기본 기능을 구현.
Decorator :
Component 와 Concrete Decorator를 동일시 하도록 해주는 역활.
💨 Component가 될수 있고, 데코레이터가 Component특징을 가지고 있음
ConcreteDecoreator :
실질적인 장식 인스턴스 및 정의이며,
Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능을 뜻한다.
1. Car 인터페이스를 BasicCar와 CarDecorator란 이름으로 구현클래스를 생성
💨 해당 클래스들은 Car의 기본기능을 가지고 있다.(오버라이드를 통해 구현)
2. CarDecorator클래스를 상속받은 SportCar와 luxuryCar 클래스로 개별 기능을 구현
생성자와 해당 클래스를 다운캐스팅하듯이 감싸안았다.
콘솔을 확인하면, 기본기능 + 개별기능들이 추가되었다.
장점
1. 기존 코드를 수정하지 않고도 데코레이터 패턴을 통해 행동을 확장시킬 수 있다.
2. 구성과 위임을 통해서 실행중에 새로운 행동을 추가할 수 있다.
단점
1. 의미없는 객체들이 너무 많이 추가될 수 있다.
2. 데코레이터를 너무 많이 사용하면 코드가 필요 이상으로 복잡해질 수 있다.
데코레이터 패턴을 사용하는 상황
1. 클래스의 요소들을 계속해서 수정을 하면서 사용하는 구조가 필요한 경우
2. 여러 요소들을 조합해서 사용하는 클래스 구조인 경우
wikipedia 에서 Decorator 패턴 이 .Net 및 Java IO 클래스에 사용 된다고한다.
🚫 이해해보려 하였으나, 잘 모르겠다.
관련 예제에 대한 stackOverFlow 번역본
https://sourcetip.tistory.com/82
https://gdtbgl93.tistory.com/9
https://coding-factory.tistory.com/713