[율밥퍼] SAP ABAP - FIELD-SYMBOLS 필드심볼 기초편
오늘은 FIELD-SYNBOLS에 대해 써보려고 한다
이게 알고나면 쉬운데 나중에 또 쓸라고하면 어떻게 썼더라..하고 생각이 안난다
그러니 일기로 남겨야징...
첫번째로.. 아밥 필드심볼의 특징을.. 알려주겠슴..
- 필드심볼은 프로그램 내에서 동적인 접근이 가능함.
- 자기만의 메모리 공간을 가지고 있지 않음요.
- 모든 데이터 오브젝트에 지정이 가능함 키키
STEP1. ABAP 필드심볼 이해하기.
사실 나는 예전에 다른 언어를 독학으로 공부한 적이 있다.
그때 무슨 참조? ㅠ의 개념을 잠깐 배웠다
주소값을 참조한다고 했던가.. 필드심볼이 딱 그거였다. 얜 아주 편리한 친구다.
이제 예를 남겨보겠다.
DATA : LV_CHAR TYPE CHAR 10.
FIELD-SYMBOLS : <VALUE> TYPE ANY.
* 필드심볼은 저렇게 변수명에 <>가 들어가는데 유의할점이 있다...
* 대충 네이밍 하지마라 (내껀 예시라 대충) TYPE도 ANY대신 지정해줄 수 있으면 지정해줘라..
* 예를들어 ALV만 받을 전용의 필드심볼이라면 <ALV>라고 해주면 좋겠지?
* 네이밍 중요하다.. 이상하면 혼난당..
* 네이밍을 보고 뭐로 사용될 필드심볼인지 대강 유추가 가능해야한다.
* (잔소리잔소리..궁시렁 궁시렁.. 내가 많이 혼나서 그래)
아밥 필드심볼을 이용하려면 일단 ASSIGN이 필수다.
ASSIGN이란 음.. 쉽게말하면 통로를 연결해준다고 하면 이해가 쉬울까?
펫트 물병이 내 앞에 두 개 있다고 생각해봐라
그 펫트 물병 밑부분에 구멍을 뚫어 통로를 만들고 두개의 펫트병을 연결했다 치자?
한 병에 물을 넣으면 옆에 병도 물이 자동으로 차겠지..(양이 다를거라는건 무시하자)
뭐 요런 느낌이당
자 위에 선언해놓은걸로 예시 한번 들어본당.
LV_CHAR = '안녕^-^'.
내가 저 비어있는 변수에 값을 할당해줬다.
이제 필드심볼에 저걸 연결할거다
ASSIGN LV_CHAR TO <VALUE>.
자~ 이 상태에서
LV_CHAR와 <VALUE>에는 무슨 값이 들어있을까?
둘다 '안녕^-^'이다.
LV_CHAR가 곧 <VALUE>고
<VALUE>가 곧 LV_CHAR다..(뭔가 띵언 같다)
ASSIGN이 그렇게 만들어줬다..
그럼
<VALUE> = '하이하이'.
<VALUE> = '니하오니하오'.
내가 이렇게 입력했다.
여기서 LV_CHAR는 무슨 값이 들어있을까?
나는 바보가 아니니 '니하오니하오가'들어있는 걸 알고있지..
그러면~
LV_CHAR = '안녕하십니까'.
WRITE <VALUE>.
이렇게 하면 뭐가 출력될까?
지금까지 써놓은거 이해를 했으면 바로 안다.
안녕하십니까 라고 출력되겠지.
이 정도면 충분히 이해하고도 남았을거라고 본다ㅋ..
필드심볼을 재활용할 예정이라면.. 혹은 더 이상 쓰지 않을 예정이라면..
그리고 글로벌로 선언해 뒀다면?
다 쓰고 나서
UNASSIGN <VALUE>.
로 ASSIGN해제해줘라.. 통로 없애버렷..
이러면 저건 다른데서 또 쓸 수있다.
사실 저거 안쓰고 다른거에 ASSIGN하게되면 그대로 주소값이 변한다.
나는 사실 엄청난 귀차니스트다..
그래서 PERFOEM안에 로컬로 선언하여 그 PERFORM안에서만
사용하고 버리는게 편하다.
사실 개인적으로(?) 그게 더 낫다고 본다..
만약에 글로벌로 사용하여 여러 곳에서 계속 사용한다면?
꼬였을때.. 찾기 힘들다.. 진짜다 ㅠㅠ..
필드심볼 이해를 하고 사용한다면 아주 편리하다.
근데 보통 개발자들이 ABAP 필드심볼을 많이
쓰지말라고 한다.
왜냐하면 다른 사람이 봤을 때 이해하기 힘들다고 해서 그렇당..
누군가 나에게 그랬다.. "필드심볼도 이해못하면.. 그런 코딩 그만둬야지.."
나는 십분 이해한ㄷㅏ.

그래서 나는 생각을 했지..
필드심볼을 사용하되,,,,,네이밍은 알아보기 쉽도록
꼭 필요한 경우가 아니면 글로벌이 아니라 로컬로..
글로벌로 선언하면 이 개발자가 어디어디에 썼는 지 어디에 연결했는지 찾으러 다녀야한다.
근데 이건 다른 사람까지 갈 것도 없다.
짜놓은지 오래된 코드를 오랜만에 열어보면 나조차도 기억이 안난다.
혹시 이 글을 보게될 다른 사람이 있다면.. 좀 알아줬음 좋겟당.
(잔소리가 많다.. 하지만 똑같은 이유로 많이 혼나봤기에ㅠㅠ 나도 주절주절)
STEP2. ABAP 필드심볼 활용하기
필드심볼..굉장히 편리하지..
ASSIGN에 여러 문법이 있는거 아는가?
방금까지 기본 문법을 알아봤다면 다방면으로 활용이 가능한 ASSIGN을 얘기해볼까한당..
알아두면 꽤 유용한 FIELD-SYMBOL

1. ASSIGN (LV_VALUE) TO <VALUE>.
DATA : LV_VALUE TYPE CHAR10 DEFAULT 'LV_NUM',
LV_NUM TYPE N DEFAULT 1004.
FIELD-SYMBOLS : <VALUE> TYPE ANY.
저기 LV_VALUE라는 변수에 문자열로 내가 'LV_NUM'이라고 넣어놨다.
LV_NUM은 1004라는 값을 넣어놨지..
이거 이렇게도 쓸수있다.
ASSIGN (LV_VALUE) TO <VALUE>.
이렇게 ()를 넣어주면 그 LV_VALUE 자체가 아닌 그 안에 들어있는 값을 변수명으로 보고
그 변수를 참조한다.
그러므로 여기서 <VALUE>는 1004의 값을 갖게 된다.
이해되는감?
이러면 내가 유동적으로 저 변수를 바꿀 수 있겠지.
스트럭쳐의 필드도 마찬가지다.
LV_VALUE에 문자열로 어떤 스트럭쳐 필드를 적어놓고 저렇게 ASSIGN시키면
아주 동적으로 사용할 수 있다. 편리하쥬?
아이디어 샘솓쥬?
이렇게 쓰는거 또있다.
2. ASSIGN TABLE FIELD (LV_VALUE) TO <VALUE>.
이런것도 있는데 이건 LV_VALUE값이 ㅌㅔ이블 필드명일 때 그 값을 가르킨다.
근데 이거 쓰지마라. 걍 1번써라~~~
왜냐하면 딕셔너리로 봐도 이거 구식이라 한다. 그냥 1번써라.
1번있자나 그냥 이거써줘 1번.. 1번으로.. 충분해..
3. ASSSIGN LOCAL COPY OF LV_NUM TO <NUM>.
이것도 아주 편리하다. 이건 뭐냐면.. 참초는 하는데 값만 복사하는거다.
그니깐 ASSIGN은 하지만~ <NUM>값을 변경해도 LV_NUM값이 변경되지 않는거다.
근데 이건 로컬로 필드심볼을 선언해야지만 사용할 수 있다.
알아두도록..
예시다. ( 들여쓰기 안맞는건 이해점 ㅎㅎ.. )
이렇게하면 어떻게 출력되냐면

요렇게 된당.
4. ASSSIGN COMPONENT (FIELD) OF STRUCTURE LS_SFLIGHT TO <NUM>.
이거는 진짜 유용하다.
이거는 스트럭쳐의 필드를 ASSIGN하는거다.
내가 제목에는 (FIELD)라고 적긴했지만..
저기엔 COMPNENT 순서나 FIELD NAME이 올 수 있다.
일단.. 스트럭쳐의 구조를 한번 살펴보자면..

(디버깅 걸어서 열은 나의 스트럭쳐임)
스트럭쳐는... 이렇게 생겼다..
저기 필드들이 쫘르륵 있다.
만약에.. 내가 저 스트럭쳐의 GJAHR의 값을 참조하고자 한다면?
두가지 방법이 있다.
1. ASSIGN COMPONENT 4 OF STRUCTURE LS_TEMP TO <VALUE>.
* <VALUE>라는 필드심볼 선언했다고 치자. (생략생략)
2. ASSIGN COMPONENT GJAHR OF STRUCTURE LS_TEMP TO <VALUE>.
이렇게 할수있다. 하나는 숫자를 넣고.. 하나는 필드명을 직접 넣어줬다.
2번은 굉장히 직관적이라 바~로 이해가 되겠지만
1번은 혹시 이해가 안될 수도 있어서 알려준다..
저 4는.. LS_TEMP라는 스트럭쳐의 4번째 COMPONENT라는 뜻이다..
만약 MONAT를 ASSIGN하고 싶다면 5를 적어도 되겠지..
ㄱ구래서~
ASSIGN COMPONENT 4 OF STRUCTURE LS_TEMP TO <VALUE>.
이렇게 하면
<VALUE>는 LS_TEMP-GJAHR과 같은 값을 가지고 있게 된다..
그러므로 지금 <VLAUE>는 2020이라는 값을 가지고 있지..
그래서 만약에~~
내가
<VLAUE> = 2023.
이라고 하면?

스트럭쳐 안의 GJAHR은 2023이라는 값을 가지게 된다..
물ㄹ~론.. 테이블에 변경된 값을 반영하고싶다면 MODIFY를 시켜줘야지..
필드심볼로 바꿨는ㄷ ㅔ 안된다고 징징대지말ㅇㅏ라
여기서 한가지 팁을 주자면..
DATA : LV_VALUE TYPE CHAR10 DEFAULT 'GJAHR'.
ASSIGN COMPONENT (LV_VALUE) OF STRUCTURE LS_TEMP TO <VALUE>.
도 먹히고..
ASSIGN COMPONENT 'GJAHR' OF STRUCTURE LS_TEMP TO <VLAUE>.
요렇게 문자열로 넣어도 먹힌다..
어찌보면 당연하다 생각할수도 있고.. 굳이 저렇ㄱㅔ? 쓸일이 있나?싶을 수도.. 있지만..
있다.. 있으니깐 알아둬라 진짜 난 저거 몰라서 서러웠다.
암튼..여기까지다..
다음번엔 필드심볼 역참조 하는 방법을 들고오겠다..
그럼 저기 ' ' ()가 왜 필요한지.. 더 와닿을거다.. 아오 팍씨.