본문 바로가기

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

Principles of OOP Part3 : Methods

Methods는 객체(object)의 행동을 결정하고 클래스의 내부 절차(internal procedures)로서 역할을 합니다. Methods는
methods라는 키워드( static의 경우 class-methods)를 사용하여 클래스의 definition part에 정의되고, 클래스의 implementation part의 method~endmethod 블락 사이에서 기능이 구현됩니다. Methods는 클래스의 모든 attrubutes에 접근이 가능하고 객체의 상태(state of object)를 바꿀 수 있습니다

CL_GUI_ALV_GRID METHOD 예시

개발자는 소스코드로 methods를 구현하여 객체의 행동을 정의할 수 있습니다. Methods는 종종 parameter interface( signature라고 불리우는) 를 포함하기 때문에 호출하는 프로그램( 혹은 다른 객체)과 parameter를 주고 받습니다. Methods는 importing, exporting, changing, returning 파라미터를 가질 수 있습니다.

Parameter는 by value 혹은 by reference로 값을 전달합니다. 해당 내용에 대해서는 아래 기존에 발행한 글이 있습니다.

2022.12.30 - [ABAP 프로그래밍 개념/Modulazation Technique] - Pass by Value [vs] Pass by Reference

 

Pass by Value [vs] Pass by Reference

SAP에서 Processing Block으로 대표되는 Subroutine, Function Module, Method의 경우에는 전부 Parameter Interface(매개변수를 통해 데이터를 주고받는 방식)으로 구성되어있다. 여기서 가장 중요한 개념이 Parameter

abapta0903.tistory.com

Additions로 붙을 수 있는 optional과 default는 importing과 changing parameter에 사용될 수 있고, 그것이 필수값이 아닌지, 그리고 default value를 부여할 수 있습니다. 

Parameter가 optional로 전달된다면, 호출하는 프로그램은 이 Parameter에 Method를 호출할 때 값을 전달하는 것에 강요받지 않습니다(즉, 필수값이 아니기 때문에 반드시 입력할 필요는 없습니다.) optional Parameter에 값이 전달되지 않았다고 하더라고, 그 값은 해당 data type의 initial value(초기값 : char라면 빈 칸, dats라면 0000.00.00 등 )이 전달되는 것이다. 유가하게. default라는 addition은 초기값을 세팅해주어서(data type의 초기값이 아닌 개발 단계에서 무슨 초기값을 쓸지 사전 세팅한다는 개념) 개발자에게 Parameter을 optional로 만들 수 있게 해준다.

Static Method는 Class 이름과 Static Component Selector( "=>" ) 을 사용해서 직접 호출될 수 있는 반면, Instace Method는 오직 객체 참조( Class를 실제 인스턴스화)하고 Instance Component Selecor( "->" )를 사용해서 호출 될 수 있습니다.

REPORT ZDEMO_VEHICLE.

 CLASS CL_VEHICLE DEFINITION.
 	
    PUBLIC SECTION.
	
    CLASS-METHODS add_vehicles IMPORTING count TYPE i.
	METHODS get_vehicles RETURNING VALUE(count) TYPE i.

	PRIVATE SECTION.
	
    CLASS-DATA no_of_vehicles TYPE i.

ENDCLASS.

CLASS CL_VEHICLE IMPLEMENTATION.
	METHOD add_vehicles.
		ADD count TO no_of_vehicles.
	ENDMETHOD.
    
    METHOD get_vehicles.
    	count = no_of_vehicles.
    ENDMETHOD.
ENDCLASS.

DATA o_vehicle TYPE REF TO cl_vehicle.
DATA v_vehicles TYPE i.

START-OF-SELECTION.

	CL_VEHICLE=>add_vehicles( 10 ).
*The above statement can also be written as CALL METHOD 
*->CALL METHOD  CL_VEHICLE=>add_vehicles( importing count = 10 ).

    CREATE OBJECT o_vehicle.

    v_vehicles = o_vehicle->get_vehicles( ).

위 예시는, Static Method add_vehicles와  Instace Method인 get_vehicles를 가집니다.  메인 프로그램의 Event-Block인 start-of-selection에서 Static Method인 add_vehicles는 Class 이름과 => 과 함께 직접 호출되었습니다. 반면, get_vehicles라는 Instance Method에는, cl_vehicle이라는 클래스가 프로그램에 언급되어야 하고 이를 참조 객체로 만든 o_vehicle이 필요합니다. 참조 객체(reference object)는 create data라는 구문을 통해 인스턴스화 됩니다. 참조 객체가 인스턴스화되면, Instace Method는 객체 이름과 '->'를 통해 호출 됩니다. 

Static Public Attributes는 클래스 이름과 Static Component Selector("=>")를 사용해서 외부에서 접근이 가능합니다. 반면에, Public Instance Attribute는 객체 잠조와 Instance Component Selctor("->")를 사용해서 접근 가능합니다.

returning parameters을 사용하는 methods 들은 funcitonal methods라고 불리웁니다. returning parameters는 pass by value로 값을 통과시킵니다. SAP NetWeaver 7.4에 앞서서, funcitonal methods에서는 오직 하나의 returning parameter, exporting parameter는 존재하지 않았습니다. 그러나, SAP NetWeaver 7.4와 함께, 이러한 제한은 해제되었습니다.  funcitonal methods는 전형적으로 Methods의 결과를 호출한 프로그램에 반환되어 줄 때 프로그램 안에 있는 data object에 바로 할당하기 위해서 사용됩니다.

예를 들어, 위에 코드 예시와 같이, method get_vehicles은 returning parameter인 count로 구성됩니다. 이 method는 프로그램에서 v_vehicles = o_vehicle->get_vehicles( )로 불리우며 호출됩니다, v_vehicles는 프로그램에서의 변수이고, o_vehiclecl_vehicle이 프로그램에서 인스턴트화 된 인스턴스 오브젝트입니다. 만약,  funcitonal methods는 어떠한 import parameter도 포함할 수 있고, 이 parameters는 method가 호출되는 parentheses(삽입 어구)에서 값을 전달할 수 있습니다(예시 : v_xyz = obj->get_xyz( abc = 123 ) : 괄호 안에 있는 대상이 import parameter로 쓰입니다). funcitonal methods는 다양한 표현에서 직접적으로 사용될 수 있는데, 대표적인 예로는 , Logical Expression(IF, ELSEIF, WHILE ,CHECK 등), CASE 구문, LOOP 구문, arithmetic expressions, Move 구문 등이 있습니다.

Methods는 클래스의 PUBLIC SECTION에 정의되어서 외부 프로그램(혹은 타 객체들)에서 접근하는 것을 하락 하게 할 수 있고, 또는 PRIVATE SECTION에 선언하여 같은 클래스의 Method에서만 접근하게 할 수 있습니다. 클래스의 Public MTHOD는 같은 클래스 내부의 어떠한 Private method를 호출할 수 있습니다. 앞서 언급했듯이, setter method와 getter method를 PUBLIC SECTION에 선언함으로서 클래스의 private attributes에 접근할 수 있습니다.

같은 클래스의 components에 접근할 때, me라는 자기 참조(self-reference variable)를 사용하는 것을 추천합니다. 예를들어, method meth1이 같은 클래스의 meth2로부터 호출되었다면, 당신은 meth2안에 소스코드에서 me>meth1( )로 진행할 수 있습니다. 클래스의 components들이 같은 클래스 안의 methods안에서 직접 접근 가능하지만, 같은 클래스의 components에 접근 할 때는 me라는 self-reference variable을 사용해서 접근하는 것이 더 가독성에 좋습니다. self-reference variable는 만약 같은 이름을 가질 수 있는 method안의 local varible(지역 변수)와 구분짓게 해줍니다.

Self-Reference Variable 예시

같은 클래스 내의 components를 가지고 일할 때, 당신은 Instace method안에서는 Static & Instance Components 둘 다 접근이 가능하지만, Static Method안에서는 Static Component에만 접근이 가능합니다.

반응형