본문 바로가기

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

ABAP OOP : ENCAPSULATION(캡슐화) PART1 : Visibility

앞선 글 들을 통해 OOP를 구성하는 구성요소들 -> Attributes, Methods, Event, Object 등에 무엇인지에 대해서 알아보았습니다. 앞서서 진행할 몇 가지 주제는 OOP의 특징과 개념에 대해서 입니다. 앞서서 설명한 구성요소들은 OOP로서 ABAP에서 클래스가 가 무엇으로 이루어져있나를 설명했다면, 앞으로는 OOP가 어떤 특성(개념)으로 이루어져 있는지를 알아보도록 하겠습니다.

OOP의 주요 원칙 중 하나는 Encapsulation(캡슐화)입니다. 캡슐화는 영역을 정의하여 외부 세상으로부터 구현(실행 소스)를 숨길 수 있습니다. Attributes(사용되는 데이터)와 methods(데이터를 조작하는 기능)는 Obejct라는 캡슐에 들어있기 떄문에, 객체 안에서 어디까지 접근을 허락할지 외부로부터 어디까지 접근을 허락할지의 영역을 정할 수 있습니다.

이번 글과 몇 개의 포스팅을 통해서 OOP에서의 encapsulation(캡슐화)의 성격에 대해서 설명을 드리고자 합니다.

CL_GUI_ALV_GRID 예시 : 각 Visiblie Section이 나뉘어서 구현되어있다

 


Component Visibility(구성요소 가시성)


객체의 구성요소(component of an object) 는 외부 프로그램, 하위 클래스, 같은 클래스에서 접근될 수 있습니다. 클래스의 구성요소에 대한 접근 제한은 그것의 가시성을 결정합니다. 다른 말로 하면, 당신은 클래스의 구성요소를 오직 클래스에서 접근가능하게 할지, 아니면 서브클래스에서 접근 가능하게 할 지, 혹은 외부에서도 접근 가능하게 할 지를 결정할 수 있다는 것입니다.

REPORT ZCL_VEHICLE.

CLASS CL_VEHICLE DEFINITION.
    PUBLIC SECTION.
    TYPES ty_speed TYPE i.
    
    METHODS inc_speed IMPORTING im_speed TYPE ty_speed.
    METHODS dec_speed IMPORTING im_speed TYPE ty_speed.
    METHODS stop.
    METHODS get_speed RETURNING VALUE(r_speed) TYPE ty_speed.
    
    PRIVATE SECTION.
    DATA : speed TYPE i.
    
ENDCLASS.

CLASS CL_VEHICLE IMPLEMENTATION.

    METHOD inc_speed.
    ADD im_speed TO speed.
    ENDMETHOD.
    
    METHOD dec_speed.
    SUBTRACT im_speed FROM speed.
    ENDMETHOD.
    
    METHOD stop.
    speed = 0.
    ENDMETHOD.
    
    METHOD get_speed.
    r_speed = speed.
    ENDMETHOD.
    
ENDCLASS.

위의 예시를 보면, 예시에는 PUBLIC SECTION과 PRIVATE SECTION 아래에 components를 선언하였습니다. 앞서 설명드렸듯이, 3가지 가시성 영역(visibility section) 이 있고 각각 PUBLIC, PROTECTED, PRIVATE으로 나뉘어져 있습니다.

이러한 가시성 영역은 클래스의 구성요소에 어떻게 접근될 수 있는지를 정의합니다. 각각 설명을 하면 다음과 같습니다.

1.PUBLIC SECTION
-> PUBLIC SECTION의 구성요소(components)들은 클래스와 클래스 외부에서 접근이 가능합니다. 이 구성요소들은 클래스의 public interface를 구성합니다.

2.PROTECTED SECTION
-> PROTECTED SECTION의 구성요소(components)는 오직 클래스 내부에서 접근 되거나 혹은 그것의 subclass에서 접근이 가능합니다. 이러한 구성요소들은 외부 프로그램에서 접근할 수 없습니다.

3.PRIVATE SECTION
->PRIVATE SECTION안의 구성요소들(components)들은 오직 클래스 내부에서 접근되거나 혹은 그것의 friend class 에서 접근이 가능합니다.

CLASS cl_encapsulation_demo DEFINITION.
  
PUBLIC SECTION.
  
  METHODS print.
  METHODS set_copies IMPORTING copies TYPE i.
  METHODS get_counter EXPORTING counter TYPE i.

PROTECTED SECTION.

  METHODS reset_counter.

PRIVATE SECTION.

  DATA copies TYPE i.
  DATA counter TYPE i.
  METHODS reset_copies.

ENDCLASS.
CLASS cl_encapsulation_demo IMPLEMENTATION.

  METHOD print.
  "로직 구현
  ENDMETHOD.
  
  METHOD set_copies.
  "로직 구현
  me->copies = copies.
  ENDMETHOD.
  
  METHOD get_counter.
  "로직 구현
  counter = me->counter.
  ENDMETHOD.
  
  METHOD reset_counter.
  "로직 구현
  CLEAR counter.
  ENDMETHOD.
  
  METHOD reset_copies.
  "로직 구현
  CLEAR copies.
  ENDMETHOD.
  
ENDCLASS.
CLASS cl_encapsulation_sub_demo DEFINITION INHERITING FROM cl_encapsulation_demo.
    
  PROTECTED SECTION.
  METHODS reset_counter REDEFINITION.
  
ENDCLASS.
  
CLASS cl_encapsulation_sub_demo IMPLEMENTATION.
    
  METHOD reset_counter.
  super->reset_counter( ).
  
*   super->reset_copies( ). "gives syntax error
  ENDMETHOD.

ENDCLASS.

위 예시를 보면, cl_encapsulation_demo라는 클래스를 구현해놓았고, cl_encapsulation_sub_demo라는 cl_encapsulation_demo의 subclass를 정의해 놓았다.

이 코드는 Visibility section을 구현하는 예시를 확인할 수 있다. Visibility Section의 구현순서는 처음에는 Public Section, 그 다음엔 Protected Section, 마지막에 Private Section을 작성합니다. 이러한 순서는 변화하지 않습니다.

Subclass인(상위 클래스를 상속받는) cl_encapsulation_sub_demo는 오직 cl_encapsulation_demo의 Public Section만 접근할 수 있습니다. 만약 cl_encapsulation_sub_demo에서 자신의 슈퍼 클래스인 cl_encapsulation_demo의 PRIVATE SECTION의 구성요소에 접근하려 한다면, 구문 에러가 날 것입니다. 슈퍼클래스의 Method를 하위 클래스에서 재정의할 때, 그 Method의 Visibility Section이 변화하지는 않습니다. 에를 들어 Method가 슈퍼클래스의 PROTECTED SECTION에 정의되었다고 했을때, 재정의도 반드시 서브클래스의 PROTECTED SECTION에서 진행되어야 한다는 의미입니다.

Visibility Section을 통해서, 명확한 바운더리(경계)가 정의될 수 있고, 오직 필요한 구성요소들만 외부 세상에게 노출될 수 있습니다. 이러한 방식은 객체를 디자인하는 데 큰 유연성을 가져다 줍니다. 왜냐하면, 클래스의 Private와 Protected 구성요소들이 Public Interface에서 만 걱정해야될 외부 프로그램의 영향을 받지 않기 때문에 비즈니스 요구사항마다 변화하지 않기 때문입니다. 즉, Public Section에 선언되 있는 대상들은 외부세상에서의 영향을 받기 때문에, 변화에 대해 걱정해야되지만, Procted나 Private의 구성요소들은 이러한 변화가 비즈니스마다 이뤄지지 않을 것이기 때문에, 고정되어 진행되는 Attrubute나 Method등을 선언하여 유연성을 가져갈 수 있다는 의미입니다.

Object Attribute를 Private하게 유지하고 클래스에서 setter & getter methods를 구현함으로서, 개발자는 객체의 데이터에 더 많은 통제와 보안을 가질 수 있습니다. 이 의미는 객체의 Attribute에 대한 어떠한 변화에 대해서는 setter methods가 요구되어야 한다 뜻이고, 정보에 대한 어떠한 요청에 대해서는 반드시 getter methods를 통해 이뤄저야한 다는 뜻입니다. 이러한 ㅅ방식은 더 많은 추상화를 가능하게하고 불필요한 데이터 처리 시나리오를 방지해줍니다.

예를 들어, Attributes의 값을 set하는 setter method를 구현함으로서, 당신은 값이 바뀌기전에 모든 비지니스 로직이 적용되는 것을 보장할 수 있습니다.(값은 반드시 setter method를 통해서만 바뀌므로 이것이 실행되기전에 모든 비지니스 로직이 적용되었음을 의미). 만약 이러한 메소드가 없이, Attbute에 외부 프로그램에서 접근 가능하여 당신의 통제 없이 값을 할당할 수 있다면 비즈니스 로직의 적용에 대한 확신이 불가능 할 것입니다.


정리하자면, Encapsulation(캡슐화)는 영역(Boundary)를 정의하여 내 Class의 구현을 어디는 노출시킬지, 어디는 노출시키지 않을 것인지 결정하는 것입니다. ABAP에는 이러한 영역에는 3가지 Visibility Section이 있고 각각 PUBLIC SECTION, PROTECTED SECTION, PRIVATE SECTION 입니다. 각 영역에 Attiribte, Method와 같은 Components를 어떻게 선언할지는 Class를 디자인하면서 비즈니스에 따라 구현하면 될 것입니다. 이러한 캡슐화를 통해 개발자는 객체의 구현 및 실행을 외부로부터 막음으로서 안정감과 보안에 대해서 확신을 가질 수 있습니다.  

반응형