본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] 문자열 표시 길이 계산 — cl_abap_list_utilities=>dynamic_output_length (한글 폭 반영)

by Song.sh 2026. 5. 14.

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 버전·로케일·코드페이지 설정에 따라 일부 결과가 다를 수 있습니다. 운영 환경 적용 전 개발 시스템에서 실제 문자 셋과 결과 값을 확인하시기 바랍니다.