ㅁ데코레이터 패턴(Decorator Pattern): 객체에 새로운 기능을 동적으로 추가하는 구조적 디자인 패턴
"기존 코드를 수정하지 않고"도 기능을 확장할 수 있어 유지보수성과 확장성이 뛰어나다!
[데코레이터 패턴의 특징]
- 기존 코드 변경 없이 기능 추가 가능
- 상속(Inheritance)과 차별화된 방식
- 상속 - 기존 클래스를 확장하여 기능을 추가하는 방식
- 데코레이터 패턴 - 기존 객체를 감싸(wrapping) 추가적인 기능을 부여하는 방식
- 유연한 구조(여러 개의 데코레이터를 조합하여 다양한 기능을 적용할 수 있다)
e.g. 안드로이드에서의 활용
안드로이드 개발에서 다양한 컴포넌트들은 데코레이터 패턴을 활용하여 구현되어 있다. 대표적인 예로 Drawable을 감싸는 LayerDrawable이나, View의 기능을 확장하는 Wrapper 클래스 등이 있다. 개발자는 기존 기능을 유지하면서도 새로운 기능을 쉽게 추가할 수 있다.
// 데코레이터 패턴 예제: 안드로이드 TextView 커스텀
class BoldTextViewDecorator extends TextView {
public BoldTextViewDecorator(Context context, TextView textView) {
super(context);
setText(textView.getText());
setTypeface(null, Typeface.BOLD);
}
}
위 코드에서는 기존 TextView를 감싸고, 텍스트를 볼드(Bold) 처리하는 기능을 추가했다. 기존 TextView를 변경하지 않고도 새로운 스타일을 적용할 수 있다.
※ Python에서는 데코레이터 기능을 언어 차원에서 기본적으로 지원한다 (역시 최신 고급 언어 ㄷㄷ)
데코레이터는 함수나 클래스를 감싸서 기능을 확장할 수 있으며, @ 문법을 사용하여 쉽게 적용할 수 있다
def decorator_function(original_function):
def wrapper_function(*args, **kwargs):
print(f"{original_function.__name__} 함수가 호출됨")
return original_function(*args, **kwargs)
return wrapper_function
@decorator_function
def display():
print("Hello, Python Decorator!")
display()
위 코드에서 @decorator_function을 사용하여 display 함수가 호출될 때마다 추가적인 동작(로그 출력)이 실행되도록 설정했다. 이처럼 Python에서는 데코레이터를 활용하여 기존 코드 변경 없이 함수의 기능을 확장할 수 있다.
ㅁ클로저(Closure): 함수가 정의될 때의 환경(Context)을 유지하면서, 함수 내부에서 외부 변수에 접근할 수 있는 기능을 의미
Java에서의 클로저 구현
Java는 기본적으로 클로저를 직접 지원하지 않지만, 람다(lambda)와 익명 클래스(anonymous class) 를 활용하여 클로저와 유사한 기능을 구현할 수 있다.
import java.util.function.Supplier;
public class ClosureExample {
public static Supplier<Integer> createCounter() {
final int[] count = {0};
return () -> ++count[0];
}
public static void main(String[] args) {
Supplier<Integer> counter = createCounter();
System.out.println(counter.get()); // 1
System.out.println(counter.get()); // 2
}
}
위 코드에서 count 변수는 람다 표현식 내부에서 유지되며 함수가 실행될 때마다 값이 증가한다. Java에서는 변수의 값을 변경하기 위해 final 또는 effectively final로 선언된 배열을 사용해야 한다.
※ Python에서의 클로저 구현
Python은 클로저 기능을 언어 차원에서 기본적으로 지원한다 (역시 최신 고급 언어 ㄷㄷ)
def create_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = create_counter()
print(counter()) # 1
print(counter()) # 2
위 Python 코드에서 count 변수는 내부 함수 counter에서 nonlocal 키워드를 사용하여 변경 가능하도록 설정되었다. Java보다 훨씬 간결하게 클로저를 활용할 수 있다!
[정리]
- 데코레이터 패턴: 기존 코드를 변경하지 않고 기능을 확장할 수 있는 패턴으로, 안드로이드 UI 컴포넌트에서도 자주 활용
- 클로저(Closure): 함수 내부에서 외부 변수를 캡처하여 유지하는 기능이며, Java에서는 람다와 익명 클래스를 조합해 구현하지만, Python에서는 기본적으로 지원한다.
두 개념 모두 유연성과 코드 재사용성을 높이는 중요한 프로그래밍 기법이며, 다양한 언어에서 활용할 수 있다!
파이썬을 제대로 처음 배워보는데 기능이 엄청 많아서 놀랐다.. 그래서 뭔가 더 어려운 느낌
자바가 그냥 세단이라면 파이썬은 뭔가 기능 많은 마세라티같다. 기능이 너무 많으니까 더 복잡하고 어려운 느낌 ㅠㅠ 그리고 for (int i = 0; i < N; i++) 이거 구문 지원 안 해주는 게 너무 섭섭하다
파이썬 너란 녀석..
'소프트웨어공학 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] MVC 패턴(Model-View-Controller Pattern) (1) | 2024.10.01 |
---|