목차
1. VALUE Operator 이란?
VALUE 연산자는 구조체, 내부 테이블, 또는 워크 영역(work area)의 인스턴스를 생성하고 초기화하는 데 사용됩니다.
이 연산자는 특히 초기값을 가진 데이터 구조를 선언할 때 코드를 더 간결하고 읽기 쉽게 만들어 줍니다.
VALUE 연산자를 사용하면, 데이터 선언과 동시에 초기 값 할당을 한 줄의 코드로 간편하게 처리할 수 있습니다.
말이 좀 어려운데 예제를 통해 VALUE 연산자에 대해 알아보겠습니다.
2. VALUE Operator 사용 예제
예제1) 구조체의 인스턴스 생성 및 초기화
TYPES: BEGIN OF TY_PERSON,
NAME TYPE STRING,
AGE TYPE I,
END OF TY_PERSON.
DATA(LS_PERSON) = VALUE TY_PERSON( NAME = 'John Doe' AGE = 30 ).
[RESULT]
John Doe 30
이 예제에서는 TY_PERSON 구조체 타입을 정의하고, VALUE 연산자를 사용하여 LS_PERSON 변수에 구조체를 생성하면서 동시에 초기값을 할당합니다.
LS_PERSON이 Inline 선언되어 어떤 타입인지 모르기 때문에 VALUE 연산자 다음에는 LS_PERSON의 타입정보를 지정해줘야 합니다. (VALUE TY_PERSON <- 이부분)
만약 LS_PERSON이 DATA 선언되어 있는 구조체라면 타입을 생략할수 있습니다.
아래는 TYPE을 생략했을때 예제입니다.
DATA : BEGIN OF LS_PERSON,
NAME TYPE STRING,
AGE TYPE I,
END OF LS_PERSON.
LS_PERSON = VALUE #( NAME = 'John Doe' AGE = 30 ).
[RESULT]
John Doe 30
LS_PERSON은 이미 선언된 구조체이기 때문에 VALUE 연산자 뒤에 타입을 #으로 생략할 수 있습니다.
예제2) Internal Table의 인스턴스 생성 및 초기화
TYPES: BEGIN OF TY_PERSON,
NAME TYPE STRING,
AGE TYPE I,
END OF TY_PERSON.
TYPES: TT_PERSONS TYPE STANDARD TABLE OF TY_PERSON WITH KEY NAME.
DATA(LT_PERSONS) = VALUE TT_PERSONS( ( NAME = 'John Doe' AGE = 30 )
( NAME = 'Jane Doe' AGE = 28 ) ).
[RESULT]
John Doe 30
Jane Doe 28
여기서는 TT_PERSONS라는 내부 테이블 타입을 정의하고, VALUE 연산자를 사용하여 두 개의 행을 가진 테이블을 초기화합니다.
구조체에 값을 넣을때와 차이점은 괄호()를 하나씩 더 감싼다고 생각하면 이해가 쉽습니다.
만약 특정필드에는 공통값을 입력해야 한다면 괄호 밖으로 빼면 됩니다. 아래에 예시를 설명드리겠습니다.
TYPES: BEGIN OF TY_PERSON,
JOB TYPE STRING,
NAME TYPE STRING,
AGE TYPE I,
END OF TY_PERSON.
DATA : LT_PERSONS TYPE STANDARD TABLE OF TY_PERSON.
LT_PERSONS = VALUE #( JOB = 'Developer' ( NAME = 'John Doe' AGE = 30 )
( NAME = 'Jane Doe' AGE = 28 ) ).
[RESULT]
Developer John Doe 30
Developer Jane Doe 28
먼저 LT_PERSONS를 선언했기 때문에 VALUE 연산자 다음에는 #을 써서 타입정보를 생략했습니다.
JOB필드는 모든 라인에 공통으로 입력하기 위해서 내부괄호 바깥쪽에 한번만 입력하였습니다.
이처럼 VALUE 연산자는 구조체나 내부테이블에 값을 입력하기 위해 사용되며 특이점은 (Name = 'John Doe')처럼 필드를 지정해서 값을 입력합니다.
예제3) Table Expression과 혼합
DATA(LS_ITAB) = LT_SCARR[ 1 ].
지난번 학습했던 Table Expression 예제를 다시한번 보겠습니다.
위의 결과는 LT_SCARR 테이블의 첫번째 Row값이 LS_ITAB에 적용되게 됩니다. 문제가 없어 보입니다.
하지만 LT_SCARR의 INDEX 1에 값이 없다면 Dump에러가 발생합니다.
이를 방지하기 위해 VALUE 연산자의 OPTIONAL 기능을 사용합니다.
DATA(LS_ITAB) = VALUE #( LT_SCARR[ 1 ] OPTIONAL ).
위 예제에는 VALUE 연산자와 함께 OPTIONAL기능을 함께 사용하였습니다.
OPTIONAL 기능을 사용하게 되면 값을 못찾더라도 Dump에러가 발생하지 않습니다.
그런데 위 예제를 보면 이상한점이 두가지 있습니다.
첫번째는 LS_ITAB이 Inline으로 선언되었는데 VALUE #으로 타입이 생략되었습니다.
두번째는 VALUE 연산자는 필드를 지정해서 값을 대입한다고 했었는데 필드를 지정하지 않아도 값이 입력됩니다.
첫번째부터 설명을 드리면 소스쪽(LT_SCARR)의 DATA 전체를 대입하는경우 타겟 변수를 lnline으로 선언 가능합니다.
이때 VALUE #을 사용하여 타입도 생략 가능합니다. (LT_SCARR형식으로 LS_ITAB이 선언됨과 동시에 초기화 됨)
두번째는 소스의 변수와 타겟의 변수가 완벽히 동일한 타입이면 필드를 생략하고 전체값을 대입할 수 있습니다.
위와같이 타겟변수가 Inline이면 자동으로 소스의 타입으로 선언이 되기때문에 동일한 타입이라고 생각하시면 됩니다.
DATA : LT_SCARR LIKE TABLE OF SCARR,
LS_ITAB LIKE SCARR.
LS_ITAB = VALUE #( LT_SCARR[ 1 ] OPTIONAL ).
타겟변수 LS_ITAB과 소스변수 LT_SCARR이 동일한 타입이기 때문에 필드지정없이 전체 DATA를 대입이 가능합니다.
[ERROR]
DATA : LT_SCARR LIKE TABLE OF SCARR,
LS_ITAB LIKE SFHIGHT.
LS_ITAB = VALUE #( LT_SCARR[ 1 ] OPTIONAL ).
위 예제처럼 소스변수와 타겟변수가 서로 타입이 틀리면 에러가 발생합니다.
이때는 필드를 지정해서 값을 대입시켜야 합니다.
3. VALUE Operator의 장점
코드 간결성: 데이터 구조의 선언과 초기화를 한 줄로 처리할 수 있어 코드가 간결해집니다.
가독성 향상: 초기값이 명시적으로 표현되므로 코드의 의도를 쉽게 파악할 수 있습니다.
유연성: 동적 테이블 생성, 조건부 요소 추가 등 복잡한 데이터 구조를 다룰 때 유용합니다.