Study 11
Object Orientation
ABAP 언어는 리포팅 기능을 개선하고자 개발된 프로그램 언어로서, 초기에는 COBOL과 PASCAL과 같은 언어의 영향을 많이 받았습니다.
ABAP Object는 ABAP의 기능이 확장된 언어로, JAVA, C++과 같은 다른 객체지향(Object-Oriented) 프로그래밍의 장점들이 통합되어 개발되었습니다.
객체지향 접근법에서는 실제 세계를 구조화 또는 추상화하여 객체를 표현합니다.
이러한 객체들은 구조를 나타내는 속성(Attribute)과 기능을 표현하는 메소드(Method)로 구성되어 있습니다.
객체지향 프로그램은 절차적인 구조에 클래스를 추가하여 상속을 정의하고 메소드를 호출하는 확장된 기능이 가능해졌습니다.
절차적 프로그램에서 사용하는 재사용성의 기능도 객체지향 프로그램에서 함께 사용할 수 있게 된 것이죠.
* 이렇게 알아두시면 좋습니다~~
- Class: 객체를 만들어 내는 설계도
- Object: 물건/물체/대상/목적이라는 의미로 사용하며, 클래스의 인스턴스, 오브젝트 생성 구문은 CREATE OBJECT 사용
- Object Reference: 프로그램 내에서 객체의 속성과 메소드에 접근 가능하게 해줌
- Attribute: 객체가 가지는 속성 또는 특성
- Method: 객체의 행위
- Event: 서로 다른 클래스 간에 호출할 수 있는 메소드
CLASS
모든 객체지향 언어의 프로그래밍에서는 먼저 클래스를 작성하고, 클래스로부터 객체를 생성해서 사용해야 합니다.
클래스는 단지 객체를 생성하는 데 사용할 뿐 객체 그 자체는 아닙니다.
자동차 설계도와 자동차를 예로 들었을 때, 자동차 설계도(클래스)는 자동차라는 제품(객체)를 정의했을 뿐, 자동차 설계도는 자동차가 될 수 없다는 말과 동일합니다.
클래스는 객체의 타입으로 정의가 가능합니다. 그리고 클래스는 객체의 추상화된 명세서로서, 객체를 만드는 설계서라고 생각하시면 됩니다.
ABAP Object에서 클래스는 전역(Global), 지역(Local) 변수로 선언이 가능합니다.
* 전역 변수는 (GV_DATA) 양식으로 사용하시면 되며, 지역 변수는 (LV_DATA) 양식으로 사용하시면 됩니다.
전역 변수는 모든 ABAP 프로그램에 접근하여 사용할 수 있으며, 지역 변수는 자신이 정의한 프로그램에서만 사용이 가능합니다.
프로그램 내에서 클래스를 정의하고 메소드의 기능을 구현하는 구문을 보겠습니다.
CLASS LCL_EVENT_HANDLER DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
ON_HOTSPOT_CLICK FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
IMPORTING ES_ROW_NO.
ENDCLASS.
CLASS LCL_EVENT_HANDLER IMPLEMENTATION.
METHOD ON_HOTSPOT_CLICK.
READ TABLE GT_DATA INTO GS_DATA INDEX ES_ROW_NO-ROW_ID.
IF SY-SUBRC = 0.
CALL SCREEN 110
STARTING AT 2 5.
ENDIF.
ENDMETHOD.
ENDCLASS.
구문을 작성할 땐 먼저 클래스를 정의해야 합니다. 클래스를 정의할 땐 DEFINITION 키워드를 사용하여 정의합니다.
클래스를 정의했으면 클래스를 구현해야 합니다. 클래스를 구현하기 위해선 IMPLEMENTATION 키워드를 사용합니다.
클래스의 모든 요소는 선언부에서 선언됩니다. 구성 요소들은 클래스 내에서 객체의 속성을 정의합니다.
클래스를 정의할 때, 각 항목은 3개의 접근 제한 영역(Visibility Section) 중 한 곳에서 선언되어야 합니다.
접근 제한 영역은 클래스 간의 외부 인터페이스를 정의합니다.
접근 제한 영역은 다음 항목에서 자세히 다루겠습니다.
클래스에는 2종류의 구성 요소가 존재합니다.
1. Instance: 각 클래스의 객체마다 존재하며, 클래스를 참고하여 객체 생성 시 객체를 생성할 때마다 초기화
2. Static:인스턴스 수에 상관없이 전체 클래스에서 오직 하나만 존재하며, 클래스 생성자(CREATE OBJECT 구문)을 만나면 프로그램이 종료할 때까지 메모리에 저장하며, 클래스에 의존적인 항목
* Static 속성은 CLASS-DATA 구문으로 선언, Static 메소드는 CLASS-METHOD 구문으로 선언
* Static 속성과 메소드는 클래스의 컴포넌트를 조작하기 위해 선언되며, 객체를 생성하지 않아도 바로 사용이 가능합니다.
ABAP Object에서 클래스는 Attribute, Method 들을 정의할 수 있습니다.
1. Attribute
속성(Attribute)은 모든 ABAP 데이터 타입을 가질 수 있는 클래스의 내부 데이터 필드입니다.
속성의 종류는 다음과 같습니다.
- Instance Attribute: DATA 구문을 사용하여 인스턴스 선언
- Static Attribute: CLASS-DATA 구문을 사용하여 인스턴스 선언
2. Method
메소드(Method)는 객체의 행위를 정의하는 클래스의 내부 수행 절차를 정의합니다. 메소드는 클래스의 모든 속성에 접근할 수 있습니다.
메소드의 종류는 다음과 같습니다.
- Instance Method: METHODS 구문을 사용하여 메소드 선언, 클래스의 모든 속성에 접근 가능, 클래스의 모든 이벤트에서 메소드 호출 가능
- Static Method: CLASS-METHODS 구문을 사용하여 메소드 선언, Static 속성 접근 가능, Static 이벤트 호출 가능
Instance
클래스로부터 객체를 만드는 과정을 인스턴스 화라고 하며, 어떤 클래스로부터 만들어진 객체를 클래스의 인스턴스라고 합니다.
객체는 모든 인스턴스를 대표하는 포괄적인 의미가 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지 강조하는 구체적인 의미 입니다.
Visibility Section(접근 제한 영역)
클래스의 접근 제한 영역은 2가지로 구분됩니다.
Public Section: 클래스에서 Public Section으로 선언된 컴포넌트들은 모든 클래스에서 접근할 수 있습니다. Public 클래스의 컴포넌트들은 클래스와 사용자 사이의 인터페이스를 구성합니다.
PUBLIC SECTION. " Public -> Private 순서로
* Instance Method.
METHODS:
SET_ATTRIBUTES IMPORTING IV_MAKE TYPE STRING
IV_MODEL TYPE STRING,
DISPLAY_ATTRIBUTES.
* Static Method.
CLASS-METHODS:
DISPLAY_O_N_VEHICLES.
Private Section: Private으로 선언된 컴포넌트는 같은 클래스의 메소드에서만 볼 수 있습니다. 외부에서 접근이 불가능하며, 완전히 클래스 내부에서 캡슐화되어 있습니다. IMPLEMENTATION 파트의 모든 메소드는 클래스 내에서 접근 제한 없이 사용할 수 있습니다.
PRIVATE SECTION.
* Instance attribute.
DATA: MV_MAKE TYPE STRING,
MV_MODEL TYPE STRING.
* Static attribute.
CLASS-DATA: GV_O_N_VEHICLE TYPE I.
* Constant(상수)
CONSTANTS: C_POS TYPE I VALUE 20.
Method
인스턴스 메소드를 선언하기 위해선 다음 구문을 사용합니다.
Static 메소드를 선언하기 위해선 CLASS-METHODS 구문을 사용합니다.
메소드를 선언할 때 Importing, Exporting, Changing, Returning을 이용하여 파라미터 인터페이스를 정의할 수 있습니다.
메소드에서 선언된 파라미터(Importing, Exporting, Changing, Returning, Exceptions, Raising)를 시그니처라고 표현합니다.
파라미터의 종류와 의미는 다음과 같습니다.
- Importing: 가져오기
- Exporting: 내보내기
- Changing: 변경하고 리턴 - 여러 개의 파라미터를 가질 수 있다.
- Returning: 리턴, 여러 개의 파라미터 소유 불가, 펑션 모듈에는 존재 X, Value 방식으로 사용 - value <파라미터 이름> 필수
- Exceptions: 임의의 이름으로 익셉션 정의
- Raising: 익셉션 클래스 이름이 와야한다.
메소드를 구현하기 위해선 METHOD ~ ENDMETHOD 구문을 사용합니다.
메소드를 호출하기 위해선 CALL METHOD 구문을 사용합니다.