ABAP에서 문자열 길이를 잴 때 가장 흔히 쓰는 함수는 STRLEN( ) 입니다. 단순히 글자 개수를 반환해주는 함수죠. 그런데 한글이 섞인 문자열을 화면이나 출력 영역에서 다룰 때 는 STRLEN 만으로는 부족한 순간이 옵니다.
이유는 단순합니다 — 한글 한 글자는 화면에서 영문 두 글자만큼 폭을 차지(전각) 하기 때문입니다. STRLEN은 "오늘"을 2글자로 세지만, 실제 화면 출력 폭은 4칸. 메일 본문·리스트 출력·고정 폭 컬럼 정렬 같은 곳에서는 글자 개수가 아니라 표시 폭(display width) 기준으로 계산해야 합니다.
이때 사용하는 SAP 표준 유틸리티가 cl_abap_list_utilities=>dynamic_output_length 메서드입니다.
이 글은 그 사용법과 STRLEN 과의 차이를 정리한 메모입니다.
핵심 원리
두 함수의 동작 차이를 먼저 정리합니다.
| 함수 | 반환 값 | 한글 1글자 |
|---|---|---|
STRLEN( str ) |
글자 개수 | 1 (글자로 셈) |
cl_abap_list_utilities=>dynamic_output_length |
화면 표시 폭 | 2 (전각 폭) |
예시: '오늘은 목요일 휴일까지 단 이틀 남았습니다.' (한글 21자 + 공백 4 + 마침표 1 = 26개 글자) 에 대해:
| 함수 호출 | 결과 |
|---|---|
STRLEN( pa ) |
26 (모든 글자를 1씩 셈) |
dynamic_output_length( field = pa ) |
42 (한글 21자 × 2폭 + 영문/공백/점 = 42) |
차이는 16 폭 — 이게 화면이나 메일 본문에서 줄 맞춤·박스 폭 계산에 결정적인 영향을 줍니다.
1단계 — 변수와 입력 파라미터 선언
결과를 받을 길이 변수와 화면 입력 파라미터를 준비합니다.
DATA: lv_len(3), " 길이 결과 받는 변수 (3자리면 충분 — 표시 폭 999까지)
lv_text(100). " 보조 문자열 (옵션)
PARAMETERS pa TYPE makt-maktx. " 자재 텍스트 타입 (40자)
핵심 포인트:
lv_len(3)— 길이 결과 변수. 짧은 문자열이면 3자리(CHAR(3)) 면 충분PARAMETERS pa TYPE makt-maktx— 자재 텍스트 DDIC 타입 사용. 한글 입력 호환
길이 변수는 TYPE i(integer) 로 잡아도 동일하게 동작합니다.
2단계 — dynamic_output_length 호출
클래스 메서드를 정적으로 호출합니다. 인자는 EXPORTING field, RECEIVING len 두 개.
cl_abap_list_utilities=>dynamic_output_length(
EXPORTING
field = pa " 길이 계산할 문자열
RECEIVING
len = lv_len ). " 표시 폭 결과
호출 후 lv_len 에 화면 표시 폭 이 담겨 돌아옵니다.
3단계 — 결과 확인
위 예시 문자열로 실행하면 다음 결과가 나옵니다.
| 입력 | 출력 |
|---|---|
오늘은 목요일 휴일까지 단 이틀 남았습니다. |
42 (표시 폭) |
SAP |
3 |
안녕 (한글 2자) |
4 (전각 폭) |
활용 시나리오
이 메서드가 진짜 가치를 발휘하는 상황은 고정 폭 출력 이 필요한 경우입니다.
| 시나리오 | 활용 방식 |
|---|---|
| 리스트 출력 줄 맞춤 | 한글 컬럼의 표시 폭 기준으로 공백 패딩 계산 |
| 박스/테두리 그리기 | 한글 라벨 박스 폭 동적 결정 |
| 고정 폭 데이터 영역 | FTP 송신 전 byte 폭 검증 (한글 포함 필드) |
| 화면 라벨 폭 제한 | Screen Painter 필드 가시 길이 vs 입력 글자 폭 비교 |
특히 FTP 송신용 고정 폭 필드 에서 한글이 섞이면 STRLEN 만으로는 byte 폭을 못 잡아서 절단·패딩이 어긋납니다. 이 메서드로 표시 폭을 먼저 측정해두면 정확한 byte 폭 가공이 가능합니다.
STRLEN 과 함께 쓰는 패턴
두 함수를 같이 호출해서 글자 수와 표시 폭의 차이 를 활용하는 패턴도 자주 나옵니다.
DATA: lv_chars TYPE i, " 글자 개수
lv_width TYPE i. " 표시 폭
lv_chars = strlen( pa ).
cl_abap_list_utilities=>dynamic_output_length(
EXPORTING field = pa
RECEIVING len = lv_width ).
" 차이가 0이면 영문/숫자만 (1바이트 글자)
" 차이가 0보다 크면 한글/한자 등 전각 글자 포함
DATA(lv_diff) = lv_width - lv_chars.
IF lv_diff > 0.
WRITE: / '한글/전각 글자가 포함된 문자열입니다. 차이:', lv_diff.
ENDIF.
이렇게 두 함수의 차이를 빼면 전각 글자 개수 가 됩니다. 한글 자동 감지 로직으로 활용 가능.
흔히 빠뜨리는 함정
STRLEN 만 쓰고 끝
한글 환경에서 STRLEN 으로 폭을 계산하면 어긋납니다. 화면 출력·고정 폭 처리·byte 송신 이 필요한 곳은 반드시 dynamic_output_length 사용.
결과 변수 너무 짧게 잡음
lv_len(2) 처럼 2자리로 잡으면 표시 폭이 100을 넘는 긴 문자열에서 잘립니다. 최소 3자리 또는 TYPE i(integer) 권장.
byte 길이와 혼동
이 메서드는 표시 폭 이지 byte 길이 가 아님. UTF-8 환경에서 한글 한 글자는 3바이트지만 표시 폭은 2. byte 길이가 필요하면 xstrlen( cl_bcs_convert=>string_to_xstring( str ) ) 같은 별도 방식 사용.
공백·특수문자 처리
공백·마침표·하이픈 같은 1바이트 문자는 폭 1로 카운트. 탭(\t) 같은 제어 문자는 환경에 따라 다르게 계산될 수 있으니 사전 확인 필요.
빈 문자열 전달
비어 있는 문자열('') 전달 시 결과는 0. 정상 동작이지만 후속 로직에서 0 분기를 빠뜨리면 0으로 나누기 등 에러 발생 가능.
일본어·중국어 환경
일본어 한자·가나, 중국어 한자도 전각 폭 2로 처리됩니다. 다국어 환경 운영 시스템이라면 사용자 로케일 영향 확인 필요.
전체 코드 — 복사용 통합본
위 단계를 하나의 ABAP 프로그램으로 합친 통합본입니다. SE38에 그대로 복사해서 활성화하면 동작합니다.
REPORT zexample_text_length.
DATA: lv_len(3), " 표시 폭 결과
lv_chars TYPE i, " 글자 개수 (비교용)
lv_diff TYPE i.
* 1) 입력 파라미터 — 한글 호환 DDIC 타입 -----------------------------
PARAMETERS pa TYPE makt-maktx.
START-OF-SELECTION.
* 2) ★ 핵심: 화면 표시 폭 계산 (한글 = 전각 2폭) -----------------------
cl_abap_list_utilities=>dynamic_output_length(
EXPORTING
field = pa
RECEIVING
len = lv_len ).
WRITE: / '입력 문자열 :', pa.
WRITE: / '표시 폭 :', lv_len.
* 3) STRLEN 비교 — 글자 개수 vs 표시 폭 ------------------------------
lv_chars = strlen( pa ).
lv_diff = lv_len - lv_chars.
WRITE: / '글자 개수 :', lv_chars.
WRITE: / '폭-개수 차이:', lv_diff.
* 4) 한글 포함 여부 자동 판정 ---------------------------------------
IF lv_diff > 0.
WRITE: / '→ 한글/전각 글자 포함'.
ELSE.
WRITE: / '→ 영문/숫자만'.
ENDIF.
* ※ 활용 예시:
* - 리스트 출력 줄 맞춤 : 표시 폭 기준 공백 패딩
* - FTP 고정 폭 송신 : byte 폭 가공 전 표시 폭 검증
* - 화면 박스 폭 동적 결정 : 한글 라벨 길이 측정 후 박스 그리기
복붙해서 활성화한 뒤 셀렉션 화면 PA 에 한글이 섞인 문자열을 넣으면 글자 개수·표시 폭·차이값을 한 번에 확인할 수 있습니다.
요약
| 단계 | 처리 | 핵심 |
|---|---|---|
| 1 | 변수 선언 | lv_len(3) 또는 TYPE i |
| 2 | 표시 폭 계산 | cl_abap_list_utilities=>dynamic_output_length( field, len ) |
| 3 | STRLEN 비교 | 차이가 0보다 크면 전각(한글/한자) 포함 |
| 4 | 활용 | 리스트 정렬·박스 폭·FTP 고정 폭·byte 가공 |
cl_abap_list_utilities=>dynamic_output_length 는 자주 등장하지는 않지만, 한글 환경에서 폭 기반 처리가 필요한 모든 곳 에서 STRLEN 의 한계를 보완해 줍니다. 한글 한 글자가 화면에서 영문 두 글자만큼의 자리를 차지한다는 단순한 사실 하나가 메일 본문·리스트·박스 출력에서 줄 어긋남을 유발하는데, 이 메서드로 미리 폭을 측정해두면 깔끔하게 해결됩니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. cl_abap_list_utilities=>dynamic_output_length 는 SAP 표준 유틸리티 클래스의 메서드로, SAP 버전·로케일·코드페이지 설정에 따라 일부 결과가 다를 수 있습니다. 운영 환경 적용 전 개발 시스템에서 실제 문자 셋과 결과 값을 확인하시기 바랍니다.