위임을 한다는 것 = 타겟클래스객체를 사용한다는 것
위임(delegation)은 객체지향 프로그래밍에서 자주 사용되는 설계 기법으로, 특정 작업이나 책임을 다른 객체(일반적으로 "타겟 클래스" 객체)에 위임하는 것을 의미합니다. 위임을 사용하면 클래스의 책임을 분산시켜 코드의 재사용성을 높이고, 결합도를 낮출 수 있습니다.
위임의 개념
- 위임(Delegation): 한 객체가 자신의 작업 중 일부를 다른 객체(타겟 클래스)에게 위임하는 것입니다. 즉, 클라이언트 요청을 직접 처리하지 않고, 요청을 타겟 클래스의 객체에게 전달하여 해당 작업을 수행하도록 합니다.
- 타겟 클래스: 위임을 받은 객체입니다. 위임을 수행하는 클래스는 이 타겟 클래스의 객체를 사용하여 실제 작업을 수행합니다.
위임의 예시
아래는 간단한 위임 패턴의 예시입니다. Printer 클래스가 실제로 출력하는 역할을 맡고, Document 클래스는 Printer 객체에 출력을 위임합니다.
// 실제로 작업을 수행하는 타겟 클래스
class Printer {
public void print(String message) {
System.out.println("Printing: " + message);
}
}
// 위임하는 클래스
class Document {
private Printer printer;
public Document(Printer printer) {
this.printer = printer; // 타겟 클래스의 객체를 사용
}
public void printDocument(String content) {
printer.print(content); // Printer 클래스에 작업을 위임
}
}
// 사용 예시
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
Document document = new Document(printer);
document.printDocument("Hello, Delegation!"); // Printer 객체에 위임하여 출력
}
}
동작 설명
- 타겟 클래스(Printer):
- Printer 클래스는 실제로 print 메서드를 구현하여 메시지를 출력하는 기능을 담당합니다.
- 위임 클래스(Document):
- Document 클래스는 Printer 객체를 내부적으로 갖고 있으며, printDocument 메서드를 통해 Printer객체에 출력을 위임합니다.
- Document 클래스는 직접적으로 출력을 수행하지 않고, Printer 클래스가 이를 대신합니다.
위임의 장점
- 책임 분리: 클래스의 책임을 분산시켜 코드의 가독성을 높이고 유지보수를 쉽게 할 수 있습니다.
- 재사용성 증가: 타겟 클래스는 독립적으로 존재하며, 다른 클래스에서도 동일한 객체를 사용하여 동일한 기능을 재사용할 수 있습니다.
- 유연성 향상: 타겟 클래스를 변경하거나 교체할 때 위임 클래스를 크게 수정하지 않아도 됩니다.
정리
- 위임이란: 클래스가 자신의 작업을 다른 클래스(타겟 클래스)의 객체에게 전달하여 수행하는 것을 의미합니다.
- 타겟 클래스 객체 사용: 위임 클래스는 타겟 클래스의 객체를 사용하여 실제 작업을 수행합니다. 위임 클래스는 그 작업의 구현 세부 사항을 알 필요가 없고, 오직 타겟 클래스 객체의 메서드를 호출하여 작업을 완료합니다.
따라서 "위임을 한다"는 것은 위임 클래스가 타겟 클래스의 객체를 사용하여 특정 작업을 처리한다는 의미가 맞습니다.
Aspect J 에서 아규먼트(argument)"와 "파라미터(parameter)" 는
서로 구별되지 않고 동일한 의미로 사용될 수 있다
일반적인 프로그래밍에서의 용어 정의
파라미터 (Parameter)
- 정의: 메서드나 함수가 정의될 때 선언하는 변수입니다. 이는 메서드가 호출될 때 전달받을 값을 받기 위한 "받는 쪽"입니다.
- 예시:
void myMethod(int param1, String param2) {
// 여기서 param1과 param2가 파라미터입니다.
}
아규먼트 (Argument)
- 정의: 메서드나 함수를 호출할 때 실제로 전달하는 값입니다. 이는 메서드가 호출될 때 파라미터에 전달되는 "보내는 쪽"입니다.
- 예시:
myMethod(10, "Hello");
// 여기서 10과 "Hello"가 아규먼트입니다.
AspectJ에서의 용어 사용
AspectJ와 같은 AOP(Aspect-Oriented Programming) 환경에서는 "파라미터"와 "아규먼트"라는 용어가 명확하게 구별되지 않고 혼용되는 경우가 많습니다. 이는 다음과 같은 이유에서입니다:
- 동일한 개념을 지칭: AspectJ에서 args 포인트컷 표현식은 메서드 호출 시 전달되는 실제 값(아규먼트)을 캡처합니다. 이때 AspectJ 문서나 설명에서 "아규먼트"와 "파라미터"라는 용어가 혼용되어 사용될 수 있습니다.
- 실제 동작과의 관계: AspectJ의 포인트컷은 메서드의 실행 시점에서 파라미터(실제로 전달된 값, 즉 아규먼트)를 기반으로 동작하기 때문에, 이 둘을 구분하지 않고 사용하는 것이 실무적으로도 크게 문제가 되지 않습니다.
결론
AspectJ에서는 "아규먼트"와 "파라미터"를 구분하지 않고 동일한 의미로 사용할 수 있으며, 실제로 그렇게 사용되는 경우가 많습니다. 두 용어의 엄격한 구분이 필요하지 않기 때문에, 코드나 문서에서 이 둘이 혼용되어도 특별히 혼동할 필요는 없습니다.
그러나, 일반적인 프로그래밍 컨텍스트에서는 "파라미터"가 함수나 메서드 정의 시 선언된 변수, "아규먼트"는 함수나 메서드 호출 시 전달되는 실제 값으로 구분된다는 점을 이해하는 것이 중요합니다.
PCD (Pointcut Designator) , 디지그네이터 (Designator)
PCD와 디지그네이터(designator)는 주로 AspectJ와 같은 AOP(Aspect-Oriented Programming)에서 사용되는 용어입니다.
PCD (Pointcut Designator)
- 정의: PCD는 "Pointcut Designator"의 약자로, AspectJ에서 포인트컷(Pointcut)을 정의할 때 사용되는 표현식을 의미합니다. 포인트컷은 AOP에서 관심사의 분리를 위해 사용되며, 특정 시점이나 조건에서 실행되는 코드(조인 포인트, Join Point)를 지정합니다.
- 용도: PCD는 어떤 메서드가 호출될 때, 어떤 객체가 생성될 때, 어떤 필드가 읽히거나 쓸 때 등, 특정 상황에서 실행할 코드를 정의하기 위해 사용됩니다.
- 예시:
// execution은 PCD 중 하나로, 특정 메서드 실행 시점을 포인트컷으로 지정함
pointcut myPointcut() : execution(* com.example.MyClass.myMethod(..));
여기서 execution은 특정 메서드의 실행 시점을 포인트컷으로 지정하는 PCD입니다.
- 자주 사용되는 PCD 종류:
- execution(): 메서드의 실행 시점을 포인트컷으로 지정합니다.
- within(): 특정 클래스 또는 패키지 내의 모든 조인 포인트를 지정합니다.
- args(): 특정 파라미터 타입을 가진 메서드를 포인트컷으로 지정합니다.
- this 및 target: 특정 객체나 그 자식 클래스의 조인 포인트를 지정합니다.
디지그네이터 (Designator)
- 정의: 디지그네이터(designator)는 PCD의 부분으로, 어떤 특정 조인 포인트를 지정하는 역할을 합니다. 쉽게 말해, 디지그네이터는 "어디에서" 또는 "언제" AspectJ가 특정 행동을 취할지를 결정하는 포인트컷 내의 구성 요소입니다.
- PCD와 디지그네이터의 관계: PCD가 포인트컷을 정의하는 전체 표현식이라면, 디지그네이터는 그 표현식의 한 부분으로, 어떤 조인 포인트를 가리키는지 명확히 정의합니다. 여러 디지그네이터가 결합되어 하나의 포인트컷을 형성할 수 있습니다.
- 예시:
pointcut logging() : execution(* com.example..*(..));
이 예시에서 execution(* com.example..*(..)) 전체가 PCD이고, execution은 디지그네이터입니다.
정리
- PCD (Pointcut Designator): 포인트컷을 정의하는 표현식으로, 특정 조건이나 시점에서 실행되는 코드(조인 포인트)를 지정합니다.
- 디지그네이터 (Designator): PCD 내에서 특정 조인 포인트를 가리키는 역할을 하는 구성 요소로, 언제 또는 어디에서 AspectJ가 적용될지를 정의합니다.
두 용어는 밀접하게 연관되어 있으며, AspectJ와 같은 AOP에서 코드의 특정 부분을 타겟으로 하는 데 사용됩니다. 디지그네이터는 PCD의 구체적인 부분으로, PCD는 포인트컷을 정의하는 더 큰 개념입니다.
'Study Memo' 카테고리의 다른 글
2024.09.02(월) { 인라인 포인트컷, args(제한&가져오기), (0) | 2024.09.02 |
---|---|
2024.08.30(금) { PCD-this와target차이, proceed() } (0) | 2024.08.30 |
2024.08.28(수) { Aspect 적용 시점, 메서드 매처(Method Matcher)와 클래스 필터 } (0) | 2024.08.28 |
2024.08.27(화) { 포인트컷 익스프레션, 정적&동적 매칭, @Qualifier, @CustomAnnotation } (0) | 2024.08.27 |
2024.08.26(월) { 조인 포인트, 어드바이스, 포인트컷, 어드바이저 } (0) | 2024.08.26 |