From Zero to SAP
[ABAP] 객체지향 프로그래밍 2편 - 상속, 다형성, Abstract/Final, 정적 속성 본문
1편에서는 클래스, 메서드, 생성자, 이벤트를 다뤘다.
이번 2편에서는 상속과 다형성, Abstract/Final, 정적 속성과 생성자 를 정리한다.
마찬가지로, Java를 먼저 배운 입장에서 개념은 동일하고, ABAP 고유의 문법 위주로 정리했다.
목차
- 상속 (Inheritance)
- 오버라이딩 (Overriding)
- 다형성 (Polymorphism)
- Abstract / Final 메서드와 클래스
- 클래스 컴포넌트의 네임스페이스
- 상속과 정적 속성
- 상속과 생성자
- 배운 점
1. 상속
상속은 객체지향프로그래밍에서 빠질 수 없는 개념이다.
ABAP에서는 부모 클래스를 슈퍼클래스, 자식 클래스를 서브클래스 라고 부른다.
CLASS zcl_dog DEFINITION PUBLIC CREATE PUBLIC
INHERITING FROM zcl_animal. " Java의 extends와 동일
서브클래스는 속성이나 메서드를 추가로 정의하지 않아도 슈퍼클래스의 모든 컴포넌트를 상속받는다.
단, PRIVATE 멤버는 상속되지 않는다. PUBLIC과 PROTECTED만 상속된다. Java와 동일하다.
2. 오버라이딩
부모 메서드를 자식에서 재정의하는 것을 오버라이딩 이라고 한다.
ABAP에서는 REDEFINITION 키워드를 사용한다.
" 선언부에서 REDEFINITION 명시
METHODS speak REDEFINITION.
Java의 @Override 어노테이션과 역할이 동일하다. 다만 ABAP은 선언부에 명시하는 방식이다.
" 부모 클래스
CLASS zcl_animal DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
METHODS speak.
ENDCLASS.
CLASS zcl_animal IMPLEMENTATION.
METHOD speak.
out->write( '...' ).
ENDMETHOD.
ENDCLASS.
" 자식 클래스
CLASS zcl_dog DEFINITION PUBLIC CREATE PUBLIC
INHERITING FROM zcl_animal.
PUBLIC SECTION.
METHODS speak REDEFINITION.
ENDCLASS.
CLASS zcl_dog IMPLEMENTATION.
METHOD speak.
out->write( '멍멍!' ).
ENDMETHOD.
ENDCLASS.
super-> 로 부모 메서드 호출
오버라이딩한 메서드 안에서 부모 메서드를 호출하고 싶을 때는 super-> 를 사용한다.
METHOD display_info.
super->display_info( ). " 부모꺼 먼저 실행
out->write( |사번: { employee_id }| ). " 자식 고유 로직 추가
ENDMETHOD.
Java의 super.method() 와 완전히 동일하다.
3. 다형성
부모 타입 참조변수에 자식 객체를 할당한 후 오버라이딩된 메서드를 호출하면 자식 메서드가 실행된다.
Java와 완전히 동일하게 동작한다.
DATA lo_animal TYPE REF TO zcl_animal. " 부모 타입으로 선언
lo_animal = NEW zcl_dog( ). " 자식 객체 할당 (업캐스팅 - 자동)
lo_animal->speak( ). " → '멍멍!' 출력 (자식꺼 호출)
자식 클래스 객체를 생성하면 부모 클래스 객체도 필연적으로 함께 생성된다.
처음 Java로 객체지향을 공부할 때 이 부분이 어려웠는데, 아래 그림처럼 이해하면 쉽다.

자식 객체 안에 부모 객체가 포함된 구조로 생각하면 된다.
업캐스팅은 자동, 다운캐스팅은 ?= 기호로 명시적으로 해줘야 한다.
" 업캐스팅 - 자동
DATA lo_animal TYPE REF TO zcl_animal.
lo_animal = NEW zcl_dog( ).
" 다운캐스팅 - ?= 명시 필요 (Java의 (ChildType) 캐스팅과 동일)
DATA lo_dog TYPE REF TO zcl_dog.
lo_dog ?= lo_animal.
4. Abstract / Final 메서드와 클래스
Java의 abstract, final 키워드와 완전히 동일한 개념이다.
| Java | ABAP | |
|---|---|---|
| 추상 클래스 | abstract class |
CLASS ... DEFINITION ABSTRACT |
| 추상 메서드 | abstract void mth() |
METHODS mth ABSTRACT |
| Final 클래스 | final class |
CLASS ... DEFINITION FINAL |
| Final 메서드 | final void mth() |
METHODS mth FINAL |
규칙 정리:
ABSTRACT클래스 → 객체 직접 생성 불가, 자식에서 구현 강제ABSTRACT메서드 → 구현 내용 없음, 자식에서 반드시REDEFINITIONFINAL클래스 → 상속 불가FINAL메서드 → 오버라이딩 불가
Java와 다른 점 하나
Java는 추상 메서드 선언부만 작성하면 된다. 구현 블록 자체가 없어도 된다.
그러나 ABAP은 DEFINITION 이랑 IMPLEMENTATION 이 항상 쌍으로 존재해야 하는 언어 규칙이 있다.
내용은 비워도 되지만, 구현 블록 자체는 반드시 있어야 한다.
CLASS zcl_abstract_shape DEFINITION
PUBLIC ABSTRACT CREATE PUBLIC.
PUBLIC SECTION.
METHODS calculate_area ABSTRACT.
ENDCLASS.
CLASS zcl_abstract_shape IMPLEMENTATION.
" 내용은 비워도 되지만 이 블록 자체는 필수
ENDCLASS.
" 자식 클래스에서 추상 메서드 구현
CLASS zcl_rectangle DEFINITION
PUBLIC FINAL CREATE PUBLIC
INHERITING FROM zcl_abstract_shape.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
METHODS calculate_area REDEFINITION.
ENDCLASS.
CLASS zcl_rectangle IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA(lo_rect) = NEW zcl_rectangle( ).
lo_rect->calculate_area( ).
ENDMETHOD.
METHOD calculate_area.
DATA(lv_width) = 5.
DATA(lv_height) = 10.
out->write( |Rectangle area: { lv_width * lv_height }| ).
ENDMETHOD.
ENDCLASS.
5. 클래스 컴포넌트의 네임스페이스
상속 트리에서 컴포넌트 이름 규칙이다.
| 접근 제한자 | 네임스페이스 범위 |
|---|---|
PUBLIC |
상속 트리 전체에서 유일한 이름 |
PROTECTED |
상속 트리 전체에서 유일한 이름 |
PRIVATE |
소속 클래스 내에서만 유일 |
PUBLIC / PROTECTED 속성·메서드는 부모·자식 간에 같은 이름 중복이 불가하다.PRIVATE 속성·메서드는 각 클래스 안에서만 이름이 유일하면 된다.
그래서 오버라이딩할 때 REDEFINITION 키워드를 쓰는 거다.
"나는 이미 존재하는 이름을 재정의하겠다" 고 명시하는 것이다.
6. 상속과 정적 속성
정적 속성(CLASS-DATA)은 상속 트리에서 딱 하나만 존재한다.
비유하면, 부모 집 거실 TV는 자식이 독립해도 여전히 부모 집 거실에 하나다.
자식 클래스가 아무리 많아도CLASS-DATA는 복사되지 않고 공유된다.
서브클래스는 슈퍼클래스의 PUBLIC / PROTECTED 정적 속성에 접근 가능하고,
객체를 생성하지 않아도 => 기호로 바로 접근할 수 있다.
CLASS zcl_static DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
CLASS-DATA gv_counter TYPE i VALUE 0. " 정적 속성
CLASS-METHODS increment_counter. " 정적 메서드
CLASS-METHODS display_counter.
ENDCLASS.
CLASS zcl_static IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
out->write( 'STATIC 메서드:' ).
" 객체 생성 없이 클래스명=> 로 바로 호출
zcl_static=>increment_counter( ).
zcl_static=>increment_counter( ).
zcl_static=>increment_counter( ).
" 정적 속성 직접 접근 및 수정
zcl_static=>gv_counter = zcl_static=>gv_counter + 1.
out->write( |STATIC 속성: { zcl_static=>gv_counter }| ).
ENDMETHOD.
METHOD increment_counter.
gv_counter = gv_counter + 1.
out->write( |Counter value: { gv_counter }| ).
ENDMETHOD.
METHOD display_counter.
out->write( |Counter value: { gv_counter }| ).
ENDMETHOD.
ENDCLASS.
실행 결과
STATIC 메서드:
Counter value: 1
Counter value: 2
Counter value: 3
STATIC 속성: 4
7. 상속과 생성자
7-1. 인스턴스 생성자 규칙
Java랑 거의 같은데, 딱 하나 다른 점이 있다.
| Java | ABAP | |
|---|---|---|
| 부모 생성자 자동 호출 | super() 자동 삽입 |
부모에 파라미터 없으면 자동 호출 |
| 부모 생성자 명시 호출 | super(param) |
super->constructor( param = val ) |
| 부모 생성자 재정의 | 불가 | 불가 |
핵심 규칙
- 부모 생성자에 파라미터 없으면 → 자동 호출, 생략 가능
- 부모 생성자에 파라미터 있으면 →
super->constructor( )반드시 명시
" ================================
" 부모 클래스
" ================================
CLASS zcl_person DEFINITION
PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
DATA: name TYPE string,
age TYPE i.
METHODS constructor
IMPORTING p_name TYPE string
p_age TYPE i.
METHODS display_info.
ENDCLASS.
CLASS zcl_person IMPLEMENTATION.
METHOD constructor.
name = p_name.
age = p_age.
ENDMETHOD.
METHOD display_info.
out->write( |이름: { name } 나이: { age }| ).
ENDMETHOD.
ENDCLASS.
" ================================
" 자식 클래스
" ================================
CLASS zcl_employee DEFINITION
PUBLIC FINAL CREATE PUBLIC
INHERITING FROM zcl_person.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
DATA: employee_id TYPE string.
METHODS constructor
IMPORTING p_name TYPE string
p_age TYPE i
p_emp_id TYPE string.
METHODS display_info REDEFINITION.
ENDCLASS.
CLASS zcl_employee IMPLEMENTATION.
METHOD constructor.
" 부모 파라미터 있으니 super->constructor 필수!
super->constructor( p_name = p_name p_age = p_age ).
employee_id = p_emp_id.
ENDMETHOD.
METHOD display_info.
super->display_info( ). " 부모꺼 먼저
out->write( |사번: { employee_id }| ). " 자식 고유 출력
ENDMETHOD.
METHOD if_oo_adt_classrun~main.
DATA(lo_emp) = NEW zcl_employee(
p_name = '김철수'
p_age = 28
p_emp_id = '1001'
).
lo_emp->display_info( ).
ENDMETHOD.
ENDCLASS.
실행 결과:
이름: 김철수 나이: 28
사번: 1001
7-2. 정적 생성자 규칙
| 인스턴스 생성자 | 정적 생성자 | |
|---|---|---|
| 키워드 | METHODS constructor |
CLASS-METHODS class_constructor |
| 호출 시점 | NEW 할 때마다 |
클래스 첫 접근 시 딱 1번 |
| 파라미터 | IMPORTING 가능 |
파라미터 없음 |
| 상속 시 실행 순서 | 자식 생성자가 부모 호출 | 부모 먼저, 자식 나중 |
정적 생성자는 시스템이 자동으로 호출하기 때문에 파라미터를 받을 수 없다.
Java의 static { } 블록과 동일하다.
CLASS zcl_static_ctor DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
CLASS-DATA gv_counter TYPE i.
CLASS-METHODS class_constructor. " 파라미터 없음
CLASS-METHODS display_counter.
ENDCLASS.
CLASS zcl_static_ctor IMPLEMENTATION.
METHOD class_constructor.
" 클래스 첫 접근 시 딱 1번 자동 실행
gv_counter = 100.
ENDMETHOD.
METHOD display_counter.
out->write( |Counter value: { gv_counter }| ).
ENDMETHOD.
METHOD if_oo_adt_classrun~main.
" class_constructor는 이미 자동 실행된 상태
zcl_static_ctor=>display_counter( ).
ENDMETHOD.
ENDCLASS.
실행 결과:
Counter value: 100
8. 배운 점
2편에서 다룬 내용을 한 줄로 요약하면 이렇다.
ABAP 상속은 Java 상속이랑 99% 같다. 키워드만 다르다.
핵심 키워드 정리
| 개념 | ABAP 키워드 | Java 대응 |
|---|---|---|
| 상속 | INHERITING FROM |
extends |
| 오버라이딩 선언 | METHODS mth REDEFINITION |
@Override |
| 부모 메서드 호출 | super->method( ) |
super.method() |
| 부모 생성자 호출 | super->constructor( ) |
super() |
| 추상 클래스 | DEFINITION ABSTRACT |
abstract class |
| 추상 메서드 | METHODS mth ABSTRACT |
abstract void mth() |
| Final 클래스 | DEFINITION FINAL |
final class |
| 다운캐스팅 | lo_child ?= lo_parent |
(ChildType) obj |
| 정적 멤버 접근 | class=>member |
Class.member |
다음 포스팅에서는 인터페이스(Interface) 와 캐스팅(다형성 심화) 을 다룰 예정이다.
개발 환경: Eclipse ADT + SAP BTP Trial
참고 교재: HANA 기반 Easy ABAP 3.0
'ABAP > 이론' 카테고리의 다른 글
| [ABAP] 객체지향 프로그래밍 3편 - 인터페이스, 이벤트 심화 (0) | 2026.04.20 |
|---|---|
| ABAP Dictionary 정리 - 테이블 구조, Domain/Data Element 관계, CDS View 어노테이션, Conversion Routine 버그 원인까지 (1) | 2026.04.15 |
| ABAP 인터널 테이블 - 데이터 변경·삭제·읽기( MODIFY / DELETE / READ, BINARY SEARCH ) (0) | 2026.04.10 |
| ABAP 인터널 테이블 - 데이터 추가 (INSERT / APPEND / COLLECT , FOR 반복문) (2) | 2026.04.10 |
| ABAP 인터널 테이블 - Standard / Sorted / Hashed (키 종류,성능 비교) (0) | 2026.04.10 |