디자인 패턴: 데코레이터 (decorator) 패턴

DanChu 🌟·2022년 7월 16일
0
post-custom-banner

자바의 상속과 구현의 차이점

  • 각각의 상자는 객체 (object)이고, 자바에서는 클래스라 부름
  • 하위 객체가 상위 객체를 상속받아 사용하는데, 이때 상위객체의 특징(메소드, 변수 등)을 받아오게 됨
  • 이때에,
    - 부모의 특징(메소드, 변수 등)을 새롭게 구현 -> 구현 (implements, interface 구현)
    - 부모의 특징을 그대로 사용 -> 상속 (extends)

상속 extends

  • 자식이 부모의 특징을 상속받아서 사용 가능한 것으로, 코드의 재사용성 높아지고 중복성을 최소화 할 수 있음
  • 부모에서 선언/정의를 모두 하고, 자식은 오버라이딩 할 필요 없이 부모의 메소드, 변수를 그대로 사용할 수 있음
  • 자식은 부모의 특징을 상속받아 필요한 부분을 그대로 사용하는 것으로 코드의 효율을 올리고, 또 필요한 특징은 추가하여 기능을 확장하여 사용할 수 있음
  • 필요에 따라 오버라이딩하여 사용도 가능
  • 일반적인 상속의 대표적 예

구현 implements

  • 특정 인터페이스를 클래스에서 구현한다는 것을 의미
  • 부모 객체는 선언만 하고, 정의는 자식이 오버라이딩해서 사용
    - 인터페이스에서 정의한 메서드에 강제력이 생김으로서, 해당 인터페이스를 구현한 클래스에서는 인터페이스의 메 서드를 재정의 하는 것으로 구현을 해야 함

특징

  • 클래스에서 클래스에 다중상속은 불가능
  • 인터페이스에서 인터페이스에 다중 상속 가능
  • 클래스에 여러 인터페이스 다중 구현 가능

데코레이터 패턴의 장단점

장점

  • 기존 코드를 수정하지 않고도 데코레이터 패턴을 통해 행동을 확장시킬 수 있음
  • 구성과 위임을 통해 실행중에 새로운 행동을 추가할 수 있음

단점

  • 의미없는 객체들이 너무 많이 추가될 수 있음
  • 데코레이터를 너무 많이 사용하면 코드가 필요 이상으로 복잡해질 수 있음
  • 특정 구소요소인지 확인 후 작업을 처리해야하는 경우에 데코레이터 패턴 사용이 힘들 수 있음
  • 구성요소 초기화하는 코드 복잡해짐

데코레이터 패턴 사용이 좋은 경우

  • 클래스 요소들을 계속 수정하면서 사용하는 구조가 필요한 경우
  • 여러 요소들을 조합해서 사용하는 클래스 구조인 경우

자바의 I/O(Input/Output) 클래스에 적용된 decorator 패턴에 대해

예제 1

  • 자바의 입출력 스트림은 데코레이터 패턴을 사용
  • 실제 입출력 기능을 가진 객체(컴포넌트)와 그 외 다양한 기능을 제공하는 데코레이터(보조스트림)을
    사용하여 다양한 입출력 기능을 구현
  • 상속보다 유연한 확장성을 가짐
  • 지속적인 서비스의 증가와 제거가 용이함

package others;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileTest {

	public static void main(String[] args) throws IOException {
		
		RandomAccessFile rf = new RandomAccessFile("random.txt","rw");
		rf.writeInt(100);
		System.out.println(rf.getFilePointer());
		rf.writeDouble(3.14);
		rf.writeUTF("안녕하세요");
		//처음위치로 변경
		rf.seek(0);
		int i = rf.readInt();
		
		double d = rf.readDouble();
		String str = rf.readUTF();
		
		System.out.println(i);
		System.out.println(d);
		System.out.println(str);
		rf.close();
		
	}

}

예제 2

https://incheol-jung.gitbook.io/docs/study/undefined/undefined-2/undefined-3


references

post-custom-banner

0개의 댓글