본문 바로가기

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

ABAP OOP : Polymorphism(다형성) PART2 : Static and Dynamic Types

객체(reference variable)의 Static Type은 reference variable을 정의하는데 사용되는 class 유형입니다. 예를 들어 아래 예시에서볼 수 있듯이 oref 참조는 cl_class라는 클래스를 참조하면서 정의됩니다. 이러한 경우, 객체 oref의 static type은 class cl_class이고, 정적으로 코드에서 정의된 것입니다.

CLASS cl_class DEFINITION.
 
 PUBLIC SECTION.
 METHODS meth.

ENDCLASS.

CLASS cl_class IMPLEMENTATION.
 METHOD meth.
 
 ENDMETHOD.
ENDCLASS.

DATA oref TYPE REF TO cl_class.

때때로, 당신은 같은 하나의 참조 객체에서 static type을 공유하지않는 다른 참조 객체로 다시 할당하고 싶을 수가 있습니다. 예를 들어, inheritance tree에서 클래스들의 인스턴스들은 interchangable(상호변화)할 수 있기 떄문에, subclass의 인스턴스를 superclass의 인스턴스로 assign을 다시 할 수 있습니다.

아래 예시를 보면, parent = child 구문을 통해 subclass의 인스턴스를 superclass의 인스턴스로 재 할당하는 것을 볼 수 있습니다.

CLASS cl_parent DEFINITION.
 PUBLIC SECTION.
  METHODS meth1.
  METHODS meth2.
ENDCLASS.

CLASS cl_parent IMPLEMENTATION.
 METHOD meth1.
  WRITE 'In method1 of parent'.
 ENDMETHOD.

 METHOD meth2.
  WRITE 'In method2 of parent'.
 ENDMETHOD.
 
ENDCLASS.

CLASS cl_child DEFINITION INHERITING FROM cl_parent.
 PUBLIC SECTION.
  METHODS meth2 REDEFINITION.
  METHODS meth3.
ENDCLASS.

CLASS cl_child IMPLEMENTATION.
 METHOD meth2.
  WRITE 'In method2 of child'.
 ENDMETHOD.

 METHOD meth3.
  WRITE 'In method3 of child'.
 ENDMETHOD.

ENDCLASS.

DATA parent TYPE REF TO cl_parent.
DATA child TYPE REF TO cl_child.

START-OF-SELECTION.
 CREATE OBJECT parent.
 CREATE OBJECT child.
 
 Parent->meth2( ).
 parent = child.
 parent->meth2( ).

reference obejct(참조객체) parentCREATE OBJECT라는 구문을 통해 인스턴스화 되고 있고, parent라는 참조객체의 포인터(pointer)는 cl_parent라는 클래스를 바라보고 있습니다.

참조 객체가 런타임 때 가리키는 포인터를 객체의 dynamic type이라고 합니다.

이러한 관점에서, parent라는 객체의 static type과 dynamic type은 같다고 볼 수 있습니다. parent = child 구문은 child라는 오브젝트의 인스턴스를 parent라는 오브젝트로 할당합니다. 하나의 참조 객체가 다른 참조 객체로 할당(assign)될 때, 객체 그자신이 할당(assign)되는 것이 아니라, 객체의 pointer만 옮겨지는 것입니다. 다른말로하면, parent = child라는 할당 이후에, 객체 parent는 객체 child의 메모리 위치를 바라보게 됩니다. 이러한 할당 이후에, parent의 dynamic type은 cl_child로 바뀌게 되지만, static type은 여전히 cl_parent 입니다.

"즉, 명시적으로 구문으로 Type ref to로 선언한 객체의 참조 클래스가 static type이지만, 실제 할당이 이루어져서 해당 객체가 어느 곳을 point로 바라보냐가 dynamic type이라고 이해하면 됩니다"

코드에서 보면, parentchild 참조 객체는 같은 객체를 point하고 있습니다. 왜나면 이러한 할당 이후로는 parent 객체에 더이상 다른 할당이 없기 때문입니다. 이러한 할당이후로, parent라는 객체는 메모리에서 garbage collector에 의해서 자동으로 삭제됩니다. ABAP 런타임 환경은 정기적으로 Garbage Collector를 호출하여 더이상 객체 참조 변수에 의해 참조되지 않는 객체를 메모리로부터 삭제합니다.

즉. parent가 cl_parent를 assing 하고 있을 때는 메모리를 점유하고 있지만 , point로 cl_child를 바라보는 순간부터 이전에 차지고하고 있던 메모리를 삭제시키는 것입니다.

예시를 보면, parent->meth2( ) 메소드는 parent = child 할당(dynamic type가 변한 순간)되기 전에 호출되었을 때에는, superclass인 cl_parent의 meth2라는 method를 실행시켰을 겁니다. 그러나, parent = child 구문으로 할당이 일어난 이후에는, parent->meth2( )를 실행하면, subclass의 meth2를 실행시킬 겁니다.

이 예시는 같은 객체가 프로그램의 실행동안 다르게 행동하는 것을 보여주며 Polymorphism(다형성)을 효과적으로 보여주는 대표적인 예시입니다.

반응형