METHOD 선언
▪인스턴스 메서드를 선언하려면 다음 구문을 사용한다.
METHODS meth IMPORTING [value i1..]
EXPORTING [value e1..]
CHAINGING [value c1..]
RETURNING VALUE (r)
EXCEPTIONS exc1....
▪Static 메서드를 선언하려면 아래와 같이 선언한다.
CLASS-MEHTODS meth....
▪메서드를 선언시 IMPORTING, EXPORTING, CHANGING, RETURNING을 이용해 파라미터 인터페이스를 정의할 수 있다.
인터페이스 파라미터의 속성을 정의하며, 파라미터의 참조 주소(Reference)와 값(value)을 선택하여 사용할 수 있다.
▪값을 매개 변수로 넘겨주려면 VALUE 구문을 선언하여야 하며 RETURN VALUE는 항상 값으로 반환된다.
Method 구현
▪클래스에서 선언된 IMPLEMENTATION 파트에서 선언하고 기능을 구현해야한다.
(IMPLEMENTATION 또는 Implementation라는 것은 메서드의 기능을 구현하는 것을 의미)
METHOD meth.
...
ENDMETHOD.
▪메서드를 구현할 때 클래스의 메서드 선언 부분에 정의한 것 이외에 인터페이스 파라미터를 정의할 필요는 없다. 인터페이스 파라미터는 지역 변수와 같은 역할을 하기 때문에 메서드 내에 DATA 구문을 이용하여 지역변수를 정의하면 된다.
▪Funcion Module와 같이 RAISE exception과 MESSAGE RAISING 구문을 이용하여 에러를 처리할 수 있다.
Static 메서드를 사용할 때는 클래스의 Static 속성에서만 적용됨에 주의하여야한다. 인스턴스 메서드는 Static과 Instance 속성에 모두 작동 가능.
METHOD 호출
▪메서드를 호출하려면 다음과 같은 구문을 사용.
CALL METHOD meth EXPORTING i1 = f1 i2 = f2 ...
IMPORTING e1 = g1 e2 = g2 ...
CHANGING c1 = f1 c2 = f2 ...
RECEIVING r = h
EXCEPTIONS e1 = rc1 e2 = rc2...
▪메서드 내에서 다른 메서드를 호출하려면 CALL METHOD meth...와 같이 사용하면 된다.
▪클래스의 외부에서 메서드를 호출하려면 CALL METHOD ref->meth. 구문을 이용한다.
(여기서 ref는 클래스의 인스턴스를 가리키는 값을 가진 객체 참조 변수.)
▪메서드를 호출할 때, EXPORTING 또는 CHANGING 구문과 같은 필수 엔트리는 반드시 선언하여야 한다.
▪단, IMPORTING 또는 RECEIVING 구문은 필수 구문이 아니다.
▪에러 처리를 위한 EXCEPTIONS 구문도 반드시 사용해야하는 것은 아니다.
▪IMPORTING 파라미터 하나로 구성된 메서드를 호출하려면 아래 구문을 이용한다.
CALL METHOD METHOD ( f ).
▪IMPORTING 파라미터 여러 개로 구성된 경우는 다음과 같이 기술한다.
CALL METHOD METHOD( i1 = f1 i2 = f2 ..)
파라미터 f의 값들은 각각 변수에 할당되어 사용된다.
IMPORTING 파라미터 | 표현식 |
없음 | meth() |
한 개 | meth( f ) or meth ( p=f ) |
여러 개(n개) | meth (p1 = f1 .... pn = fn ) |
동적인 METHOD 호출
▪동적으로 메서드를 호출하려면 dynamic 기호인 ( )를 사용한다.
CALL METHOD ref->(f)
▪Static 메서드는 다음과 같이 사용할 수 있다CALL METHOD class=>(f)CALL METHOD (c)=>methCALL METHOD (c)=>(f)
▪PERFORM 구문, FUCTION MODULE과는 다르게 PARAMETER-TABLE 구문을 추가하여 파라미터도 동적으로 선언할 수 있다.
CALL METHOD .... PARAMETER-TABLE ptab
EXCEPTION-TAGBLE etab.
예제.
CLASS c1 DEFINITION.
PUBLIC SECTION.
DATA : gt_itab TYPE TABLE OF sflight,
gs_str TYPE sflight.
METHODS : get_data,
write_data.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD : get_data.
SELECT * INTO TABLE gt_itab
FROM sflight
UP TO 5 ROWS.
ENDMETHOD.
METHOD : write_data.
LOOP AT gt_itab INTO gs_str.
WRITE :/ gs_str-carrid, gs_str-connid.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
DATA go_oref TYPE REF TO c1.
DATA gv_mth TYPE string.
FIELD-SYMBOLS <fs> TYPE ANY.
START-OF-SELECTION.
CREATE OBJECT go_oref.
gv_mth = 'GET_DATA'.
CALL METHOD go_oref->(gv_mth).
gv_mth = 'WRITE_DATA'.
CALL METHOD go_oref->(gv_mth).
결과
AA 0017
AA 0017
LH 0056
LH 0056
EVENT HANDLER METHOD
▪앞선 글에서 설명하였듯이, 이벤트 핸들러 메서드는 CALL METHOD로 호출될 수 없는 특별한 타입의 메서드이다.
▪CALL METHOD 대신에 이벤트를 이용해서 호출한다.
메서드를 이벤트 핸들러 메서드로 선언하려면 METHODS 또는 CLASS-METHODS 부분에 다음 구문을 추가로 기술해야한다.
METHODS 메소드명 FOR EVENT 이벤트명(evt) OF 클래스명
파라미터로 구성된 메서드는 이벤트 evt의 exporting 파라미터가 된다. 파라미터의 속성은 evt(EVENTS) 구문으로 선언된다.
Constructor
▪Constructor은 CALL METHOD로 호출할 수 없는 특별한 메서드.
▪대신, 클래스 또는 신규 객체의 초깃값을 지정할 때 Runtime 환경에서 시스템에 의해 자동으로 호출된다.
▪두 가지 유형의 생성자가 존재
1. Instance Constructor - CREATE OBJECT 구문을 통해 인스턴스가 생성될 때마다 호출됨
2. Static Constructor - 클래스를 처음호출할 때 한번만 사용.
METHODS CONSTRUCTOR
IMPORTING [ VALUE i1 i2 ...] TYPE type [OPTIONAL]...
EXCEPTIONS exc1 exc2 ...
▪이 구문에서 CONSTRUCTOR는 OUTPUT 파라미터가 존재하지 않고 단지 클래스의 상태만을 정의하는 것임을 알 수 있다. 클래스의 Instance Constructor는 이미 선언된 메서드 CONSTRUCTOR이다.
▪다른 메서드와 같이 PUBLIC 부분에 선언하고 IMPLEMENTATION 파트에서 메서드에 대해서 기술할 수 있다.
Static Constructor는 클래스가 처음으로 접근되기 전에 프로그램에서 한번 호출된다.
클래스의 Static Constructor는 이미 CLASS_CONSTRUCTOR로 내부적으로 선언되어있다.
다른 메스드와 같이 PUBLIC 부분에 CLASS-METHODS CLASS_CONSTRUCTOR라 선언하고, IMPLEMENTATION 파트에서 기능을 기술할 수 있다.
CLASS-METHODS CLASS_CONSTRUCTOR.
▪Static Constructor는 파라미터가 없다. 클래스가 처음으로 접근하기 전에 시스템이 Static Constructor를 호출하기 때문이다. 이러한 이유로 Static Constructor는 자신의 클래스 항목에 접근할 수 없다.
예제 - Instace Constructor를 명시적으로 선언하는 방법을 실습해보자.
CLASS c1 DEFINITION.
PUBLIC SECTION.
DATA : gt_itab TYPE TABLE OF sflight,
gs_str TYPE sflight.
DATA : gv_carrid TYPE s_carr_id,
gv_connid TYPE s_conn_id.
METHODS : constructor IMPORTING i_carrid TYPE s_carr_id.
i_connid TYPE s_conn_id.
METHODS : get_data.
ENDCLASS.
CLASS c1 IMPLEMENTAION.
METHOD : constructor.
gv_carrid = i_carrid.
gv_connid = i_connid.
ENDMETHOD.
METHOD : get_data.
SELECT * INTO TABLE gt_itab
FROM sflight
WHERE carrid = gv_carrid
AND connid = gv_connid.
ENDMETHOD.
ENDCLASS.
DATA go_oref TYPE REF TO c1.
START-OF-SELECTION.
CREATE OBJECT go_oref
EXPORTING
i_carrid = 'AA'
i_connid = '0017'.
CALL METHOD go_oref->get_data.
LOOP AT go_oref->gt_itab INTO go_oref->gs_str.
WRITE :/ go_oref->gs_str-carrid, go_oref->gs_str-connid, go_oref->gs_str-fldate.
ENDLOOP.
결과
AA 0017 2012-12-15
AA 0017 2013-01-12
AA 0017 2013-02-09
AA 0017 2014-03-09
'ABAP 프로그래밍 개념 > Object-Oriented ABAP' 카테고리의 다른 글
Procedural Programming vs Object-Oriented Programming (1) | 2023.01.01 |
---|---|
Object Oriented 언어로서의 ABAP (0) | 2023.01.01 |
OBJECT(객체)란? (1) | 2020.08.12 |
CLASS [2] 구성요소 (0) | 2020.08.05 |
CLASS [1] (0) | 2020.08.04 |