*&---------------------------------------------------------------------*
*& Report ZOOP_TUTORIAL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zoop_tutorial.
* OOP tutorial
* 관계도:
* ZIF_OOP_VEHICLE interface 탈것
* - ZCL_OOP_HORSE class 말
* - ZCL_OOP_BUS abstract class 버스
* - ZCL_OOP_CITY_BUS class 시내버스
* - ZCL_OOP_EXPRESS_BUS class 고속버스
* - ZCL_OOP_EXPRESS_BUS_X2 class 2배 고속버스
* - ZCL_OOP_CAR abstract class 승용차
* - ZCL_OOP_CAR_K5 class 승용차 K5
* - ZCL_OOP_CAR_K7 class 승용차 K7
* interface & class
DATA: lo_vehicle TYPE REF TO zif_oop_vehicle,
lv_name TYPE string,
lv_speed TYPE i.
* interface는 타입으로 사용할 수 있지만 class로 구현을 해야 객체를 생성할 수 있음.
* "LO_VEHICLE" is not an object reference.
* CREATE OBJECT lo_vehicle.
* zcl_oop_horse 는 zif_oop_vehicle 인터페이스를 구현한 클래스 입니다.
* horse 객체를 생성할 수 있음.
CREATE OBJECT lo_vehicle TYPE zcl_oop_horse.
lo_vehicle->set_name( 'my horse' ).
lv_name = lo_vehicle->get_name( ).
lo_vehicle->drive(
EXPORTING
iv_direction = 'F'
IMPORTING
ev_speed = lv_speed
).
WRITE:/ lv_name, lv_speed.
* abstract class(추상 클래스)
* zcl_oop_bus 는 zif_oop_vehicle 인터페이스를 구현한 추상 클래스 입니다.
* 추상 클래스는 구현을 가지고 있지만 생성 할 수 없음.
* Instances of the abstract class "ZCL_OOP_BUS" cannot be generated.
*CREATE OBJECT lo_vehicle TYPE zcl_oop_bus.
* inheritance(상속)
* zcl_oop_city_bus 는 zcl_oop_bus 를 상속한 일반 (추상 아님) 클래스 입니다.
* city bus 객체를 생성할 수 있음.
CREATE OBJECT lo_vehicle TYPE zcl_oop_city_bus.
lo_vehicle->set_name( 'my city bus' ).
lv_name = lo_vehicle->get_name( ).
lo_vehicle->drive(
EXPORTING
iv_direction = 'F'
IMPORTING
ev_speed = lv_speed
).
WRITE:/ lv_name, lv_speed.
* redifine method(메소드 재정의) = Method overriding
* zcl_oop_express_bus_x2 는 zcl_oop_express_bus 를 상속한 클래스 입니다.
* 상속 받은 다음 메소드에 로직을 추가 할 수 있습니다.
* zcl_oop_express_bus_x2 의 drive 메소드를 확인하세요.
CREATE OBJECT lo_vehicle TYPE zcl_oop_express_bus.
lo_vehicle->set_name( 'ex-bus' ).
lv_name = lo_vehicle->get_name( ).
lo_vehicle->drive(
EXPORTING
iv_direction = 'F'
IMPORTING
ev_speed = lv_speed
).
WRITE:/ lv_name, lv_speed.
CREATE OBJECT lo_vehicle TYPE zcl_oop_express_bus_x2.
lo_vehicle->set_name( 'ex2-bus' ).
lv_name = lo_vehicle->get_name( ).
lo_vehicle->drive(
EXPORTING
iv_direction = 'F'
IMPORTING
ev_speed = lv_speed
).
WRITE:/ lv_name, lv_speed.
* Polymorphism(다형성)
* TYPE 으로 선언한 변수의 하위의 상속받은 모든 클래스를 생성 할 수 있음.
CREATE OBJECT lo_vehicle TYPE zcl_oop_horse.
*CREATE OBJECT lo_vehicle TYPE zcl_oop_bus. " 추상 클래스는 생성 불가
CREATE OBJECT lo_vehicle TYPE zcl_oop_city_bus.
CREATE OBJECT lo_vehicle TYPE zcl_oop_express_bus.
CREATE OBJECT lo_vehicle TYPE zcl_oop_express_bus_x2.
*CREATE OBJECT lo_vehicle TYPE zcl_oop_car. " 추상 클래스는 생성 불가
CREATE OBJECT lo_vehicle TYPE zcl_oop_car_k5.
CREATE OBJECT lo_vehicle TYPE zcl_oop_car_k7.
DATA: lo_bus TYPE REF TO zcl_oop_bus.
*CREATE OBJECT lo_bus TYPE zcl_oop_horse. " 타입 일치 하지 않음.
*CREATE OBJECT lo_bus TYPE zcl_oop_bus. " 추상 클래스는 생성 불가
CREATE OBJECT lo_bus TYPE zcl_oop_city_bus.
CREATE OBJECT lo_bus TYPE zcl_oop_express_bus.
CREATE OBJECT lo_bus TYPE zcl_oop_express_bus_x2.
*CREATE OBJECT lo_bus TYPE zcl_oop_car. " 타입 일치 하지 않음.
*CREATE OBJECT lo_bus TYPE zcl_oop_car_k5. " 타입 일치 하지 않음.
*CREATE OBJECT lo_bus TYPE zcl_oop_car_k7. " 타입 일치 하지 않음.
DATA: lo_car TYPE REF TO zcl_oop_car.
*CREATE OBJECT lo_car TYPE zcl_oop_horse. " 타입 일치 하지 않음.
*CREATE OBJECT lo_car TYPE zcl_oop_bus. " 타입 일치 하지 않음.
*CREATE OBJECT lo_car TYPE zcl_oop_city_bus. " 타입 일치 하지 않음.
*CREATE OBJECT lo_car TYPE zcl_oop_express_bus. " 타입 일치 하지 않음.
*CREATE OBJECT lo_car TYPE zcl_oop_express_bus_x2. " 타입 일치 하지 않음.
*CREATE OBJECT lo_car TYPE zcl_oop_car. " 추상 클래스는 생성 불가
CREATE OBJECT lo_car TYPE zcl_oop_car_k5.
CREATE OBJECT lo_car TYPE zcl_oop_car_k7.
SAP에서는 자체적으로 CTS 라고 버전관리 및 소스배포가 가능한 시스템이 기본 포함되어 있습니다. 그런데 왜 아밥깃을 사용해야 할까요? 그 이유는 여러 사이트에 흩어져 있는 개발자간의 협업과 인터넷을 통한 소스배포가 가능하기 때문 입니다. CTS는 여러 사이트에서 협업하는것이 불가능 합니다.
abapGit의 등장으로 공개 프로그램 배포용도로 saplink를 대체하는 움직임이 나타납니다. 대표적으로 엑셀 업로드/다운로드 프로그램 abap2xlsx가 있습니다. 배포를 위해 홈페이지를 만들고 saplink nugg 파일을 업로드하는 일 대신, abapGit으로 SAP서버에서 바로 GitHub에 업로드하여 배포하게 된 것이죠.
배포된 것을 다운로드 받는 일반 사용자는 GitHub에 가입할 필요가 없습니다. GitHub는 소스코드 개발에 기여하고자 하는 개발자에게 필요한 것입니다. GitHub의 기능이 궁금하다면 제가 만든 체험용 계정 guru@programmer.korea.com / guruguru9 으로 테스트 해보세요.
abapGit은 일반사용자용으로 단독실행(standalone) 버전을 제공하고 개발자용 버전이 따로 있습니다.
DATA: lo_wdr_comp TYPE REF TO cl_wdr_component,
lo_wdr_client_comp TYPE REF TO cl_wdr_client_component,
lv_parent_comp_name TYPE string.
lo_wdr_comp ?= wd_this->wd_get_api( ).
lo_wdr_client_comp ?= lo_wdr_comp->data_container_superior.
lv_parent_comp_name = lo_wdr_client_comp->parent->component_name.