-
[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.생성자와 상속
인스턴스 생성자 호출 순서
부모와 자식 클래스 모두 생성자가 있는 경우:
- 부모 클래스 생성자
- 자식 클래스 생성자
이 순서는 시스템이 자동으로 처리한다.
단, 부모 생성자가 파라미터를 요구하는 경우
자식 생성자에서 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
업캐스트 절차
- 부모–자식 상속 관계 존재
- 자식 클래스 객체 생성
- 부모 타입 참조 변수에 자식 객체 할당
- 부모 참조 변수로 메서드 호출
- 재정의된 자식 메서드가 실행됨
다형성 (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