본문 바로가기

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

Principles of OOP Part4 : Objects

An Object os an instance of a class.

SAP에서 Object를 정의한 문장입니다. 말 그대로 객체는 클래스의 인스턴스입니다. 객채(Object)는 인스턴스라고 불리기도 합니다. 그리고 객체는 create object라는 구문을 통해서 인스턴스화(instantiated) 됩니다. 간단히 예를 들면
Data : gc_grid type ref to CL_GUI_ALV_GRID 라고 보통 많이 선언합니다.
하지만 저 자체의 gc_grid는 아직 Object가 된 것이 아닙니다. 단순히 Class를 참조하는 data 형식만 선언해 놓은 것입니다.

이후 create object gc_grid. 라는 구문을 만나야 실제 인스턴스화되면서 객체가 되는 것입니다.(Exporting 이하는 생략하였습니다.

SAP NetWeaver 7.40 이후로는, NEW라는 Keyword 구문을 통해서 객체를 인스턴스화 할 수 있습니다.
위 예시를 보면 다음과 같습니다.

gc_grid = NEW CL_GUI_ALV_GRID( ) 혹은
Data : gc_grid type ref to CL_GUI_ALV_GRID.
gc_grid = NEW #( ).

객체는 오직 reference variables(참조 변수 : type ref to 로 선언된 )을 통해서만 생성될 수 있거나 접근할 수 있습니다. 아래 코드는 제대로 참조 변수를 선언하고 이를 인스턴스화하는 과정을 설명한 예시입니다. 

CLASS cl_vehicle DEFINITION.
 PUBLIC SECTION.
 ……
 PRIVATE SECTION.
 ……
ENDCLASS.

CLASS cl_vehicle IMPLEMENTATION.
 ……
ENDCLASS.

DATA : r_vehicle1 TYPE REF TO cl_vehicle,
r_vehicle2 TYPE REF TO cl_vehicle.

START-OF-SELECTION.
 CREATE OBJECT: r_vehicle1,
 r_vehicle2.

위 예시에는, r_vehicle1r_vehicle2라는 두 가지 참조 변수가 있습니다. 두 변수 모두 cl_vehicle이라는 클래스를 참조하여 생성되있습니다. 이 두 변수 다 CREATE OBJECT라는 구문을 만나야지 인스턴스화 될 수 있습니다.

클래스는 객체의 일반적인 설명(즉 : 객체의 설계도)기 때문에 객체의 모든 특성을 다 포함하고 있습니다.(클래스에 특성이 사전에 정의되있기 떄문에 객체가 해당 특성들을 가진다고 이해하셔도 됩니다). 프로그램 런타임 동안, 특정 객체들은 클래스를 사용해서 만들어집니다. 객체를 생성하는 과정( process of creating objects)는 Instantiation(인스턴스화)라고 부릅니다.

위 코드의 예시를 보겠습니다. 객체인 r_vehicle1r_vehicle2는 같은 클래스인 cl_vehicle의 인스턴스입니다. 그러나 같은 클래스의 인스턴스지만 r_vehicle1r_vehicle2는 각각 고유하게 존재합니다. 예를 들어 r_vehicle1가 등록번호 "123"의 차라고 생각하고 r_vehicle2는 "가나다" 등록번호의 차라고 생각하면 될 것 같습니다.

참조변수가 인스턴스화되면, 객체는 즉각적으로 런타임 환경(runtime environment)에 의해 메인 메모리를 할당받게(allocated) 되고, 메모리에 대한 참조값은 reference variable(참조 변수)에 담기게 됩니다.

즉 reference variable을 통해 객체에 point할 수 있다는 뜻입니다(pointer의 개념 => 인스턴스화 되었기 때문에 해당 클래스의 인스턴스의 메모리를 점유하고 이를 접근할 수 있음). 다른 말로하면, reference variable은 객체에 대한 pointer로 역할을 합니다. reference variable은 메모리안에서 같은 객체에 point를 하며 서로간의 할당이 가능합니다. (단, 이 개념은 같은 클래스를 통해 만들어졌던가, 아니면 상속관계에 있어야 합니다)

예를 들어, r_vehicle2r_vehicle1에 할당 된다면, r_vehicle1r_vehicle2는 메모리에서 같은 객체를 가르키고 있다는 뜻입니다.

더보기

Garbage Collector

 

객체가 더 이상 어떠한 첨조되는 것을 가지지 않을 때, garbage collector가 자동으로 메모리에서 객체를 삭제합니다.
앞서선 예시에서, r_vehicle1r_vehicle2를 인스턴스화했을 때, 각각은 다른 객체를 바라보고 있습니다(point하고 있습니다). 그러나, r_vehicle2r_vehicle1에 할당했다면. 두 point 모두 같은 객체를 보게 될 것이고, r_vehicle2에 할당되었던 메모리는 더이상 r_vehicle2가 아닌 r_vehicle1의 메모리를 보기 때문에 삭제될 것입니다.

이 남는 메모리 공간을 릴리즈 하기 위해서, the garbage collecor system이 더이상 참조되지 않는 객체들을 자동으로 밀어냅니다. 

 

반응형