ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ABAP] #34 ABAP OOP - Class (2)
    SAP/ABAP 2026. 1. 25. 21:46

     

     

     

     

     

     

     

     

    상속

    CLASS lcl_vehicle DEFINITION.
    	PUBLIC SECTION.
        	METHODS display_attributes.
    ENDCLASS.
    
    CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle. " 상속 "
    	PUBLIC SECTION.
        	METHODS display_attributes REDEFINITION. " 재정의 "
    ENDCLASS.
    
    CLASS lcl_truck IMPLEMENTATION.
        METHOD display_attributes.
        	super->display_attributes(...). " 부모 메서드 호출 "
        ENDMETHOD.
    ENDCLASS.

    상속이란 부모 클래스(Super Class)의 속성과 메서드를 자식 클래스(Sub Class)가 물려받아 사용하고 확장하는 것이다.

    CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle.

     

    접근 제어자와 상속 관계

    SECTION 상속 여부 자식 접근 재정의
    PUBLIC 상속됨 가능 가능
    PROTECTED 상속됨 가능 가능
    PRIVATE 상속됨 ❌ 불가 ❌ 불가

    ※ PRIVATE 멤버는 상속되지 않는다.

    그리고 자식 클래스에서 접근할 수 없으며, 재정의도 불가능하다.

     

    메서드 재정의 (REDEFINITION)

    자식 클래스는 부모 클래스의 메서드를 재정의할 수 있다.

    CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle.
      PUBLIC SECTION.
        METHODS display_attributes REDEFINITION.
    ENDCLASS.

    부모 메서드를 재사용하고 싶은 경우에만 super->로 호출한다.

     

    METHOD display_attributes.
      super->display_attributes( ). "선택적 호출 "
    ENDMETHOD.

     

    생성자와 상속

    인스턴스 생성자 호출 순서

    부모와 자식 클래스 모두 생성자가 있는 경우:

    1. 부모 클래스 생성자
    2. 자식 클래스 생성자

    이 순서는 시스템이 자동으로 처리한다.

    단, 부모 생성자가 파라미터를 요구하는 경우
    자식 생성자에서 super->constructor( )를 명시적으로 호출해야 한다.

     

    ABAP에서 상속 계층이 깊을 때 생성자 호출

     

    객체를 생성할 때 CREATE OBJECT 문은 생성하려는 클래스에 생성자가 있는지 먼저 확인한다.

     

    Case 1. 생성하려는 클래스에 생성자가 있는 경우

    • 해당 클래스의 생성자가 사용된다.
    • CREATE OBJECT에서 그 생성자의 파라미터를 전달해야 한다.
    CREATE OBJECT go_child
      EXPORTING iv_a1 = 100
                iv_a2 = 1000.

     

     

    Case 2. 생성하려는 클래스에 생성자가 없는 경우

    • 상속 트리를 따라 가장 가까운 상위 클래스의 생성자를 검색한다.
    • 발견된 생성자의 파라미터를 CREATE OBJECT에서 전달한다.
    CREATE OBJECT go_parent
      EXPORTING iv_a1 = 100.

     

    이 경우 부모 클래스에 생성자가 없으면 할머니 클래스의 생성자가 사용될 수 있다.

     

     

    생성자 내부에서의 호출 규칙 (super->constructor)

    • 생성자 내부에서 super->constructor( )는 바로 위 부모 클래스의 생성자만 호출 가능하다.
    • 상위 클래스의 생성자가 파라미터를 요구할 경우에만 하위 클래스 생성자에서 명시적으로 호출한다.
    METHOD constructor.
      super->constructor( iv_type = 'A' ).
    ENDMETHOD.
    • 할머니 생성자는 부모 생성자에서 책임지고 호출한다.
    • 자식 클래스가 할머니 생성자를 직접 호출하지 않는다.

     

    Protected의 의미

    • PROTECTED SECTION에 선언된 멤버는 자기 자신, 자식 클래스에서 접근 가능하며, 외부에서는 접근할 수 없다.
    • 부모 클래스는 자식 클래스에 정의된 PROTECTED 멤버에 접근할 수 없다.

    Upcast

    업캐스트란 상속 관계에서, 자식 클래스의 인스턴스를 부모 클래스 타입의 참조 변수에 담는 것을 말한다.

    • 상속 관계에서만 가능
    • 명시적 캐스팅 없이 자동으로 가능 (ABAP)
    DATA lo_parent TYPE REF TO lcl_parent.
    DATA lo_child  TYPE REF TO lcl_child.
    
    CREATE OBJECT lo_child.
    lo_parent = lo_child.   " 업캐스트 "

     

    업캐스트가 가능한 이유

    자식 클래스는 부모 클래스의 모든 PUBLIC / PROTECTED 멤버를 포함하고 있기 때문이다.

    즉, 부모 타입이 기대하는 구조와 자식 객체의 실제 구조가 호환됨.

    그래서 같은 클래스 타입이기 때문이 아니라 상속 관계이기 때문에 가능하다.

     

    접근 가능 범위

    • 부모에 정의된 메서드 접근 가능
    • 부모 메서드 재정의 접근 가능
    • 자식 전용 메서드는 접근 불가

    → 참조 변수의 타입 기준으로 접근 가능 여부 결정


    업캐스트의 장점

    1. 여러 자식 객체를 하나로 관리

    DATA gt_vehicles TYPE TABLE OF REF TO lcl_vehicle.
    
    APPEND NEW lcl_car( )   TO gt_vehicles.
    APPEND NEW lcl_truck( ) TO gt_vehicles.
    
    LOOP AT gt_vehicles INTO DATA(lo_vehicle).
      lo_vehicle->display( ).  " 각 객체의 재정의 메서드 실행 "
    ENDLOOP.

     

    2. 유지보수 & 확장성

    METHOD process_vehicle
      IMPORTING io_vehicle TYPE REF TO lcl_vehicle.
    • 새로운 자식 클래스 추가되어도
    • 메서드 시그니처 변경 X
    • 기존 로직 유지 O

     

    업캐스트 절차

    1. 부모–자식 상속 관계 존재
    2. 자식 클래스 객체 생성
    3. 부모 타입 참조 변수에 자식 객체 할당
    4. 부모 참조 변수로 메서드 호출
    5. 재정의된 자식 메서드가 실행됨

     

    다형성 (Polymorphism)과의 관계

    상속 관계에서 자식 객체를 부모 타입으로 참조하고,
    재정의된 메서드를 호출할 때 실제 객체 타입에 따라 다른 동작이 수행된다.


    Downcast

    다운 캐스팅이란 부모 타입 변수에 담겨 있는 자식 인스턴스를 다시 자식 타입 변수로 변환하는 것이다.

    DATA lo_animal TYPE REF TO lcl_animal.
    DATA lo_dog    TYPE REF TO lcl_dog.

     

    이때 자식 클래스에만 있는 메서드를 사용하기 위해 다운 캐스팅이 필요함

     

    다운 캐스트가 필요한 이유

    부모 타입 참조 변수는 부모 클래스에 정의된 메서드만 접근 가능하지만 자식 클래스 전용 메서드는 접근 불가하기 때문이다.

    lo_animal->eat( ).   " 가능 "
    lo_animal->bark( ).  " 컴파일 에러 (자식 전용 메서드) "

    자식 메서드를 쓰려면 자식 타입으로 되돌려야 함
    ➡ 이게 바로 다운 캐스팅


    업캐스팅과 다운캐스팅의 연산자

    " 업캐스팅 (자동, 안전) "
    lo_animal = lo_dog.
    
    " 다운캐스팅 (명시적, 위험) "
    lo_dog ?= lo_animal.

    ?= 는 Question Assign 연산자 “이 객체가 이 타입이 맞다면 대입해줘”라는 의미.

     

    ※ 다운 캐스팅 시 타입이 다르면 CX_SY_MOVE_CAST_ERROR 덤프 발생

    덤프를 방지하기 위해

    방법 1: TRY ~ CATCH

    TRY.
      lo_dog ?= lo_animal.
    CATCH cx_sy_move_cast_error.
      " 캐스팅 실패 처리 "
    ENDTRY.

     

    방법 2: IS INSTANCE OF (최근 SAP에서 가장 권장되는 방식)
    IF lo_animal IS INSTANCE OF lcl_dog.
      lo_dog ?= lo_animal.
    ENDIF.
    • 사전에 타입을 확인
    • 덤프 발생 X
    • 가독성 조음

    Interface

    “무엇을 할 수 있어야 하는지”만 정의하고
    “어떻게 하는지”는 구현 클래스에게 맡기는 설계 계약

     

    인터페이스 정의

    INTERFACE lif_fly.
      METHODS fly.
    ENDINTERFACE.

     

    클래스 내에서 인터페이스 사용

    1. 정의부에 INTERFACES 키워드로 선언한다.

    CLASS lcl_plane DEFINITION.
      PUBLIC SECTION.
        INTERFACES lif_fly.
    ENDCLASS.

     

    2. 구현부에서 인터페이스 구현 로직을 작성한다.

    CLASS lcl_plane IMPLEMENTATION.
      METHOD lif_fly~fly.
        WRITE: '비행기 이륙'.
      ENDMETHOD.
    ENDCLASS.

     

    인터페이스의 특징

    1. 메서드 선언만 가능 

    2. 상속이 아님

    • 클래스 상속 → 기능을 물려받음
    • 인터페이스 구현 → 규칙을 따름
    • “컴포넌트 공유”이지 “기능 상속”이 아님

    3. 다중 구현 가능

    • 하나의 클래스가 여러 인터페이스를 동시에 구현할 수 있다
    INTERFACE lif_fly.
      METHODS fly.
    ENDINTERFACE.
    
    INTERFACE lif_swim.
      METHODS swim.
    ENDINTERFACE.
    
    CLASS lcl_duck DEFINITION.
      PUBLIC SECTION.
        INTERFACES lif_fly.
        INTERFACES lif_swim.
    ENDCLASS.
    
    CLASS lcl_duck IMPLEMENTATION.
      METHOD lif_fly~fly.
        WRITE: '오리가 난다'.
      ENDMETHOD.
    
      METHOD lif_swim~swim.
        WRITE: '오리가 헤엄친다'.
      ENDMETHOD.
    ENDCLASS.

     

    인터페이스 메서드 호출 방법

    항상 인터페이스 이름을 명시해야 함

    • 클래스 메서드처럼 바로 호출 X
    • 인터페이스 네임스페이스 사용 필수
    lo_plane->lif_fly~fly( ).

     

    별칭 (ALIAS)

    CLASS lcl_plane DEFINITION.
      PUBLIC SECTION.
        INTERFACES lif_fly.
        ALIASES fly FOR lif_fly~fly.
    ENDCLASS.
    
    lo_plane->fly( ).

     

    UML 표현

    • 점선 + 빈 삼각형
    • 상속(실선)과 명확히 구분됨

     

     

    인터페이스와 다형성

    인터페이스도 다형성의 기반이 된다

    DATA lo_flyer TYPE REF TO lif_fly.
    
    CREATE OBJECT lo_plane.
    lo_flyer = lo_plane.   " 업캐스팅 (인터페이스 타입) "
    
    lo_flyer->fly( ).  " 실제 객체의 fly 실행 "

     

     

     

     

     

     

    'SAP > ABAP' 카테고리의 다른 글

    [ABAP] #36 Tree  (0) 2026.02.02
    [ABAP] #35 Field Symbols + Excel Upload  (1) 2026.01.31
    [ABAP] #33 ABAP OOP - Class (1)  (0) 2026.01.16
    [ABAP] #32 ABAP OOP  (0) 2026.01.16
    [ABAP] #31 Number Range  (0) 2026.01.16
Designed by Tistory.