목차
1. 구조체(Structure) 란?
이번 장에서는 구조체와 내부테이블에 대해 좀더 자세히 알아보겠습니다.
구조체(structure)는 서로 다른 타입의 데이터를 묶어 하나의 복합 타입으로 정의할 수 있는 방법입니다. 즉, 여러 변수들을 그룹화 했다고 생각하시면 쉽습니다. 이는 프로그램의 가독성과 유지보수성을 크게 향상시킵니다.
구조체는 ABAP Dictionary에서 글로벌 구조체로 정의되거나, ABAP 프로그램 내에서 로컬 구조체로 정의될 수 있습니다. 글로벌 구조체는 시스템 전반에서 재사용이 가능한 반면, 로컬 구조체는 해당 프로그램 내에서만 사용됩니다.
2. 구조체(Structure) 예제
예제1) 구조체에 값 입력
TYPES: BEGIN OF TY_EMPLOYEE,
NAME TYPE STRING,
ID TYPE I,
JOINING_DATE TYPE D,
END OF TY_EMPLOYEE.
DATA LS_EMPLOYEE TYPE TY_EMPLOYEE.
LS_EMPLOYEE-NAME = 'John Doe'.
LS_EMPLOYEE-ID = 1001.
LS_EMPLOYEE-JOINING_DATE = '20200301'.
구조체는 BEGIN OF와 END OF 키워드를 사용하여 정의됩니다. 구조체 내의 각 필드는 특정 데이터 타입을 가지며, 구조체는 이러한 필드들의 모음입니다.
이 예제에서 TY_EMPLOYEE라는 이름의 구조체 타입을 정의하고 있습니다. 이 구조체는 NAME, ID, JOINING_DATE라는 세 개의 필드로 구성되어 있으며, 각 필드는 각각 문자열, 정수, 날짜 타입의 데이터를 저장할 수 있습니다.
LS_EMPLOYEE라는 변수를 이 구조체 타입으로 선언하여 사용합니다.
구조체로의 접근은 '구조체이름-필드이름'으로 값을 할당하거나 접근할 수 있습니다.
CLEAR : LS_EMPLOYEE.
구조체의 값을 CLEAR하기 위해서 필드별로 각각 CLEAR할 필요없이 구조체 이름으로 CLEAR하게되면 모든 필드가 CLEAR됩니다.
CLEAR : LS_EMPLOYEE-NAME, LS_EMPLOYEE-ID.
물론 특정 필드만 CLEAR시킬수도 있습니다.
3. 내부 테이블(Internal Table) 이란?
내부 테이블(Internal Table)은 메모리 내에 임시적으로 데이터를 저장하는 동적 테이블 구조입니다. 데이터베이스 테이블의 정보를 읽어와 일괄 처리하거나, 프로그램 실행 중에 생성되는 데이터를 저장하고 관리하는 데 사용됩니다. 내부 테이블은 하나 이상의 행으로 구성되며, 각 행은 동일한 구조의 필드들을 가집니다.
내부 테이블은 데이터를 순차적으로 처리하거나, 복잡한 데이터 집합을 관리할 필요가 있는 다양한 시나리오에서 유용하게 사용됩니다. 예를 들어, 사용자로부터 입력받은 여러 데이터 항목을 저장하거나, 데이터베이스로부터 읽어온 결과를 일시적으로 저장할 때 내부 테이블을 활용할 수 있습니다.
구조체는 한 Line의 정보를 저장할 수 있다면 내부 테이블은 여러 Line의 정보를 저장할 수 있습니다.
4. 내부 테이블(Internal Table) 예제
예제1) APPEND
TYPES: BEGIN OF TY_EMPLOYEE,
NAME TYPE STRING,
ID TYPE I,
JOINING_DATE TYPE D,
END OF TY_EMPLOYEE.
DATA LT_EMPLOYEE TYPE TABLE OF TY_EMPLOYEE.
구조체는 TYPE으로 선언하는 반면에 내부 테이블은 TYPE TABLE OF로 선언합니다.
내부 테이블(Internal Table)은 메모리 내에 임시적으로 데이터를 저장하는 동적 테이블 구조입니다. 데이터베이스 테이블의 정보를 읽어와 일괄 처리하거나, 프로그램 실행 중에 생성되는 데이터를 저장하고 관리하는 데 사용됩니다. 내부 테이블은 하나 이상의 행으로 구성되며, 각 행은 동일한 구조의 필드들을 가집니다.
내부 테이블에 값을 입력하고 삭제하는 방법을 알아보겠습니다.
TYPES: BEGIN OF TY_EMPLOYEE,
NAME TYPE STRING,
ID TYPE I,
JOINING_DATE TYPE D,
END OF TY_EMPLOYEE.
DATA : LS_EMPLOYEE TYPE TY_EMPLOYEE,
LT_EMPLOYEE TYPE TABLE OF TY_EMPLOYEE.
LS_EMPLOYEE-NAME = 'John Doe'.
LS_EMPLOYEE-ID = 1001.
LS_EMPLOYEE-JOINING_DATE = '20200301'.
APPEND LS_EMPLOYEE TO LT_EMPLOYEE.
내부 테이블에 값을 추가하기 위해서 내부테이블에 값을 직접 접근할 수 없습니다. 내부 테이블과 타입이 동일한 구조체에 값을 입력하고 구조체를 사용하여 내부 테이블에 값을 추가한다고 생각하시면 됩니다.
위 예제를 보면 내부 테이블과 구조체의 타입이 동일합니다. 값은 구조체에 적용을 하고 마지막에 APPEND 구문을 사용하여 내부 테이블에 적용합니다.
APPEND 구문을 사용하면 내부 테이블 가장 마지막에 ROW값이 하나 추가됩니다.
예제2) INSERT
LS_EMPLOYEE-NAME = 'John Doe'.
LS_EMPLOYEE-ID = 1001.
LS_EMPLOYEE-JOINING_DATE = '20200301'.
INSERT LS_EMPLOYEE INTO LT_EMPLOYEE INDEX 1.
내부 테이블의 특정 위치에 ROW를 추가하고 싶다면 위 예제와 같이 INSERT 구문을 사용하면 됩니다.
예제3) DELETE
DELETE LT_EMPLOYEE INDEX 1.
내부 테이블의 값을 삭제하기 위해서 DELETE 구문을 사용하면 됩니다. 이때 INDEX 다음에 삭제하고자 하는 위치를 지정해 줘야 합니다.
CLEAR : LT_EMPLOYEE.
내부 테이블의 모든 값을 삭제하고자 할때는 위와같이 내부테이블을 CLEAR해주면 됩니다.
예제4) MODIFY
LS_EMPLOYEE-NAME = 'Jane Doe'.
MODIFY LT_EMPLOYEE FROM LS_EMPLOYEE INDEX 1.
내부 테이블의 값을 수정하기 위해서는 MODIFY 구문을 사용하면 됩니다.
위 예제는 INDEX값으로 구조체의 모든 정보를 내부 테이블에 MODIFY 하는 예제입니다. 그럼 NAME이라는 필드만 MODIFY 하고 싶을때는 어떻게 해야 할까요?
LS_EMPLOYEE-NAME = 'Jane Doe'.
MODIFY LT_EMPLOYEE FROM LS_EMPLOYEE INDEX 1 TRANSPORTING NAME.
TRANSPORTING + 필드명 을 사용하여 특정 필드만 MODIFY 할수 있습니다.
INDEX를 사용하게 되면 하나의 위치에 대해서만 MODIFY가 가능한데 특정조건의 모든 ROW에 MODIFY 하는고 싶을때는 어떻게 해야 할까요? 아래 예제를 보시면 됩니다.
LS_EMPLOYEE-NAME = 'Jane Doe'.
MODIFY LT_EMPLOYEE FROM LS_EMPLOYEE TRANSPORTING NAME WHERE JOINING_DATE = '20200301'.
MODIFY에 WHERE절을 사용하면 됩니다. 위 예제는 JOINING_DATA필드가 '20200301'인 모든 ROW의 NAME이 'Jane Doe'로 MODIFY 됩니다.
특이사항은 MODIFY에 WHERE을 사용하려면 TRANSPORTING으로 MODIFY할 필드를 꼭 지정해줘야 합니다.
예제5) COLLECT
COLLECT는 내부 테이블에서 동일한 키 값을 가진 행이 있는지 검사합니다.
동일한 키를 가진 행이 이미 존재하면, COLLECT는 숫자형 필드의 값을 자동으로 합산합니다. 이는 특히 금액이나 수량 같은 숫자 데이터를 집계할 때 유용합니다. 예를 들어보겠습니다.
TYPES: BEGIN OF TY_EMPLOYEE,
NAME TYPE STRING,
ID TYPE I,
JOINING_DATE TYPE D,
END OF TY_EMPLOYEE.
DATA : LS_EMPLOYEE TYPE TY_EMPLOYEE,
LT_EMPLOYEE TYPE TABLE OF TY_EMPLOYEE.
LS_EMPLOYEE-NAME = 'John Doe'.
LS_EMPLOYEE-ID = 1001.
LS_EMPLOYEE-JOINING_DATE = '20200301'.
APPEND LS_EMPLOYEE TO LT_EMPLOYEE.
위와같이 하나의 ROW값을 내부테이블 LT_EMPLOYEE에 APPEND 했습니다.
LS_EMPLOYEE-NAME = 'John Doe'.
LS_EMPLOYEE-ID = 2000.
LS_EMPLOYEE-JOINING_DATE = '20200301'.
COLLECT LS_EMPLOYEE INTO LT_EMPLOYEE.
[RESULT]
John Doe 3001 2020-03-01
다른 필드는 동일한데 ID필드만 2000으로 바꾸고 COLLECT문을 사용했습니다.
동일한 KEY값의 ROW가 이미 존재하기 때문에 숫자형 필드의 값을 자동으로 합산합니다.
LS_EMPLOYEE-NAME = 'Jane Doe'.
LS_EMPLOYEE-ID = 2000.
LS_EMPLOYEE-JOINING_DATE = '20200301'.
COLLECT LS_EMPLOYEE INTO LT_EMPLOYEE.
[RESULT]
John Doe 3001 2020-03-01
Jane Doe 2000 2020-03-01
위 예제처럼 COLLECT문은 한번 더 써보겠습니다. 이번에는 NAME이 틀립니다.
결과를 확인하면 동일한 KEY값의 정보가 내부 테이블에 없기 때문에 마지막에 ROW가 추가된 걸 볼수 있습니다.
이처럼 COLLECT문은 중복 데이터를 처리하면서 데이터를 집계해야 하는 경우 사용하면 편리합니다.