ABAP에서 Grid ALV를 제작하다보면 가장 먼저 CL_GUI_CUSTOM_CONTAINER 와 CL_GUI_ALV_GRID라는 Class와 마주하게 된다
해당 Class들의 정확한 역할은 무엇이고 Class에 포함되어있다는 Method와 Event는 어떻게 다른걸까?
Class
객체를 만들기 위한 설계도
더 정확히 말하자면 어떤 것에 관련한 데이터와 기능을 하나로 묶어둔 단위
해당 단위를 통해서 같은 모양의 객체를 만들 수 있다
이 Class 안에 위에서 설명한 것 처럼 Method, Event가 포함되어있고 그 외에도 관련한 데이터를 위한 Attribute 등의 기능을 가진다
이런 Class의 내부 요소들을 Class의 Component라고 부른다
UI5 할 때 사용했던 Component와는 의미를 달리한다
이 때의 Component는 재사용 가능한 단위, 쉽게 보기 위해 묶어놓은 단위,,, 정도로 생각하면 될 것 같다
Attribute
Class 안에서 사용하는 Data Field

📌 Instance Attribute
ABAP Program에서 변수 생성하는 것과 동일하게 DATA 키워드를 사용하여 Instance Attribute를 선언한다
이렇게 선언된 Attribute는 Instance 별로 독립적인 데이터 영역을 가지고, 생성된 Instance가 자신만의 Attribute 값을 관리한다
예를 들어 Class를 이용해 A라는 Instance를 생성하면 A만을 위한 Attribute 데이터 영역이 생성된다
그 뒤에 B라는 Instance를 생성하면 같은 이름의 Attribute지만 B만을 위한 별도의 데이터 영역이 생성된다
📌 Static Attribute
이와 반대되는 개념이 Static Attribute이다
CLASS-DATA 키워드를 사용하면 Static Attribute를 선언할 수 있는데 이는 클래스 자체에 귀속되는 데이터 영역을 가지며 생성된 모든 Instance가 공유한다
Instance Attribute와 다르게 클래스가 메모리에 로드되는 시점에 생성되며, Instance 생성 여부와는 무관하게 존재한다
Method
Class 또는 Instance가 수행할 수 있는 동작의 정의
Method 또한 Attribute와 마찬가지로 Static과 Instance로 구분이 된다
📌 Instance Method
METHODS 키워드를 사용하여 선언하는 Method로 생성된 Instance에 귀속된다
따라서 생성한 Instance의 Attribute를 기준으로 동작한다
Method를 호출할 때 -> 화살표를 사용한다
📌 Static Method
CLASS-METHODS 키워드를 사용하여 선언하며 Instance 생성 없이 클래스 이름으로 바로 호출 가능한 Method이다
Static Method는 어떤 Instance를 기준으로 실행되는지가 정해져 있지 않기 때문에 Instance Attribute에는 접근할 수 없다
Method를 호출할 때 => 화살표를 사용한다
❓ Static Method를 이용하는 이유
그렇다면 모든 Instance에 접근 가능한 Instance Method만 이용해도 되는거 아닐까?
Static Method는 객체 상태에 의존하지 않는 로직을 명확히 분리하기 위해 존재한다
예를 들어 오늘 날짜를 받아오는 Method를 생성한다고 가정하자
해당 Method는 객체 상태와 무관한 로직인데 객체가 필요한가?
이런 의도 표현을 하기 위해서 Static Method를 만드는 이유가 크다
또, Instance를 만들면 메모리를 사용하고, 생명주기나 참조 변수 또한 관리해야 한다
Instance가 굳이 필요하지 않은 경우에는 Static Method를 사용하면 메모리 낭비나 관리에 대한 고민을 하지 않아도 되는 장점이 있다
다만 Static Method를 남용 시 객체 지향의 유연성과 확장성, 당연히 해칠 수 있으므로 필요한 경우에 적절히 사용하도록 하자
Event
EVENTS 키워드를 사용해 선언한다
Method와 다르게 실행 로직을 가지지 않고 직접 호출도 할 수 없다
대신 특정한 상황이 일어나면 자동으로 발생한다
📌 Event Handler Method
Event는 실행 로직을 가지지 않기 때문에 이벤트를 처리하기 위한 Method가 구현되어 있어야 하고 이를 Event Handler Method라고 한다
해당 Method는 이벤트 발생시에 자동으로 호출된다
ALV에서 자주 사용되는 double_click 같은 이벤트들은 SAP 표준 클래스에 미리 정의되어 있고 이에 따른 Event Handler Method를 구현하면 이벤트 사용이 가능하다
이벤트는 특정한 Instance에서 발생하기 때문에 해당 이벤트를 처리하는 Method도 반드시 해당 Instance의 Instance Method로 개발되어야 한다는 특징이 있다
🔍 자주 사용하는 Class
CL_GUI_CUSTOM_CONTAINER
기본적인 개념은 확인했으니 자주 사용되는 Class부터 알고 넘어가자
CL_GUI_CUSTOM_CONTINER Class는 Screen상에 존재하는 Custom Control 영역과 ABAP의 GUI Control 객체를 연결해주는 역할을 한다
데이터를 보여주거나 하지는 않고 화면에 그릴공간 확보와 이 공간을 객체와 연결하는 역할만 수행한다
따라서 Screen Painter에서 만든 Custom Control의 이름을 container_name에 Parameter로 전달한다
DATA go_container TYPE REF TO cl_gui_custom_container.
CREATE OBJECT go_container
EXPORTING
container_name = 'CCON'.
CL_GUI_ALV_GRID
실제 Grid ALV의 데이터 표시, 편집, 선택, 이벤트 발생 등 Grid ALV에서 사용하는 대부분의 Method와 Event가 정의되어 있는 Class다
i_parent Parameter에 ALV가 올라갈 부모 컨테이너를 전달하면 해당 grid ALV 영역을 컨트롤 할 수 있다
(대부분의 경우 CL_GUI_CUSTOM_CONTAINER에서 생성한 객체를 전달한다)
DATA go_grid TYPE REF TO cl_gui_alv_grid.
CREATE OBJECT go_alv_grid
EXPORTING
i_parent = go_container.
CL_GUI_SPLITTER_CONTAINER
하나의 컨테이너 영역을 여러개로 나눠서 사용할 때 필요한 Class다
parent Parameter에 상위 컨테이너를 전달하고 해당 컨테이너를 나눌 구조를 각각 rows와 colums에 작성한다
분할된 영역은 Instance Method인 get_container( )로 해당하는 영역의 하위 컨테이너를 받아와서 그 위에 CL_GUI_ALV_GRID를 생성한다
DATA go_split TYPE REF TO cl_gui_splitter_container.
CREATE OBJECT go_split
EXPORTING
parent = go_container
rows = 1
columns = 2.
DATA: go_cont_left TYPE REF TO cl_gui_container,
go_cont_right TYPE REF TO cl_gui_container.
DATA: go_grid_left TYPE REF TO cl_gui_alv_grid,
go_grid_right TYPE REF TO cl_gui_alv_grid.
go_split->get_container(
EXPORTING
row = 1
column = 1
RECEIVING
container = go_cont_left
).
go_split->get_container(
EXPORTING
row = 1
column = 2
RECEIVING
container = go_cont_right
).
CREATE OBJECT go_grid_left
EXPORTING
i_parent = go_cont_left.
CREATE OBJECT go_grid_right
EXPORTING
i_parent = go_cont_right.
🔍 Grid ALV 셀 단위 수정
Field Catalog에서 edit option을 켜주면 셀 편집이 허용된다

gs_fieldcat-edit = abap_on.
CL_GUI_ALV_GRID Methods
📌 register_edit_event
data_changed 이벤트를 활용하면 셀이 편집된 상황을 확인할 수 있는데 data_changed는 항상 발생하는 사용자 액션 이벤트인 click, double_click과는 다르게 조건부로 발생하는 편집 이벤트이다
이 경우 언제 해당 편집이 종료되는지를 미리 설정해야 이벤트가 발생하는데 이 때 사용되는 Method가 register_edit_event이다
go_alv_grid->register_edit_event(
i_event_id = cl_gui_alv_grid=>mc_evt_modified
).
i_event_id Parameter에는 해당 이벤트가 끝나는 시점을 작성한다
대부분의 경우 값이 변경되는 즉시 이벤트를 발생시키는 mc_evt_modified를 사용하나 Enter 키 입력 시 발생하는 mc_evt_enter 등 여러 constant 값이 존재한다
'ABAP Study' 카테고리의 다른 글
| [ABAP] ALV Layout 색상변경 (0) | 2026.01.06 |
|---|---|
| [ABAP] Field Catalog (0) | 2026.01.05 |