항목 TYPE C(고정 길이 문자) STRING(가변 길이 문자)
길이 선언 시 길이 고정 (LENGTH n) 길이 제한 없음 (논리적으로 2GB까지)
메모리 할당 정적 메모리 (스택 기반) 동적 메모리 (힙 영역)
자동 잘림 값이 길면 잘림 자동 확장 (잘리지 않음)
뒤에 공백 그대로 유지됨 (공백 채움) 필요 시 자동 제거 (CONDENSE 덜 필요)
성능 빠름, 가볍지만 제한적 유연하지만 약간 느릴 수 있음
문자열 조작 불편 (슬라이싱 등 불편) 유연 (연결, 길이 구하기, 조작 편함)
 

예제 비교

🔸 TYPE C

DATA: lv_c TYPE c LENGTH 5. lv_c = 'ABAPISFUN'. " → 'ABAPI'로 잘림 WRITE: / lv_c. " 출력: ABAPI

🔸 STRING

 
DATA: lv_s TYPE string. lv_s = 'ABAPISFUN'. " 전부 들어감 WRITE: / lv_s. " 출력: ABAPISFUN

 

 

메모리 구조 차이

  • TYPE C는 **컴파일 시 길이가 결정되므로 정적 메모리(스택)**에 저장됨
  • STRING은 실행 중에 메모리가 동적으로 할당됨 (힙 영역)
    → 그래서 길이 제한 없이 자유롭게 늘어날 수 있음

언제 어떤 걸 써야 할까?


상황 추천타입 이유
짧은 고정 필드 (예: 성별, 상태코드 등) TYPE C LENGTH 1~10 빠르고 메모리 절약
사용자 입력값, 설명, 긴 텍스트 등 STRING 길이 유동적이고 안전
파일 읽기, 로그, JSON 처리 STRING 데이터 길이 예측 불가

 

관련 함수


함수 설명
STRLEN() 문자열 길이 반환 (STRING에 최적)
CONCATENATE 문자열 연결
SPLIT, REPLACE, FIND 문자열 처리
CONDENSE 공백 제거 (C 타입에 자주 필요)

 

'SAP' 카테고리의 다른 글

easy abap 05.구조체 structure타입 선언  (0) 2025.05.07
easy abap 04. string 함수  (0) 2025.05.07
easy abap 02. 변수에 값 넣는 방법  (0) 2025.05.07
easy abap 01. 네이밍 규칙  (0) 2025.05.07
easy abap 00. 자료형  (0) 2025.05.06

abap에서 변수에 값을 넣는 방법은 뭐가 있을까?

Value 나 = 대입연산자 를 쓰는 경우 외에 또 뭐가 있을 지 궁금해졌다.

1. VALUE – 선언과 동시에 초기값

DATA lv_name TYPE c LENGTH 10 VALUE 'Konie'.

- 선언 시 사용가능

- 한 번에 초기값 넣을 때 편함

 

2. MOVE TO – 값 대입 (요즘은 안쓴다고함)

 
`MOVE 'Wonie' TO lv_name.`
  • 예전 스타일
  • 지금은 거의 사용 ❌ 하지 않는다고한다(가독성 낮고 불편)

3. = – 대입 연산자 

 
lv_name = 'Konie'.
  • 가장 널리 쓰이고, 간단하고 직관적
  • IF, CASE, 계산식 등과 잘 어울림

 

4. CLEAR – 변수 초기화 (기본값으로 설정)

CLEAR lv_name. " 문자열은 공백, 숫자는 0

 

5. REFRESH – 내부 테이블 초기화

REFRESH lt_data. " lt_data = internal table

📌 요건 내부 테이블 전용

6. MOVE-CORRESPONDING – 구조체 간 필드명 일치시 값 복사

MOVE-CORRESPONDING ls_source TO ls_target.
  • 두 구조체가 있을 때 같은 필드명끼리만 값이 복사됨
  • gs_emp-name = ls_emp-name. 이렇게 하나씩 안 써도 돼서 편함

 

7. READ TABLE + INTO – 내부 테이블에서 읽어서 변수에 넣기

READ TABLE lt_emp INTO ls_emp INDEX 1.
  • 내부 테이블에서 1행을 구조체에 대입

 

8. LOOP AT + INTO

LOOP AT lt_emp INTO ls_emp.
         lv_name = ls_emp-name.
ENDLOOP.

9. ASSIGN – 필드 심볼에 대입 (참조처럼)

 
FIELD-SYMBOLS: <fs_name> TYPE any.
ASSIGN lv_name TO <fs_name>.
<fs_name> = 'Konie'. " → 실제로는 lv_name이 바뀜

 

 

 

요약 표


방법 설명 많이 쓰는 지
VALUE 선언 시 초기값
MOVE TO 구식 대입
= 표준 대입 ✅✅✅
CLEAR 기본값 초기화
MOVE-CORRESPONDING 구조체 복사
READ INTO 테이블 → 구조체
ASSIGN 필드 심볼 참조 ⚠️ 고급용

 

'SAP' 카테고리의 다른 글

easy abap 04. string 함수  (0) 2025.05.07
easy abap 03. string vs c  (0) 2025.05.07
easy abap 01. 네이밍 규칙  (0) 2025.05.07
easy abap 00. 자료형  (0) 2025.05.06
SAP ABAP Programming for Beginners - 74 Sort  (0) 2025.04.24

1. 기본 문법 규칙


항목 규칙
최대 길이 대부분 30자까지 (객체마다 다름)
허용 문자 알파벳, 숫자, 밑줄(_)만 가능
시작 문자 알파벳으로 시작해야 함 (숫자로 시작 ❌)
대소문자 ABAP은 대소문자 구분 안 함, 하지만 소문자/카멜표기 사용 권장
예약어 금지 DATA, SELECT 같은 키워드는 변수명으로 못 씀

 

2. 접두어 

접두어 의미 예시
gv_ Global Variable (전역 변수) gv_count, gv_name
lv_ Local Variable (지역 변수) lv_age, lv_total
gt_ Global Table (전역 내부 테이블) gt_students, gt_data
lt_ Local Table (지역 내부 테이블) lt_output, lt_items
gs_ Global Structure (전역 구조체) gs_header
ls_ Local Structure (지역 구조체) ls_item
p_ 파라미터 (PARAMETERS/FORM/Function) p_date, p_id
s_ SELECT-OPTIONS s_matnr, s_range
f_ FORM 루틴 이름 f_print_footer
ty_ 로컬 타입 정의 (TYPES) ty_student, ty_order
l_ LOOP 안의 임시 변수 l_index, l_result
z 또는 y 커스텀 객체(prefix 필수) ZREPORT01, ZTABLE_CUSTOMER

 

3. 모듈/오브젝트 이름 규칙 (SAP 시스템 객체)


종류 접두어 예시
프로그램 Z, Y ZREPORT_PAYROLL
함수 모듈 Z_, Y_ Z_CALCULATE_TOTAL
클래스 ZCL_, YCL_ ZCL_INVOICE_HANDLER
인터페이스 ZIF_ ZIF_PAYMENT_CONTROL
테이블 Z ZCUSTOMER, ZORDER
도메인/데이터요소 Z ZAGE_TYPE, ZCUST_NAME

 

'SAP' 카테고리의 다른 글

easy abap 03. string vs c  (0) 2025.05.07
easy abap 02. 변수에 값 넣는 방법  (0) 2025.05.07
easy abap 00. 자료형  (0) 2025.05.06
SAP ABAP Programming for Beginners - 74 Sort  (0) 2025.04.24
SAP ABAP Programming for Beginners - 73 Delete  (0) 2025.04.24

모든 프로그래밍언어를 배울 땐 자료형이 어떤것이 있는 지 아는 것이 중요하다고 생각한다.

abap의 자료형에 대한 깊은 이해가 없고, 

선언에 어려움을 겪는 듯 하여 연습해서 공부하려고 한다.

 

 

이렇게만 해서는, 명확하게 자료형 & 결과에 대한 학습이 잘되지 않음을 느꼈다

gpt 공부법 시작

 

gpt에게 데이터 선언에 대한 질문을 해달라고 했고,

내가 완전히 자료형을 파악할 때까지 연습을 했다.

이 결과, apab의 자료형과 어떻게 쓰는 지, 특징을 파악할 수 있었다.

REPORT zdatatype_practice.

DATA: lv_int     TYPE I VALUE 12345,                  " 정수형
      lv_float   TYPE F VALUE '3.14159',              " 부동소수점
      lv_packed  TYPE P DECIMALS 2 VALUE '1234.56',   " 고정소수점 (통화형)
      lv_char    TYPE C LENGTH 10 VALUE 'ABAP',       " 고정 문자열
      lv_n       TYPE N LENGTH 8 VALUE '20250506',    " 숫자 문자열 (숫자만 입력 가능)
      lv_string  TYPE STRING VALUE 'Hello, ABAP!',    " 가변 문자열
      lv_date    TYPE D VALUE '20250506',             " 날짜 (YYYYMMDD)
      lv_time    TYPE T VALUE '153045',               " 시간 (HHMMSS)
      lv_hex     TYPE X VALUE 'FF',                   " 헥사값 (1 byte)
      lv_xstring TYPE XSTRING.                        " 가변 헥사 문자열

START-OF-SELECTION.

  lv_xstring = 'DEADBEEF'. " 16진수 문자열 대입

  WRITE: / '정수형(I):', lv_int,
         / '부동소수점(F):', lv_float,
         / '고정소수점(P):', lv_packed,
         / '고정 문자열(C):', lv_char,
         / '숫자 문자열(N):', lv_n,
         / '가변 문자열(STRING):', lv_string,
         / '날짜(D):', lv_date,
         / '시간(T):', lv_time,
         / 'HEX(X):', lv_hex,
         / 'XSTRING:', lv_xstring.

 

 

 lv_char    TYPE C LENGTH 10 VALUE 'ABAP',       " 고정 문자열 이기 때문에, 

'ABAP_ _ _ _ _ _ ''해서, 총 공백포함하여 10개의 문자열이 생성된다.

✅ ABAP SORT 문 – 내부 테이블 정렬하기


1️⃣ 기본 문법

SORT itab01.
  • 내부 테이블 itab01을 오름차순(ascending) 으로 정렬함.
  • 기본 키(primary key) 기준으로 정렬됨.b
  • 추가 조건이 없는 경우는 기본 정렬 방식으로 작동함.

2️⃣ BY 절을 사용한 정렬

SORT itab01 BY surname.
  • surname 필드 기준으로 정렬함.
  • 여러 필드로 정렬하고 싶으면 공백으로 필드명만 나열하면 됨.
 
SORT itab01 BY surname forename.

❌ 쉼표(,) 쓰지 않음!


3️⃣ 언어 특성을 반영한 정렬: AS TEXT

SAP 시스템은 전 세계 언어를 다루기 때문에 정렬 시 언어 특성을 고려할 수도 있어.

SORT itab01 AS TEXT BY surname forename.
  • 언어 기준 정렬 적용됨 (예: 독일어 ß, ä 같은 특수문자).
  • AS TEXT는 모든 필드에 적용됨.

특정 필드에만 AS TEXT 적용하고 싶다면?

SORT itab01 BY surname forename AS TEXT.
 
  • forename 필드에만 텍스트 정렬 적용됨.

4️⃣ 정렬 방향 지정 – ASCENDING, DESCENDING

SORT itab01 BY surname DESCENDING.
  • surname 필드를 기준으로 내림차순 정렬함.
SORT itab01 BY surname ASCENDING.
  • 오름차순은 기본값이므로 생략 가능하지만 명시할 수도 있다.

5️⃣ SORT 가능한 테이블 종류


테이블 종류사용가능여부 설명
Standard Table ✅ 가능 꼭 BY절을 사용해야 함
Sorted Table ✅ 가능 기본 키 기준으로 자동 정렬됨
Hashed Table ❌ 불가능 정렬 개념 자체가 없음 (인덱스도 없음)

🔍 정리 요약


기본 정렬 SORT itab.
특정 필드 기준 정렬 SORT itab BY surname.
다중 필드 기준 정렬 SORT itab BY surname forename.
내림차순 정렬 SORT itab BY surname DESCENDING.
언어 정렬 전체 적용 SORT itab AS TEXT BY surname forename.
언어 정렬 필드만 적용 SORT itab BY surname forename AS TEXT.

sort한 결과물

 

📌 내부 테이블에서 레코드 삭제하기 – DELETE 문


✅ 기본 개념

DELETE 문을 사용하면 내부 테이블에서 특정 레코드 하나 또는 조건에 맞는 여러 레코드를 삭제할 수 있다.

👉 삭제할 때 가장 빠른 방법은 인덱스(index) 를 이용하는 것!!!


① 인덱스를 이용한 삭제 (가장 빠름)

DELETE itab01 INDEX 3.
  • 내부 테이블 itab01의 3번째 레코드를 삭제함.
  • 헤더 라인(header line) 은 사용하지 않고, 테이블 본문(body) 을 직접 수정함.
  • standard table, sorted table에서만 가능 (hash table은 index 개념 없음).

② 루프 안에서 조건을 이용한 삭제

루프를 돌면서 특정 조건에 맞으면 삭제할 수도 있다.

LOOP AT itab01. IF surname = 'Smith'. DELETE itab01 INDEX sy-index. ENDIF. ENDLOOP.
  • sy-index는 현재 루프의 반복 횟수를 의미하는 시스템 변수.
  • 예: 루프가 5번째 돌고 있다면 sy-index = 5가 됨 → 5번째 레코드를 삭제함.
  • 중요: 루프 안에서 DELETE를 사용할 때는 꼭 INDEX sy-index 같이 인덱스를 명시해야 함.
    • 그렇지 않으면 ABAP 최신 문법에서는 에러가 날 수 있다.

③ WHERE 조건을 이용한 삭제

삭제할 레코드의 인덱스를 모를 때 사용!

DELETE itab01 WHERE surname = 'Smith'.
  • 내부 테이블에서 surname이 'Smith'인 모든 레코드를 삭제함.
  • 조건에 맞는 레코드를 하나만 삭제하는 게 아님!
    • 일치하는 레코드가 여러 개면 전부 삭제됨.
  • 항상 구체적인 조건을 쓰는 게 중요하다.

🔍 요약


방식 설명 특징
DELETE ... INDEX n n번째 레코드 삭제 가장 빠름, index 번호를 알아야 함
루프 안에서 sy-index 사용 현재 루프 위치의 레코드 삭제 루프 조건에 따라 삭제 가능
DELETE ... WHERE ... 조건에 맞는 모든 레코드 삭제 조건이 모호하면 모두 삭제됨

💡 주의사항

  • 루프 밖에서 DELETE를 쓰는 경우, INDEX 또는 WHERE를 반드시 사용해야 함.
  • 조건 없이 DELETE만 쓰면 에러 날 수 있음!
  • 특히 WHERE 조건을 쓸 때는, 삭제할 대상이 명확하도록 조건을 구체화하는 게 중요함.

 

📘 READ TABLE 문이란?

READ TABLE은 내부 테이블에서 특정 레코드 1개만 "직접" 읽어올 때 사용하는 명령어다.

보통 LOOP AT은 전체를 돌면서 하나씩 처리하지만, READ TABLE은 특정 조건을 만족하는 한 줄만 딱 골라서 읽고 싶을 때 사용된다.

 

📌 기본 문법

인덱스로 읽기 (가장 빠름)

READ TABLE itab01 INDEX 5.

- 내부테이블 itab01의 5번째 줄을 읽어와서 헤더라인에 넣는다.

- 가장 빠른 방식이다.

- 몇번째 줄에 있는 지 정확하게 알아야한다.

 

키로 읽기 (일반적)

READ TABLE itab01 WITH KEY employee = '1234567'.
  • employee가 '1234567'인 행을 찾아서 헤더 라인에 넣음.
  • 일반적으로는 KEY를 사용해서 찾는 경우가 더 많음.
  • 주의점!*
    • 고유하지 않은 키일 경우, 예를 들어 surname = 'Smith' 같은 경우 → 해당하는 첫 번째 레코드만 읽혀짐. → 나머지 'Smith'들이 있더라도 읽히지 않음.

 

예시

 

READ TABLE itab01 INDEX 3.
" 3번째 행을 읽는다.

READ TABLE itab01 WITH KEY employee = '1234567'.
" employee 필드가 '1234567'인 행을 읽는다.

 

READ TABLE itab01 WITH KEY employee = '1234567'.
IF sy-subrc = 0.
  WRITE: '찾았습니다!'.
ELSE.
  WRITE: '해당 직원 없음!'.
ENDIF.

 

 

- 인덱스는 성능을 위한 빠른 검색이 필요할 때 쓰는 것이다.

- 그에 맞게, 특정 값을 알고 있으면 전체를 반복할 필요없이 빠르게 값을 찾을 수 있디.

 

따란@

 

line_cnt 는 itab01의 테이블을 돌고, 몇 라인이나 있는지 세준다.

총 갯수의 write를 했을 때, cnt는 총  5개 (데이터 들어가있는 값이 5개였다.)

itab01-surname을 출력했을 때는 해당 테이블의 맨 마지막 surname을 추출했다.

맨 마지막 라인에 'po'를 추가하면 내부테이블 안에 쏙 들어간다.

 

 

출력시 위와같이 잘 나오는 것을 알 수 있다.

 

 

surname이 'Ko'인 사람을 'Kooo'로 바꿨고, 내부테이블에서는 변경이 일어난 점을 확인했다.

그런데 zemployees에서는 kooo나, internal table에서 추가한 새로운 'po'도 볼 수 없었는데,

이 이유는 내가 modify [실제 db테이블 ] from [내부테이블] 을 하지 않았기 때문이였다.

 

변경하려고 하니 위와같은 에러가 나왔는데, 

그 이유는 work area or internal table의 타입이 DB테이블의 구조와 정확히 1:1매핑되어있어야하지만,

그렇지 않기 때문이였다.

 

몇가지 work area만 내부테이블에서 가져와서 썼기 때문에 일치하지 않고 호환되지 않기 때문에

inactive로만 된다.

 

해결방법으로는 work area의 타입을 완전히 같게 만들거나 move-corresponding으로 옮기는 방법이 있다.

 

Internal table에서 modify 쓰는 방법

itab01에 대한 정보를 바꾸고 modify해주면 된다

 

REPORT zc215_test.

DATA : gt_itab TYPE TABLE OF sflight,
       gs_wa   TYPE sflight.

SELECT carrid connid
  FROM spfli 
  INTO CORRESPONDING FIELDS OF TABLE gt_itab
  PACKAGE SIZE 5. 
  LOOP AT gt_itab INTO gs_wa.
    WRITE : / gs_wa-carrid, gs_wa-connid.
  ENDLOOP.
  ULINE 1.
ENDSELECT.

PACKAGE SIZE 5에 따라, 

출력이 5개씩 되어야하는데,

ULINE 1을 하면 4개씩만 출력이 되었다.

 

 

이게 원래 기존 26행짜리고,

ULINE 1이 들어가면

 

이런식으로 총 20행만 나온다.

 

나머지 6행은 어디로 간걸까.....?

 

PACKAGE SIZE는 데이터 베이스에서 한 번에 가져오는 레코드 수를 지정하는데, ABAP은 화면에 표시할 수 있는 라인 수을 고려한다.

ULINE은 화면에 한 줄을 차지하는데, 이 줄도 ABAP시스템이 출력할 때 하나의 행으로 계산한다.

  1. PACKAGE SIZE 5로 설정했을 때
  2. 시스템은 5개의 행을 출력해야 한다고 계산하지만
  3. 이 중 1개의 행은 ULINE에 의해 소비됨
  4. 남은 4개의 행만 실제 데이터로 출력됨

즉, ABAP은 일종의 '출력 버퍼' 개념으로 작동하여 PACKAGE SIZE에 지정된 숫자만큼의 라인(데이터 라인 + 형식 라인)을 출력하려고 시도한다. ULINE이 이 중 하나의 라인을 차지하기 때문에 실제 데이터는 하나 적게 표시되는 것이다.

 

그러면 어떻게 해결해야할까?

나는 이걸 한 줄씩 보고싶은데 말이다!

1. 문자열대입하기

LOOP AT gt_itab INTO gs_wa.
  WRITE : / gs_wa-carrid, gs_wa-connid.
ENDLOOP.
WRITE : / '---------------------'.  " 단순 문자열 선
ENDSELECT.

 

2. SKIP사용하기

LOOP AT gt_itab INTO gs_wa.
  WRITE : / gs_wa-carrid, gs_wa-connid.
ENDLOOP.
SKIP.  " 한 줄 건너뛰기
ENDSELECT.

 

 

skip하면 26줄 다 잘 나온다!

+ Recent posts