🎮 오늘의 기술 키워드
컴퓨터는 이진수(0과 1)만 이해하며, 사람이 작성한 코드는 컴파일이라는 과정을 거쳐 기계어로 번역된다.
이를 위해 전처리/전처리기가 먼저 코드를 가공한다.
진수(Radix)는 숫자를 표현하는 체계로, 10진수 외에 컴퓨터의 언어인 2진수와 사람이 읽기 편한 16진수가 주로 사용된다.
비트마스크는 이 진수 개념을 활용하여 여러 상태를 효율적으로 관리하는 기법이다.
오늘 한 내용
- printf와 std::cout의 출력 방식 차이점 확인
- #include 지시문을 활용한 헤더 파일 포함
- 상대 경로와 절대 경로의 개념 및 활용법 이해
- 10진수 → 2진수 → 16진수 변환법 확인
특히 서식 지정자의 위치에 대해 궁금증이 생겨 조금 팠다.
🎮서식 지정자의 위치
서식 지정자는 출력될 문자열의 틀을 정하는 포맷 문자열(format string) 내부에 위치한다.
이 포맷 문자열은 함수 호출 시 가장 첫 번째 인자로 전달된다.
#include <cstdio>
int main() {
int number = 123;
printf("The number is %d\n", number);
return 0;
}
- "The number is %d\n" 부분이 포맷 문자열.
- %d가 바로 서식 지정자이며, 이 위치에 변수 number의 값이 들어감.
🎮서식 지정자의 작성 순서와 규칙
서식 지정자는 % 문자로 시작하며, 그 뒤에 오는 문자들이 특정 규칙을 따른다.
기본 형식: %[플래그][폭][정밀도][길이]타입
- %: 서식 지정자의 시작을 알리는 필수 문자.
- 타입: 출력할 데이터의 종류를 결정하는 가장 중요한 부분.
- d 또는 i: 10진수 정수
- f: 부동 소수점(실수)
- c: 단일 문자
- s: 문자열
- x: 16진수
- o: 8진수
- 플래그 (선택 사항): 출력 방식에 대한 추가 옵션을 지정.
- -: 왼쪽 정렬
- +: 양수에 + 기호를 붙여 출력
- 0: 남는 공간을 0으로 채움
- 폭 (선택 사항): 출력될 최소 너비를 지정.
- %5d: 최소 5칸을 확보하고 정수를 출력.
- 정밀도 (선택 사항): 소수점 아래 자리수나 문자열의 길이를 지정.
- %.2f: 소수점 아래 2자리까지만 출력.
- 길이 (선택 사항): 변수의 크기를 지정.
- ld: long int
- lld: long long int
🎮규칙
위의 기본 형식에서 알 수 있듯이, 서식 지정자는 % 뒤에 정해진 순서대로 규칙에 맞게 작성해야 한다. %로 시작하고, 가장 마지막에 타입이 와야만 올바르게 인식된다.
예시:
- %-10.2f:
- -: 플래그(왼쪽 정렬)
- 10: 폭(최소 10칸)
- .2: 정밀도(소수점 2자리)
- f: 타입(실수)
이 규칙을 따르지 않으면 컴파일 오류가 발생하거나 예상치 못한 결과가 나올 수 있다.
🌍 생각의 연결점
- 영화 시나리오 작가 → 고급 언어(C++)는 시나리오, 컴파일러는 감독, 기계어는 배우의 연기. 감독(컴파일러)은 시나리오를 읽고 배우(기계어)가 연기할 수 있는 언어로 변환한다. 이런 느낌이기는 했다.
- 파일 관리 → 상대 경로 개념은 마치 폴더의 '트리 구조'를 이용해 목적지를 지정하는 것과 같다. 프로젝트를 통째로 옮겨도 내부 파일 경로가 깨지지 않는 것처럼, 상대 경로는 코드의 이식성을 높여준다는 것을 이해했다.
🧠 깨달음 & 질문
이해한 내용
- std::cout은 printf보다 사용하기 편리하고 안전하다.
- std::cout은 자료형을 자동으로 인식하므로 서식 지정자를 외울 필요가 없다.
- 서식 지정자에는 다양한 옵션이 있지만, 가장 중요한 것은 출력할 데이터의 '타입'을 정확하게 지정하는 것이다.
- printf와 서식 지정자는 단순히 값을 출력하는 기능이 아니라, 출력될 값의 형태와 형식을 정교하게 제어하기 위한 도구, 단순한 값 출력부터 정렬, 자릿수, 기호까지 섬세하게 다룰 수 있다.
- printf의 서식 지정자가 복잡해 보이지만, % 뒤에 플래그, 폭, 정밀도, 길이, 타입이라는 정해진 순서와 규칙이 있다는 것을 알면 쉽게 이해할 수 있다.
- std::cout이 자료형을 자동으로 처리해 편리하지만, printf의 서식 지정자를 통해 출력 형식을 직접 제어하는 것이 때로는 더 명확하고, 특히 메모리 사용량이 중요한 저수준 프로그래밍에서는 유용할 수 있다는 것을 알게 되었다.
생각나는 질문
- 컴파일러가 #include로 가져온 코드를 어떻게 효율적으로 관리하는지 더 깊이 궁금해졌다.
- 비트마스크를 사용했을 때와 안 썼을 때의 성능 차이를 직접 체감할 수 있을까?
🧵 연결 태그
#컴파일러 #개발자의생산성 #코드의이식성 #프로그래밍
📌 오늘의 메모 한 줄
"무한 반복해야겠다.."
🌱 내일을 위한 메모
std::cout과 printf의 성능 차이점 직접 찾아보기.
'C++' 카테고리의 다른 글
| [TIL_C++] 반복문 for, while 기초 (2) | 2025.08.18 |
|---|---|
| [TIL_C++] 선언, 초기화라는 '단어' 그리고 배열의 임의접근 (3) | 2025.08.14 |
| [TIL_C++] Hello World!로 알아보는 코드 작성법 (4) | 2025.08.13 |
| [TIL_C++/Git] 어색한 C언어 / 자료형 / Git (4) | 2025.08.11 |
| C++ 변수 선언 방법 (0) | 2025.07.28 |