본문 바로가기

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

ABAP OOP : Polymorphism(다형성) PART4 : Dynamic Binding (동적 바인딩)with the Call Method

객체가 method의 파라미터로서 통과될 때, 시스템은 자동적으로 객체를 동적으로(dynamically) 바인드(bind)한다. 이 개념은 객체들이 쉽게 확장될 수 있어서 디자인 하는데 도움을 줍니다.

즉, method의 parameter로서 보통 type c, type i, 혹은 structure와 internal table을 사용했지만,
parameter로 type ref to Class (static type 형식으로 type을 사용한)를 사용하는 것을 말합니다.

Call Method에서의 Dynamic Binding(동적바인딩)을 이해하기 위해서는, 아래 코드를 봐야합니다.

CLASS cl_student DEFINITION ABSTRACT.
 PUBLIC SECTION.
  METHODS tuition_fee ABSTRACT.
  METHODS get_fee ABSTRACT RETURNING VALUE(fee_paid) TYPE boolean.
 
 PROTECTED SECTION.
  DATA fee_paid TYPE boolean.
ENDCLASS.

CLASS cl_commerce_student DEFINITION INHERITING FROM cl_student.
 PUBLIC SECTION.
  METHODS tuition_fee REDEFINITION.
  METHODS get_fee REDEFINITION.
ENDCLASS.

CLASS cl_commerce_student IMPLEMENTATION.
 METHOD tuition_fee.
"logic to calculate tuition fee for commerce students goes here
"IF fee paid.

  fee_paid = abap_true.
 ENDMETHOD.

 METHOD get_fee.
  fee_paid = me->fee_paid.
 ENDMETHOD.

ENDCLASS.

CLASS cl_science_student DEFINITION INHERITING FROM cl_student.
 PUBLIC SECTION.
  METHODS tuition_fee REDEFINITION.
  METHODS get_fee REDEFINITION.
ENDCLASS.

CLASS cl_science_student IMPLEMENTATION.
 METHOD tuition_fee.
  "logic to calculate tuition fee for science students goes here
  "IF fee paid.
  fee_paid = abap_true.
 ENDMETHOD.

 METHOD get_fee.
  fee_paid = me->fee_paid.
 ENDMETHOD.
ENDCLASS.

CLASS cl_admission DEFINITION.
 PUBLIC SECTION.
  METHODS set_student IMPORTING im_student TYPE REF TO cl_student.
  METHODS enroll.

 PRIVATE SECTION.
  DATA admit TYPE boolean.
ENDCLASS.

CLASS cl_admission IMPLEMENTATION.
 METHOD set_student.
  IF im_student->get_fee( ) EQ abap_true.
   admit = abap_true.
  ENDIF.
ENDMETHOD.

 METHOD enroll.
  IF admit EQ abap_true.
  *Perform the steps to enroll
 ENDIF.
 ENDMETHOD.
ENDCLASS.

DATA : commerce_student TYPE REF TO cl_commerce_student,
science_student TYPE REF TO cl_science_student,
admission TYPE REF TO cl_admission.

START-OF-SELECTION.

CREATE OBJECT: commerce_student,
               science_student,
               admission.
               
CALL METHOD commerce_student->tuition_fee.
CALL METHOD admission->set_student( EXPORTING im_student = commerce_student ).
CALL METHOD admission->enroll.
CALL METHOD science_student->tuition_fee.
CALL METHOD admission->set_student( EXPORTING im_student = science_student ).
CALL METHOD admission->enroll.

cl_student를 추상클래스로 정의하며, tuition_feeget_free라는 추상 메소드를 Public Section에 정의하며 설계하였습니다. 학생이 수수료를 지불할 경우를 위해 설정한 속성(attribute)인 fee_paidPROTECTED SECTION에 정의하였습니다.

cl_commerce_studentcl_sceince_student 두 개의 클래스는 cl_student를 상속받았고 tuition_fee와 get_fee라는 추상 메소드를 자신에 맞게 구현하였습니다. 메소드 tuition_fee에서, private attributefee_paid는 만약 student들이 수수료를 지불했다면 abap_true( = 'X' )로 설정되었습니다. get_fee는 private attribute의 값을 반환(return)해 줍니다.

우리는 cl_admission을 학생들이 수업을 등록하는 데 사용하도록 정의하였습니다. 이 클래스에는 set_studentenroll이라는 두 가지 메소드를 정의하여, 수업에서 학생들의 등록을 위해 사용하였습니다. cl_admission이라는 클래스는 어떠한 전공의 학생(컴퓨터 전공 학생, 경영 전공 학생 등..)들도 등록할 수 있기 때문에 학생의 전공에 대한 정보를 가져오는 클래스를 고안할 필요가 있었습니다.

cl_admissionset_student라는 메소드는 importing 파라미터로 student라는 객체를 import하도록 고안되었습니다. 만약 importing parameter로 cl_science_student의 static type을 사용하였다면, 오직 science student 객체만을 import할 수 있을 것이고, 우리의 수업은 오직 과학전공의 학생만을 위하여 진행될 것입니다. 그렇기 때문에, 어떠한 학생들에게도 적용시키기 위해서, importing parmeter로 cl_student라는 추상클래스의 static type을 선언하여, cl_science_student, cl_comemrce_student 뿐만 아니라 cl_student를 상속하는 어떠한 클래스도 적용 시킬 수 있도록 하는 것입니다. 

즉, 객체를 parameter로 사용하면서, method의 활용을 더 확대하는 것으로 보면 됩니다. 이를 위해선 더 정교하게 디자인(고안)을 해야하는 필요는 있지만, 활용성과 확장성에 대해서는 장점을 가지고 있습니다.

반응형