Study 13
제 기준에서 오늘 내용은 좀 빡센 것 같습니다... 이해가 안가는게 많습니다... Chat GPT.. 도와주세요!!
1. UP & DOWN Casting
컴퓨터 프로그램에서 Cast는 형 변환을 의미합니다. ABAP 객체 지향 프로그래밍(OOP)에서 형 변환은 Upcast와 Downcast로 나뉩니다.
제가 정리한 Upcast와 Downcast의 개념은 다음과 같습니다.
Upcast: 자식 클래스의 오브젝트를 부모 클래스의 참조 변수에 할당 {전제조건: 클래스와 클래스와의 관계(상속) 필수!!}
Downcast: 부모 클래스의 참조 변수에 자식 클래스의 참조 변수 할당
*Chat GPT는 Upcast와 Downcast의 개념을 이렇게 정리했습니다.
Upcast: 하위 클래스의 객체를 해당 상위 클래스의 객체로 취급하는 것을 포함합니다. 컴파일러에 의해 암묵적으로 수행되며 명시적인 캐스팅 구문이 필요하지 않습니다. 하위 클래스 개체는 본질적으로 슈퍼 클래스의 모든 특성을 가지고 있기 때문에 업캐스팅은 항상 안전합니다.
Downcast: 슈퍼클래스의 객체를 서브클래스의 객체로 취급하는 것을 포함합니다. 암묵적으로 수행되지 않으며 명시적인 캐스팅 구문이 필요하지만 모든 슈퍼클래스 개체가 서브클래스와 호환되지 않을 수 있으므로 잠재적으로 안전하지 않습니다. 다운캐스팅은 신중하게 이루어져야 하며, 일반적으로 안전을 보장하기 위해 형식 점검이나 예외 처리가 동반됩니다.
다운캐스팅에서 실제 개체가 서브클래스와 호환되지 않으면 런타임 오류가 발생합니다. 따라서 다운캐스팅 작업의 안전성을 확보하기 위해서는 CHECK, IF 또는 TRY...Catch 블록과 같은 적절한 체크를 사용하는 것이 중요합니다.
1. Upcast에 대한 개념을 설명하겠습니다.
1. 참조 변수 go_vehicle과 go_truck을 선언합니다. 여기서 go_vehicle과 go_truck은 상속 관계로 구현합니다. go_vehicle이 슈퍼 클래스, go_truck이 서브 클래스입니다.
(트럭은 탈 것의 종류 중 하나죠, 탈 것을 부모로 생각한다면, 탈 것의 종류 중 하나가 트럭이기 때문에 트럭이 자식이라고 생각하시면 됩니다.)
2. 'CREATE OBJECT go_truck' 구문을 통해 lcl_truck 객체를 생성합니다. lcl_truck은 위에서 봤듯이 서브 클래스 입니다.
3. go_truck은 lcl_truck 전체를 가리킵니다. lcl_truck은 get_cargo라는 속성을 가지고 있습니다.
4. go_vehicle = go_truck 구문을 작성하면 서브 클래스(go_truck)에 가리키는 내용을 슈퍼 클래스(go_vehicle)에 넣는 현상이 발생합니다.
5. 4번의 결과에 따라 lcl_truck 객체에서 남색 부분에 있는 객체들(get_make, get_count, display_attribute, set_attribute, estimate_fuel)은 lcl_vehicle 객체에서 상속받은 객체들입니다.
6. display_attribute, set_attribute, estimate_fuel 객체는 REDEFINED 키워드를 통해 선언되었습니다.
* REDEFINED 키워드는 메소드를 재정의할 때 사용합니다. 따라서 슈퍼 클래스에서도 해당 객체들을 가지고 있습니다.
7. 그러므로, go_truck의 전체를 다 엑세스 할 수 있습니다.
UPcast는 다용성이 편리하여 모듈화가 가능합니다. 이 때문에 Upcast를 많이 사용합니다.
2. Downcast에 대한 개념을 설명하겠습니다.
Downcast는 Upcast와 구현 방법이 비슷하지만 몇 가지 다른 점이 존재합니다.
먼저 go_truck과 동일한 속성을 갖는 go_truck2를 추가로 선언하고, Downcast 사용 시 '?=' 구문을 사용해야 합니다.
'?=' 구문을 사용하면 go_truck2는 lcl_truck의 객체 전체를 가리키는 형태로 재정의 됩니다.
2. Polymorphism
다형성(Polymorphism)은 하나의 메소드를 통해 여러 메소드를 실행시키는 상속의 개념 중 하나입니다.
* Chat GPT는 이렇게 정의했습니다.
ABAP 객체 지향 프로그래밍(OOP)의 다형성(Polymorphism)은 다른 클래스가 공통 슈퍼클래스의 인스턴스로 취급되는 능력을 말합니다. 이는 공통 인터페이스를 통해 다른 클래스의 객체에서 메서드를 호출할 수 있도록 하여 보다 유연하고 모듈식 코드를 가능하게 합니다.
ABAP에는 크게 두 가지 유형의 다형성이 있습니다.
컴파일 시간 다형성
정적 다형성 또는 메서드 오버로드라고도 합니다.
클래스의 여러 메서드의 이름은 동일하지만 매개 변수 목록이 다를 때 발생합니다.
적절한 실행 방법은 매개 변수의 수와 유형에 따라 컴파일 시 결정됩니다.
런타임 다형성
동적 다형성 또는 방법 우선이라고도 합니다.
하위 클래스가 슈퍼 클래스에 이미 정의된 메서드의 특정 구현을 제공할 때 발생합니다.
실행할 적절한 방법은 개체의 실제 유형에 따라 런타임에 결정됩니다.
lcl_truck과 lcl_bus 객체를 한번에 관리할 lcl_rental 객체를 정의하고 객체를 실행할 구문을 작성합니다.
CLASS LCL_RENTAL DEFINITION .
PUBLIC SECTION.
METHODS:
CONSTRUCTOR IMPORTING IV_NAME TYPE STRING,
ADD_VEHICLE IMPORTING IO_VEHICLE TYPE REF TO LCL_VEHICLE,
DISPLAY_ATTRIBUTES,
GET_MAX_SEATS RETURNING VALUE(RV_MAX_SEATS) TYPE S_PLAN_CAR.
PRIVATE SECTION.
DATA: MV_NAME TYPE STRING,
MT_VEHICLE TYPE TABLE OF REF TO LCL_VEHICLE.
ENDCLASS.
CLASS LCL_RENTAL IMPLEMENTATION.
METHOD CONSTRUCTOR.
MV_NAME = IV_NAME.
ENDMETHOD.
METHOD ADD_VEHICLE.
APPEND IO_VEHICLE TO MT_VEHICLE.
ENDMETHOD.
METHOD DISPLAY_ATTRIBUTES.
DATA: LO_VEHICLE TYPE REF TO LCL_VEHICLE.
WRITE:/ 'Rental Co. Name: ', MV_NAME.
ULINE.
ULINE.
LOOP AT MT_VEHICLE INTO LO_VEHICLE.
LO_VEHICLE->DISPLAY_ATTRIBUTES( ).
ENDLOOP.
ENDMETHOD.
METHOD GET_MAX_SEATS.
DATA: LO_VEHICLE TYPE REF TO LCL_VEHICLE,
LO_BUS TYPE REF TO LCL_BUS.
LOOP AT MT_VEHICLE INTO LO_VEHICLE.
TRY .
LO_BUS ?= LO_VEHICLE.
RV_MAX_SEATS = RV_MAX_SEATS + LO_BUS->GET_SEATS( ).
* CATCH CX_SY_MOVE_CAST_ERROR.
CATCH CX_ROOT.
ENDTRY.
* LO_BUS ?= LO_VEHICLE.
*
* RV_MAX_SEATS = RV_MAX_SEATS + LO_BUS->GET_SEATS( ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.
* CATCH cs_sy_move_cast_error 익셉션 코드가 와도 되지만 어려울 경우, cx_root가 와도 됩니다.
결과는 다음과 같습니다.