처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.05.27 58

printf의 숨겨진 90%, 우리가 안 쓰던 포맷 지정자들

Hacker News 원문 보기
printf의 숨겨진 90%, 우리가 안 쓰던 포맷 지정자들

printf, 진짜 다 알고 쓰는 거 맞아요?

C언어를 배우면 가장 먼저 만나는 함수가 printf예요. printf("Hello, World!\n"); 이거 안 써본 개발자 없을 거예요. 그런데 우리가 평소에 쓰는 건 %d, %s, %f, 잘해야 %x 정도잖아요. 사실 printf는 그것보다 훨씬 많은 기능을 가진 함수예요. 최근 공개된 한 영상에서는 "우리는 printf의 10%만 쓰고 있다"며, 잘 안 알려진 포맷 지정자와 기능들을 정리해서 보여주거든요.

이게 왜 중요하냐면, printf의 숨은 기능들을 알면 디버깅이 훨씬 편해지고, 출력 코드도 짧고 깔끔해져요. 매번 별표 박아서 자릿수 맞추고, 16진수 변환 함수 따로 만들고 그러던 거, 사실 printf 한 줄로 끝낼 수 있는 게 많거든요.

잘 안 쓰지만 알아두면 좋은 기능들

먼저 "너비를 동적으로 지정하기"가 있어요. 보통 %5d처럼 자릿수를 고정으로 쓰잖아요? 그런데 %d라고 쓰고 인자로 너비를 전달할 수 있어요. 예를 들어 printf("%d", 10, 42);라고 하면 "42를 너비 10으로 출력"이 되는 거죠. 정밀도도 마찬가지로 %.*f로 동적 지정이 가능해요. 표를 출력하거나 가변 폭 정렬할 때 정말 유용해요.

그 다음은 "위치 지정 인자"인데요, POSIX 확장이긴 한데 printf("%2$s %1$s", "world", "hello");라고 쓰면 "hello world"가 나와요. 인자 순서를 마음대로 바꿀 수 있다는 얘기예요. 이건 다국어 처리할 때 빛을 발해요. 언어마다 문장에서 단어 순서가 다르잖아요? 코드는 그대로 두고 포맷 문자열만 바꿔서 번역할 수 있거든요.

또 잘 모르는 게 %n 지정자예요. 이건 좀 신기한데, "지금까지 출력한 문자 수를 변수에 저장"하는 기능이에요. printf("hello%n world", &count); 하면 count에 5가 들어가요. 다만 이건 보안 취약점(format string attack)의 원인이 되기도 해서 현대 컴파일러들은 경고를 내거나 비활성화하기도 해요. 알아두긴 하되 쓰진 마세요.

길이 수정자와 진법 출력의 디테일

%ld, %lld, %zu, %td 같은 길이 수정자들 있잖아요. 이걸 정확히 안 쓰면 64비트 환경에서 골때리는 버그가 생겨요. 특히 size_t는 플랫폼마다 크기가 달라서 꼭 %zu로 출력해야 하고, 포인터 차이값은 %td, intptr_t는 %" PRIdPTR " 같은 매크로를 써야 해요. 영상에서는 이런 "정확한 타입 매칭"이 얼마나 중요한지 강조해요. 한 번 잘못 출력해서 디버깅 5시간 날린 경험, 다들 있잖아요.

진법 출력도 의외로 깊어요. %#x라고 쓰면 "0x" 접두사가 자동으로 붙고, %08x라고 쓰면 0으로 패딩된 8자리 16진수가 나와요. 메모리 덤프 출력할 때 진짜 편해요. %a는 부동소수점을 16진수 지수 표기로 출력하는 건데, 이건 비트 단위로 정확한 값을 봐야 할 때 써요. 일반 %f는 반올림 때문에 진짜 값과 미세하게 다를 수 있거든요.

printf 친척들도 같이 알아두기

printf만 있는 게 아니에요. snprintf는 버퍼 오버플로우를 막아주는 안전한 버전이고, asprintf(GNU 확장)는 메모리를 알아서 할당해 주는 편의 함수예요. dprintf는 파일 디스크립터에 바로 쓰고, fprintf는 stderr 같은 다른 스트림에 출력해요. 영상에서는 이런 친척들을 상황에 맞게 골라 쓰는 게 진짜 C 개발자의 기본기라고 말해요.

그리고 컴파일러가 printf 호출을 정적 분석해서 "포맷 문자열과 인자 타입이 안 맞는다"고 경고해주는 기능도 있어요. GCC, Clang은 기본으로 켜져 있는데, 직접 만든 함수에도 이걸 적용하려면 __attribute__((format(printf, 1, 2)))를 붙이면 돼요. 사내 로깅 함수에 이걸 붙여두면 버그를 한참 일찍 잡을 수 있어요.

한국 개발자에게 주는 의미

요즘 신입 개발자들은 C를 거의 안 거치고 바로 파이썬이나 자바스크립트로 시작하잖아요. 그러다 보니 임베디드나 시스템 프로그래밍, 또는 게임 엔진 코드를 만났을 때 printf 한 줄 제대로 못 짜는 경우가 많아요. 그런데 디버깅 도구가 빈약한 환경(임베디드, 커널, 부트로더)에서는 printf가 사실상 유일한 디버거예요. 그래서 printf를 "진짜로 잘" 쓰는 법을 익혀두면 평생 써먹어요.

C++의 std::format이나 러스트의 println! 매크로도 printf 가족의 후예예요. 포맷 문법이 거의 비슷하거든요. printf를 잘 알면 다른 언어 출력 함수도 빠르게 익혀요.

정리하면

매일 쓰는 함수에도 우리가 모르는 90%가 숨어 있어요. printf의 동적 너비, 위치 지정, 길이 수정자, 정밀한 진법 출력 같은 기능을 익혀두면 디버깅 속도가 확 빨라져요. 여러분은 printf의 어떤 숨은 기능을 가장 유용하게 써보셨나요?


🔗 출처: Hacker News

이 뉴스가 유용했나요?

이 기술을 직접 배워보세요

파이썬으로 자동화를 시작해보세요

파이썬 기초부터 자동화까지 실전 강의.

파이썬 강의 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.