ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.