본문 바로가기

ABAP 프로그래밍 개념/Object-Oriented ABAP

ABAP OOP : ENCAPSULATION(캡슐화) PART1 : Implementation Hiding(구현을 숨기는 것)

외부 세계로부터 구현을 숨기는 것은 늘 변화하는 비즈니스 요구사항 때문에 발생하는 미래의 업무에 유연성을 주기 때문에 더 나은 구현을 관리하는 것에 도움이 됩니다. Public Interface를 최소한으로 유지하는 것은(PUBLIC SECTION에서 구현을 최소로 하는 것) 수정 요구가 있을 때마다 클래스를 호출하는 모든 Application에 대한 적용상황에 대한 걱정 없이 수정 요구사항마다 클래스의 PRIVATE SECTIONPROTECTED SECTION의 변화를 가능하게 해줍니다. 이것은 개발건에 대한 관리 및 유지에 많은 시간을 절약해 줍니다.

왜 구현을 숨기는 것이 어떻게 유용한지 드러나는 몇가지 경우를 고려해봅시다. 예를 들어, iOS나 Android와 같은 mobile operationg system을 위한 app(어플리케이션)을 개발한다고 가정해봅시다. 소프트웨어에서 몇가지 특징 중 하나는 다른 앱들로부터 유저들에게 공지(알림)를 해야한다는 것입니다. 이를 위해서, 당신은 app 개발자들이 접근하여 알림을 보낼 수있는 API(Application Programming Interface) 클래스안에서 Public Attribute를 정의해야합니다. 그러나, Public Attribute을 사용하는 것의 결점은 제 3의 app에서 전달되는 알림의 수를 통제 못하는 것과 spam 활동을 막지 못하는 것입니다. 아래 sample API 코드입니다.

CLASS cl_notification_api DEFINITION.
  
  PUBLIC SECTION.
  
  DATA message TYPE string.
  
  METHODS set_message IMPORTING im_message TYPE string.
  METHODS display_notification.
  
ENDCLASS.

CLASS cl_notification_api IMPLEMENTATION.
  
  METHOD set_message.
    message = im_message.
  ENDMETHOD.

  METHOD display_notification.
    WRITE message.
  ENDMETHOD.

ENDCLASS.
*Code in the calling program.
DATA notify TYPE REF TO cl_notification_api.

*--------------------------------------------------------------------*

START-OF-SELECTION.

CREATE OBJECT notify.

notify->set_message( im_message = 'My App notification' ).
Notify->display_notification( ).

CLASS cl_notification_apimessage라는 attribute와 set_message라는 method, display_notification라는 method로 정의하였습니다. cl_notification_api 클래스가 API로서 작동하여 Third-party 앱으로부터 호출되어 유저에게 공지를 표시해준다고 생각해봅시다.

message Attribute는 set_message라는 메소드로부터 호출되어 설정되는 message를 유지합니다(가지고 있습니다). 유저에게의 알림(공지)는 display_notification이라는 메소드로부터 호출되며 나타나진다. 이 클래스에서, 모든 구성요소들은 Public Visibility를 가집니다. 왜냐하면, 모든 구성요소드이 클래스 외부로부터 보여지어야 하기 떄문이고, 이 구성요소들에 대한 어떠한 변화도 이 API Class를 사용하는 모든 앱들의 실행을에 문제가 생길 것입니다. 예를 들어, 메시지를 필터링하거나 또한 app 마다 메시지들의 수를 제한하는 것 괕은 부가적인 특징을 실행하는 것은 디자인에 어려움이 있을 수 있습니다. 

Setter Methodset_message는 메시지를 스크리닝(부적절한 단어를 스크리닝하는 것과 같이)한 후 메시지를 설정할 수 있게 제공됩니다. 그러나, 이러한 제한은 Third-party app 개발자들에 의해 우회될 수 있는데, attribute인 message는 클래스 외부로부터 접근이 되기 때문입니다. 그러므로 set_message라는 Method를 호출하는 것 대신에 외부 개발자들은 메시지를 세팅하기 위한 attribute에 직접적으로 접근할 수 있습니다.

CLASS cl_notification_api DEFINITION.

  PUBLIC SECTION.

  METHODS set_message IMPORTING im_message TYPE string.
    METHODS display_notification.

  PRIVATE SECTION.

    DATA MESSAGE TYPE string.
    METHODS filter_message RETURNING VALUE(boolean) TYPE boolean.
    METHODS check_count RETURNING VALUE(boolean) TYPE boolean.
    METHODS check_status RETURNING VALUE(boolean) TYPE boolean.

ENDCLASS.

CLASS cl_notification_api IMPLEMENTATION.

  METHOD set_message.

    MESSAGE = im_message.

  ENDMETHOD.

  METHOD display_notification.

    IF me->filter_message( ) EQ abap_true OR
      me->check_count( ) EQ abap_true OR
      me->check_status( ) EQ abap_true.
      WRITE MESSAGE.
    ELSE.
      CLEAR message.
    ENDIF.

  ENDMETHOD.

  METHOD filter_message.
*Filtering logic goes here and the parameter "Boolean" is set to
*abap_true or abap_false accordingly.
  ENDMETHOD.

  METHOD check_count.
*Logic to check number of messages goes here and the parameter
*"Boolean" is set to abap_true or abap_false accordingly.
  ENDMETHOD.

  METHOD check_status.
*Logic to check user personal setting goes here and the parameter
*"Boolean" is set to abap_true or abap_false accordingly.
  ENDMETHOD.
ENDCLASS.

*Code in the calling program.
START-OF-SELECTION.

DATA notify TYPE REF TO cl_notification_api.

CREATE OBJECT notify.

notify->set_message( im_message = 'My App notification' ).
Notify->display_notification( ).

처음 코드에서 약간 변화를 준 것을 보면, 위 코드는 message라는 Attribute를 PRIVATE SECTION으로 옮기어서, 외부로부터 접근을 하지 못하게 하였습니다. 이 의미는 이것은 외부 세상으로부터 "구현이 숨겨졌다는 것" 입니다.

추가적으로, PRIVATE SECTION에 정의된 세가지 METHOD들은 메시지가 유저에게 나타가지 전에 메시지에 대한 다양한 확인을 하기 위해 정의되어 있습니다. 예를 들어, 만약 앱에 대한 알림을 해지했다면, 프로그램은 check_status 메소드에서 정보에 대한 확인을 할 것이고, 이 메소드에 abap_false(X)라는 Boolean 값을 반환했다면 메시지는 나타나지 않을 것입니다. 유사하게, 만약 유저가 앱에서 하루에 5개 이상의 공지가 나타나지 않도록 제한을 걸어놨다면, check_count 메소드가 해당 내용을 다룰 것입니다. PRIVATE SECTION에서의 Validating method는 외부에 대한 의존성에 대한 걱정없이 수정 및 유지될 수 있습니다.

외부 개발자들은 공지가 나타나는 것에 대해 검증에 대한 복잡성에 알 필요는 없습니다. 그들이 알아야되는 전부는 어떻게 message를 설정하고, API를 호출하는지에 방법에 대해서 알면 됩니다. 위 코드에서와 같이, 공지가 뜨는 것에 대해 전적인 통제를 외부 개발자가 가지게 되거나, 유효성 검증의 method들이 우회되어 실행될 가능성은 없습니다. 이것은 외부개발자들의 어플리케이션에서 API가 호출되는 방식에 어떠한 변화도 없기 때문에 미래에도 지속적으로 실행될 수 있는 장점이 있습니다.

옳은 방식으로 사용될 때, Implementation Hiding은(구현 숨기기)는 소프트웨어 개발을 할 때 오류 발생률이 낮고. 기능 향상 및 유지보수가 더 용이합니다.

반응형