-
[ABAP] #33 ABAP OOP - Class (1)SAP/ABAP 2026. 1. 16. 22:59
https://engineering-student.tistory.com/134
[ABAP] #25 Class
Class데이터를 저장하고(속성) 기능을 수행하는(메서드) 하나의 설계도 또는 틀이다.ABAP 레포트에서는 주로 로직 분리, ALV 이벤트 처리, 재사용성 확보를 위해 클래스를 사용한다. Class Type1. Global C
engineering-student.tistory.com
로컬 클래스 (Local Class)
- 프로그램 안에서 정의되는 클래스
- 전역(Dictionary)이 아닌 Report / Module Pool 내부에서만 사용
- 프로그램이 실행될 때 함께 로드됨
CLASS lcl_test DEFINITION. PUBLIC SECTION. METHODS: say_hello. ENDCLASS. CLASS lcl_test IMPLEMENTATION. METHOD say_hello. WRITE: 'Hello ABAP OO'. ENDMETHOD. ENDCLASS.ABAP의 실행 흐름과 클래스
- ABAP은 기본적으로 순차 실행 언어
- 하지만 클래스 정의부(DEFINITION / IMPLEMENTATION) 는 실행 로직이 아니라 선언 영역
즉, 프로그램 흐름 중간에 클래스를 정의할 수 있지만 실제 실행은 객체 생성과 메서드 호출 시점에 이루어진다.
클래스 정의부 기본 구조
CLASS class_name DEFINITION. ... TYPES:... . CONSTANTS: ... . DATA: v1 TYPE local_type, v2 TYPE global_type, v3 TYPE v1, v4 TYPE built_in_type VALUE val, v5 TYPE ... READ-ONLY, v6 TYPE REF TO class_name, v7 TYPE REF TO interface_name, v8 TYPE REF TO type_name. CLASS-DATA: ... . METHODS: ... . CLASS-METHODS: ... . ENDCLASS.※ READ-ONLY
외부 접근만 제한하는 옵션이다.
즉, 외부에서 조회 가능, 수정 불가
내부에서 조회 가능, 수정 가능
※ 변수 선언은 PRIVATE SECTION에서 하는게 좋다.
- 외부에서 직접 접근 차단
- 데이터 무결성 보장
- 메서드를 통해서만 데이터 변경 가능
- 캡슐화 강화
그래서 일반적으로 DATA → PRIVATE
METHODS → PUBLIC으로 선언한다.
Static
(1) CLASS-DATA
- 클래스당 1개만 존재
- 모든 객체가 같은 값 공유
- 객체 생성 없이도 접근 가능
(2) CLASS-METHODS
- 객체 생성 없이 호출 가능
- me 사용 불가
- CLASS-DATA만 접근 가능
METHODS 파라미터
CLASS classname DEFINITION. METHODS method_name [ IMPORTING iv_par TYPE type_name " 입력 전용 " EXPORTING ev_par TYPE type_name " 출력 전용 " CHANGING cv_par TYPE type_name " 입력 + 출력 " RETURNING value(rv_par) TYPE type_name " 단일 반환값 " EXCEPTIONS exception " 예외(구버전) " RAISING exception_class ]. " 클래스 기반 예외 " ENDCLASS.※ RETURNING은 1개만 가능
정의부에서 private, public을 나눠 작성해도 구현부에서는 같이 작성한다.
- 접근 제어는 정의부에서만 의미
- 구현부는 단순 구현 공간
예시 코드
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. "외부에서 접근이 가능함 " METHODS: set_attribute IMPORTING iv_make TYPE s_make iv_model TYPE s_model, display_attributes. CLASS-METHODS: display_global_vehicles. PRIVATE SECTION. "외부에서 접근이 불가능함 " DATA: mv_make TYPE s_make, mv_model TYPE s_model. CLASS-DATA: gv_vehicles TYPE i. ENDCLASS. CLASS lcl_vehicle IMPLEMENTATION. METHOD set_attribute. "instance method " mv_make = iv_make. "private 변수에 접근 가능 " mv_model = iv_model. gv_vehicles = gv_vehicles + 1. ENDMETHOD. METHOD display_attributes. WRITE:/ 'Make : ', mv_make, / 'Model: ', mv_model. ENDMETHOD. METHOD display_global_vehicles. WRITE:/ 'Number of vehicle : ', gv_vehicles. ENDMETHOD. ENDCLASS.
객체 생성 (Instance)
- 클래스는 설계도
- 객체(인스턴스)는 실제 사용 단위
- CREATE OBJECT 구문으로 생성
- 동일 클래스에서 여러 객체 생성 가능
DATA lo_obj TYPE REF TO lcl_test. CREATE OBJECT lo_obj.- 참조 변수를 다른 참조 변수에 대입하여 동일한 객체 인스턴스를 참조할 수 있다.
lo_obj1 ─┐ ├──► [ 객체 A ] lo_obj2 ─┘ lo_obj3 ─────► [ 객체 B ] ************************************************* DATA: lo_obj1 TYPE REF TO lcl_test, lo_obj2 LIKE lo_obj1, lo_obj3 LIKE lo_obj1. CREATE OBJECT lo_obj1. lo_obj2 = lo_obj1. " 같은 주소값 할당 " CREATE OBJECT lo_obj3.객체 간 관계
- 객체지향에서는 객체들이 서로 협력
- 관계는 Client / Server 구조로 표현
객체 A (Client) → 객체 B (Server) 서비스 요청 (Method Call)
가비지 컬렉터(Garbage Collector)
- ABAP에서는 객체 메모리를 개발자가 직접 삭제하지 않으며,
더 이상 참조되지 않는 객체는 Garbage Collector에 의해 자동으로 회수된다. - CLEAR와 FREE는 참조를 해제하는 역할을 하며,
실제 메모리 해제는 Garbage Collector가 수행한다.
다중 객체
동일한 클래스에서 여러 객체(인스턴스)를 생성할 수 있으며, 객체의 참조 변수는 재사용 가능하다.
내부 테이블에 REF TO 타입을 사용하면 여러 객체를 관리할 수 있다.DATA: go_vehicle TYPE REF TO lcl_vehicle, gt_vehicle TYPE TABLE OF REF TO lcl_vehicle. CREATE OBJECT go_vehicle. APPEND go_vehicle TO gt_vehicle. CREATE OBJECT go_vehicle. APPEND go_vehicle TO gt_vehicle. *** 메서드 호출(신문법) **** gt_vehicle[ 1 ]->display_attributes( ). gt_vehicle[ 2 ]->display_attributes( ). gt_vehicle[ 2 ]->display_global_vehicles( ).
Instance / Class Method 호출
Instance Method는 객체가 있어야 호출 가능하고,
Class Method는 클래스 자체에 소속되어 있기 때문에 객체 생성 없이 호출 가능하다.
(Class Method를 참조변수로 호출하는 것은 가능하지만 비권장)
클래스명=>class-method이름( ). 클래스명=>method이름( ). " 오류 " 참조변수(instance)->method명( ). 참조변수(instance)->class-method명( ).※ Instance Method 호출 시 문법
*** 구문법 *** CALL METHOD go_vehicle->motor_on( ). CALL METHOD go_vehicle->set_attribute EXPORTING iv_make = 'MK1' iv_model = 'MODEL1'. *** 신문법 *** go_vehicle->motor_on( ). go_vehicle->set_attribute( EXPORTING iv_make = 'MK1' iv_model = 'MODEL1' ).
생성자
- 객체가 생성될 때 자동으로 실행되는 특수한 메서드
- 명시적으로 호출할 수 없다.
- PUBLIC SECTION에 생성자를 정의해야한다.
1. 클래스 생성자
- 클래스가 처음 사용될 때 단 한 번만 실행
- 객체 생성 여부와 무관
- 파라미터, EXCEPTIONS 정의 불가
- 클래스 전역 초기화 용도
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. CLASS-METHODS: class_constructor. ENDCLASS. CLASS lcl_vehicle IMPLEMENTATION. METHOD class_constructor. gv_vehicles = 100. ENDMETHOD. ENDCLASS.2. 인스턴스 생성자
- 객체 생성 시마다 실행
- 파라미터, EXCEPTIONS 정의 가능
- CREATE OBJECT 시 전달된 값으로 자동 실행
- 직접 호출 불가
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS: constructor IMPORTING iv_make TYPE s_make iv_model TYPE s_model EXCEPTIONS wrong_planetype. ENDCLASS. CLASS lcl_vehicle IMPLEMENTATION. METHOD constructor. ENDMETHOD. ENDCLASS.※ 클래스 생성자와 인스턴스 생성자 둘 다 존재할 경우 실행 순서
- 클래스 생성자가 아직 실행되지 않은 경우
클래스 생성자 → 인스턴스 생성자 순으로 실행됨.
암시적 참조 변수 : me->
객체가 생성 됐을 때 현재 작업 중인 그 객체를 참조한다는 것.
me->클래스내부변수로 명확하게 표시해주기 위함이며, 인스턴스 메서드에서만 사용 가능하다.
클래스 내부변수와 import param, local variable 이름이 중복되어 충돌이 발생하는 경우에 사용될 수 있다.
즉, 다른 언어에서 this와 같은 역할이다.
CLASS lcl_person DEFINITION. PUBLIC SECTION. METHODS constructor IMPORTING name TYPE string. PRIVATE SECTION. DATA name TYPE string. ENDCLASS. .... METHOD constructor. me->name = name. " ← me-> 로 클래스 내 변수 명확히 지정 " ENDMETHOD.'SAP > ABAP' 카테고리의 다른 글
[ABAP] #35 Field Symbols + Excel Upload (1) 2026.01.31 [ABAP] #34 ABAP OOP - Class (2) (0) 2026.01.25 [ABAP] #32 ABAP OOP (0) 2026.01.16 [ABAP] #31 Number Range (0) 2026.01.16 [ABAP] #30 LUW & Lock (0) 2026.01.16