본문 바로가기

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

ABAP OOP : Inheritance(상속) PART2 : 상속의 정의(Define)

상속관계를 만들기 위해서는 , 당신은 inheriting from이라는 addition 구문을 class 구문과 함께 써야한다.

CLASS cl_vehicle DEFINITION.
 PUBLIC SECTION.
 
  METHODS get_serial_no RETURNING VALUE(r_serial_no) TYPE n.
  
 PRIVATE SECTION.
  DATA : serial_no TYPE n.
  
ENDCLASS.

CLASS cl_vehicle IMPLEMENTATION.
 METHOD get_serial_no.
  r_serial_no = serial_no.
 ENDMETHOD.
 
ENDCLASS.

CLASS cl_car DEFINITION INHERITING FROM cl_vehicle.
 PUBLIC SECTION.
  METHODS get_boot_space RETURNING VALUE(r_boot_space) TYPE n.
  
 PRIVATE SECTION.
  DATA : boot_space TYPE n.
  
ENDCLASS.

CLASS cl_car IMPLEMENTATION.
 METHOD get_boot_space.
  r_boot_space = boot_space.
 ENDMETHOD.
 
ENDCLASS.

위 예시를 보면, 클래스 cl_carcl_vehicle로부터 상속되었다. 여기서, cl_car은 subclass이고, cl_vehicle은 superclass입니다. 클래스 cl_car를 정의할 때, 상속관계는 inheriting from을 class 구문과 함께 사용하면서 정의되었습니다. subclass인 cl_car은 superclass인 cl_vehicle로부터 상속되었기 때문에, 모든 superclass(cl_vehicle)의 public & protected 구성요소들은 자동으로 subclass(cl_car)에서 사용가능합니다. 추가적으로, subclass도 자신만의 구성요소를 추가할 수 있습니다.

그러나, 알아야할 것은 subclass는 superclass의 구성요소중 어떤 것도 삭제할 수 없다는 것입니다. subclass안에서 정의된 구성요소들은 superclass에서 보이지 않습니다(즉 subclass 안에서만 보이는 구성요소입니다). 예를 들어, cl_car에서 정의된 get_boot_space라는 method는 오직 subclass에만 존재하고 superclass에선 보이지 않습니다. 그러나 get_serial_no라는 superclass에서 정의된 method는 subclass에서도 보입니다. 

만약, subclass에서 superclass의 method를 subclass에서 자신에게 맞게 수정하거나 정의가 필요할 때(재정의할 때), methds라는 구문과 함께 redefinition이라는 addtion 구문이 필요합니다.

CLASS cl_vehicle DEFINITION.
 PUBLIC SECTION.
  METHODS get_serial_no RETURNING VALUE(r_serial_no) TYPE n.
 
 PRIVATE SECTION.
  DATA : serial_no TYPE n.
ENDCLASS.

CLASS cl_vehicle IMPLEMENTATION.
 METHOD get_serial_no.
  r_serial_no = serial_no.
 ENDMETHOD.
ENDCLASS.

CLASS cl_car DEFINITION INHERITING FROM cl_vehicle.
 PUBLIC SECTION.
  METHODS get_serial_no REDEFINITION.
  METHODS get_boot_space RETURNING VALUE(r_boot_space) TYPE n.
 
 PRIVATE SECTION.
  DATA : boot_space TYPE n.
ENDCLASS.

CLASS cl_car IMPLEMENTATION.
 METHOD get_serial_no.
  super->get_serial_no( ). ”To call the superclass method.
 ENDMETHOD.
 
 METHOD get_boot_space.
  r_boot_space = boot_space.
 ENDMETHOD.
ENDCLASS.

superclass의 get_serial_no method는 subclass(cl_car)에서 재정의되었습니다. method는 subclass 객체에서 호출되기 때문에, subclass에서 진행된 구현이(superclass의 구현부를 호출 하는 것이 아니라) 호출됩니다. 재정의된 method는 subclass안에 새로운 구현을 강제적으로(반드시) 해야합니다. redefition 구문은 superclass와 같은 section에 위치해야합니다.Superclass에서 Public이었으면 subclass에서도 Public에 위치해야 합니다.

오직 Public과 Protected instance methods들만이 재정의될 수 있습니다.Static methods나 Static Attributes는 subclass에서 재정의되지 않습니다. 또한, 당신은 Superclass의 private methods들은 상속되지 않기 때문에, subclass에서 PRIVATE SECTION에서 redifinition 구문을 사용할 수 없습니다.

당신이 method를 재정의할 때, subclass에서 parameter interface를 재정의할 필요는 없는데, parameter interface는 바뀌지 않기 때문입니다(importing, changing, exporting, returning 등..).재정의된 method 안에서, super라는 구문을 통해 superclass의 구성요소에 접근할 수 있습니다. super라는 레퍼런스 구문은 오직 재정의된 methods에서만 사용 가능합니다.

supercalss에 constructor가 있었다면, constructor은 subclass에 상속되지 않는데, 그 이유는 각 class는 자신의 constructor을 실행하기 때문입니다. 그러나, subclass instance(하위클래스 인스턴스) constructor에서 모든 객체들이 올바르게 initialized되는 것을 보장하기 위해서는 superclass instance의 constructor을 강제적으로 호출하는 좋습니다. 이러한 이유로, 만약 superclass가 instance constructor을 가지고 있다면, subclass는 반드시 superclass에서 정의된 constructor의 모든 importing 파라미터(매개변수)를 포함시켜서 선언해야합니다. 부가적으로, subclass instance constructor은 superclass의 모든 importing 파라미터를 반영하는 것 말고 자신의 parameter를 추가할 수 있습니다.

CLASS cl_vehicle DEFINITION.
 PUBLIC SECTION.
  TYPES ty_serial TYPE n LENGTH 10.
  METHODS constructor IMPORTING im_serial_no TYPE ty_serial.

 PRIVATE SECTION.
  DATA : serial_no TYPE ty_serial.
ENDCLASS.

CLASS cl_vehicle IMPLEMENTATION.
 METHOD constructor.
  serial_no = im_serial_no.
 ENDMETHOD.
ENDCLASS.

CLASS cl_car DEFINITION INHERITING FROM cl_vehicle.
PUBLIC SECTION.
 METHODS constructor IMPORTING im_serial_no TYPE ty_serial
                               im_make TYPE string.
 
 PRIVATE SECTION.
  DATA : make TYPE string.
ENDCLASS.

CLASS cl_car IMPLEMENTATION.
 METHOD constructor.
*Call constructor of immediate superclass.
  super->constructor( im_serial_no = im_serial_no).
  make = im_make.
 ENDMETHOD.
ENDCLASS.

예시를 보면, subclass constructor는 추가적은 parameter인 im_make를 확장하였습니다. subclass constructor안에서, superclass constructor은 즉시 super->constructor 구문을 통해 호출됩니다.

Instace Constructors와 달리, Superclass의 Static Constructor들은 특정 클래스의 Static Constructor가 호출 되기전에, Runtime System에 의해 자동으로 호출됩니다.(사용자가 Control 하는 것이 아닌 시스템 환경에 의해 자동으로 호출되는 것이 Static Constructor)

상속을 사용하면, Visibility(가시성) 개념이 PROTECTED SECTION을 포함하는 것에 대해서 확장됩니다. PROTECTED SECTION의 구성요소(components)들은 같은 클래스와 subclass에게 보여집니다. PROTECTED SECTION 안에 있는 구성요소들은 외부에서 바라봤을 때는 PRIVATE SECTION의 구성요소들과 비슷하게 행동합니다. 그 말은, 외부 프로그램에서는 PROCTED SECTION의 구성요소들에 접근을 할 수 없다는 뜻입니다. 클래스에서 Visible Section Declaration(가시성 영역 선언) 은 반드시 PUBLIC , PROCTED, PRIVATE의 순서에 따라서 이루어져야합니다. PRIVATE SECTION 안에 있는 구성요소들은 말 그대로 속한 클래스의 Private 한 것입니다. 즉, 오직 같은 클래스의 Method를 통해서만 클래스의 Private Components에 접근할 수 있습니다.

SE24 예시

위 예시를 보면, Class Builder(SE24) 에서 Method(Attribute도 동일)의 가시성(Visibility)에 보면 각각 Public, Procted, Private로 가시성을 확인 가능하고 이것을 유지보수 할 수 있는 것을 확인 가능합니다.

반응형