본문 바로가기
Everyday Study

2024.08.29(목) { 위임 한다는것, AspectJ의 아규먼트&파라미터, PCD, 디지그네이터 }

by xogns93 2024. 8. 29.

위임을 한다는 것 =  타겟클래스객체를 사용한다는 것

 

위임(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 객체에 위임하여 출력
    }
}

동작 설명

  1. 타겟 클래스(Printer):
    • Printer 클래스는 실제로 print 메서드를 구현하여 메시지를 출력하는 기능을 담당합니다.
  2. 위임 클래스(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는 포인트컷을 정의하는 더 큰 개념입니다.