기본 콘텐츠로 건너뛰기

방송대 C프로그래밍 2강: 자료형·변수와 선행처리기

0-썸네일-요약노트-C프로그래밍-2강

방송대 C프로그래밍 2강: 자료형·변수와 선행처리기

C 코드의 숫자 10은 그 자체로 완전한 정보가 아닙니다. 어떤 자료형으로 해석되는지, 어느 변수에 저장되는지, 컴파일 전에 어떤 문장으로 치환되는지에 따라 프로그램의 의미가 달라집니다. 이 글은 소스 코드가 선행처리기를 거쳐 컴파일되고 실행되는 흐름을 따라가며 자료형·상수·변수·매크로를 한 체계로 연결합니다.

같은 글자도 처리 단계가 다르면 의미가 달라진다

다음 학습용 코드를 보면 LIMIT, count, 10은 모두 값과 관련 있지만 역할은 서로 다릅니다.

#include <stdio.h>
#define LIMIT 10

int main(void) {
    int count = LIMIT;
    printf("%d\n", count);
    return 0;
}

먼저 선행처리기가 헤더를 포함하고 LIMIT을 10으로 치환합니다. 그다음 컴파일러는 int를 보고 정수 표현과 가능한 연산을 정합니다. 프로그램이 실행되면 변수 count가 기억공간을 차지하고 10을 저장합니다. 즉 매크로는 컴파일 전 텍스트 처리, 자료형은 값의 표현 규칙, 변수는 실행 중 값을 담는 공간입니다.

추적 순서: 선행처리 결과는 무엇인가 → 컴파일러가 각 값을 어떤 자료형으로 해석하는가 → 실행 중 어느 변수가 어떤 값을 갖는가.

자료형은 표현·공간·연산을 동시에 결정한다

자료형(data type)은 컴퓨터에서 값을 표현하는 방법입니다. 단순히 “정수인가 실수인가”만 표시하는 이름이 아니라 다음 세 질문에 함께 답합니다.

  • 표현: 비트들을 어떤 규칙으로 해석해 값을 만들 것인가?
  • 공간: 값을 저장하기 위해 어느 정도의 기억공간이 필요한가?
  • 연산: 그 값에 어떤 계산을 적용하고 결과를 어떤 형으로 처리할 것인가?

예를 들어 정수 5와 실수 5.0은 수학적으로 같은 크기지만 내부 표현과 연산 규칙이 다릅니다. 값의 종류가 맞지 않으면 필요한 자료형 변환을 거쳐야 합니다. 따라서 자료형 선택은 “큰 값을 담을 수 있는가”뿐 아니라 “필요한 정밀도와 연산을 제공하는가”까지 확인해야 합니다.

분류강의에서 다루는 형선택 질문
기본형char, short, int, long, long long, float, double, long double정수·문자·실수 중 무엇을 표현하는가?
열거형enum관련된 상태를 이름 있는 정수값으로 나타낼 것인가?
파생형배열, 구조체, 공용체, 포인터기본 값을 어떤 구조나 참조 관계로 묶을 것인가?

정수형은 비트 수를 외우기보다 실제 환경에서 확인한다

문자형과 정수형은 정수 형태의 값을 표현합니다. 정수형은 signed 또는 unsigned로 사용할 수 있습니다. 부호가 있는 형은 음수와 양수를, 부호 없는 형은 0 이상의 값을 표현합니다. 다만 평범한 char가 부호 있는 형처럼 동작하는지는 구현 환경에 따라 달라질 수 있으므로, 부호가 중요하면 signed char 또는 unsigned char를 명시하는 편이 안전합니다.

C가 보장하는 핵심 관계는 다음처럼 정수형의 크기가 뒤로 갈수록 작아지지 않는다는 점입니다.

sizeof(char) <= sizeof(short) &&
sizeof(short) <= sizeof(int) &&
sizeof(int) <= sizeof(long) &&
sizeof(long) <= sizeof(long long)

강의의 대표 환경에서는 char 1바이트, short 2바이트, int와 long 4바이트, long long 8바이트의 예를 제시합니다. 그러나 모든 시스템에서 그 크기가 같다고 가정해서는 안 됩니다. sizeof로 크기를 확인하고, <limits.h>의 INT_MIN·INT_MAX 같은 한계값을 사용하면 현재 구현에서의 범위를 확인할 수 있습니다.

#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("int: %d ~ %d\n", INT_MIN, INT_MAX);
    printf("unsigned int max: %u\n", UINT_MAX);
    return 0;
}

“int는 언제나 4바이트”는 강의 표의 대표 환경을 언어 전체의 고정 규칙으로 확대한 오개념입니다. 저장할 값의 범위는 현재 시스템의 sizeof와 <limits.h>를 기준으로 판단합니다.

문자와 실수는 같은 비트라도 읽는 규칙이 다르다

char는 정수형의 한 종류이므로 문자 코드값을 저장할 수 있습니다. 강의의 ASCII 예에서는 문자 상수 'A'가 정수 코드 65와 연결되고, 16진수 0x42가 문자 'B'로 출력됩니다. %c는 문자로, %d는 정수값으로 해석해 출력하므로 같은 변수도 형식 지정에 따라 보이는 결과가 달라집니다.

#include <stdio.h>

int main(void) {
    char ch = 'A';
    printf("문자: %c\n", ch);
    printf("코드값: %d\n", ch);
    return 0;
}

실수형인 float, double, long double은 부동소수점 방식으로 값을 표현합니다. 강의의 대표 환경에서는 float 4바이트, double 8바이트를 제시하지만 실제 크기와 범위는 구현을 확인해야 합니다. <float.h>의 DBL_MAX는 표현 가능한 큰 양의 유한값을, DBL_MIN은 가장 작은 양의 정규화값을 나타냅니다. DBL_MIN을 ‘가장 작은 음수’로 해석하면 안 됩니다.

형 선택 기준: 정확한 정수 계산은 정수형, 소수와 넓은 지수 범위는 실수형을 고려합니다. 크기만 넓히는 것으로 실수의 정밀도 문제가 모두 사라지는 것은 아니므로 값의 성격까지 봅니다.

열거형은 상태의 이름과 정수값을 연결한다

열거형(enumeration type)은 나열한 단어를 값으로 사용하는 자료형입니다. 값을 따로 지정하지 않으면 첫 이름은 0, 이후 이름은 앞 값보다 1 큰 정수값을 갖습니다. 중간 이름에 값을 지정하면 그 다음 이름부터 다시 1씩 증가합니다.

#include <stdio.h>

enum fruit { APPLE, PEAR, MANGO = 4, GRAPE };

int main(void) {
    printf("%d %d %d %d\n", APPLE, PEAR, MANGO, GRAPE);
    return 0;
}

출력은 0 1 4 5입니다. MANGO에 4를 지정했으므로 GRAPE는 5가 됩니다. 열거형의 학습 가치는 숫자 자체보다 READY, RUNNING, DONE처럼 상태의 뜻을 코드에 드러내는 데 있습니다.

상수는 표기법만 보고도 자료형 단서를 읽을 수 있다

상수(constant)는 고정된 값을 표현하며 자료형에 맞는 문법으로 적습니다. 소스 코드에서 상수를 만났다면 먼저 따옴표, 접두사, 접미사를 확인합니다.

표현예읽는 기준
10진 정수10, -45, 999일반적인 10진 숫자 표기
8진 정수012, 055앞의 0이 진법을 바꾸므로 012는 10진수 12가 아니라 10이다
16진 정수0x2D, 0XFF0x 또는 0X 뒤에 0~9, a~f를 사용
정수 접미사10u, 12345Lu/U는 unsigned, l/L은 long을 나타냄
실수3.14, 1.2e3접미사가 없으면 기본적으로 double
실수 접미사3.14f, 3.14Lf/F는 float, l/L은 long double
문자'A', '\n'작은따옴표로 묶인 한 문자
문자열"KNOU"큰따옴표로 묶인 문자들의 연속

지수 형식 1.2e3은 1.2×103이므로 1200.0이고, 5e-2는 0.05입니다. 진법 접두사와 자료형 접미사를 섞어 읽지 않는 것이 중요합니다. 0x는 값의 진법을, u와 L은 상수의 자료형을 결정하는 단서입니다.

문자·문자열·이스케이프 문자는 길이를 구분해 읽는다

문자 상수는 작은따옴표로 묶인 한 문자이고, 문자열 상수는 큰따옴표로 묶인 일련의 문자입니다. 문자열 끝에는 끝을 표시하는 널 문자 '\0'가 추가됩니다. 따라서 "CAT"은 화면에 세 글자로 보이지만 저장 관점에서는 C, A, T, \0의 네 문자를 고려합니다.

이스케이프 문자기능혼동 방지
\n줄 바꿈문자 n 두 개가 아니라 하나의 제어 문자
\t수평 탭공백 개수와 같은 고정 폭으로 단정하지 않음
\r행의 시작 위치로 이동줄 바꿈과 역할이 다름
\\백슬래시백슬래시 자체도 이스케이프가 필요함
\', \"작은따옴표, 큰따옴표구분 기호와 문자 내용을 구별함
\0코드값 0인 널 문자숫자 문자 '0'과 다름

강의의 ASCII 예처럼 '\101'과 '\x41'로도 'A'를 나타낼 수 있습니다. 앞은 8진 문자 코드, 뒤는 16진 문자 코드입니다. 이스케이프 전체가 문자 하나를 뜻한다는 점이 핵심입니다.

변수 선언은 크기·위치·초기화를 한꺼번에 결정한다

변수(variable)는 실행 중 값을 저장하고 바꿀 수 있는 기억공간입니다. 모든 변수는 사용 전에 이름과 자료형을 지정해 선언해야 합니다. 선언문을 볼 때는 다음 세 판단을 함께 해야 합니다.

  1. 크기: 저장할 값의 범위와 정밀도를 감당하는 자료형인가?
  2. 위치: 어느 함수와 블록에서 사용할 변수인가?
  3. 초기화: 첫 번째 읽기 전에 의미 있는 값이 저장되는가?
int count = 5;
double average = count / 4.0;

count에는 정수 5가 저장됩니다. 두 번째 식은 4.0이 실수 상수이므로 실수 나눗셈이 이루어져 average는 1.25가 됩니다. 만약 count / 4처럼 두 피연산자가 모두 정수라면 나눗셈 결과가 먼저 정수로 계산된다는 점은 다음 차시의 연산자를 배울 때 다시 연결됩니다.

범위를 벗어난 값은 출력 패턴을 외우지 말고 원인을 고친다

강의 예제는 대표 환경의 short int 범위 끝에서 1을 더하거나 빼면 예상과 다른 값이 저장될 수 있음을 보여 줍니다. 핵심은 “최댓값 다음은 언제나 최솟값”이라는 공식을 외우는 것이 아닙니다. 범위를 벗어난 값을 좁은 정수형으로 변환한 결과는 환경에 따라 달라질 수 있으므로 그 출력에 의존하는 코드가 잘못된 것입니다.

잘못된 접근문제의 원인교정 방법
short에 32768을 저장하고 특정 음수를 기대저장 가능한 범위를 넘는 값을 좁은 형에 넣음필요 범위를 담는 int 등 더 넓은 형 선택
초기화하지 않은 sum에 계속 더함첫 연산이 알 수 없는 기존값을 읽음누적 시작값인 0으로 선언과 동시에 초기화
자료형 표의 바이트 수를 모든 시스템에 고정 적용대표 구현값과 언어의 보장 규칙을 혼동sizeof와 표준 헤더의 한계 매크로로 확인
int sum = 0;

for (int i = 1; i <= 10; i++) {
    sum = sum + i;
}

printf("%d\n", sum);

누적 과정은 0→1→3→6→…→55로 진행됩니다. sum을 초기화하지 않으면 강의 화면에 나온 32819 같은 값이 언제나 나오는 것이 아니라 결과 자체를 신뢰할 수 없습니다. 초기화는 특정 오답을 다른 숫자로 바꾸는 일이 아니라 계산의 출발 상태를 정의하는 일입니다.

선언 위치는 같은 이름이 가리키는 공간을 바꾼다

함수 바깥에 선언한 변수는 전역변수이고, 함수나 블록 안에 선언한 변수는 지역변수입니다. 서로 다른 함수의 지역변수는 이름이 같아도 별개의 기억공간입니다. 또한 안쪽 범위의 지역변수가 바깥 변수와 같은 이름을 사용하면, 그 안에서는 가까운 지역변수가 바깥 변수를 가립니다.

#include <stdio.h>

int level = 100;

void show(void) {
    int level = 200;
    printf("show: %d\n", level);
}

int main(void) {
    printf("main: %d\n", level);
    show();
    return 0;
}

main에서는 전역변수 100이 보이고, show에서는 지역변수 200이 보입니다. 지역변수가 전역변수의 값을 200으로 바꾼 것이 아닙니다. 동일한 이름이 서로 다른 공간을 가리키는 가림 현상입니다.

이름 추적법: 변수를 사용한 위치에서 가장 가까운 선언을 먼저 찾고, 그 선언이 속한 블록과 함수를 벗어나지 않는지 확인합니다.

선행처리는 컴파일러가 볼 소스 코드를 먼저 만든다

선행처리(preprocessing)는 컴파일 전에 원래 소스 프로그램을 가공하여 컴파일러가 번역할 소스를 만드는 과정입니다. 지시어는 #으로 시작하며 일반 C 문장처럼 끝에 세미콜론을 붙이지 않습니다.

지시어선행처리 결과확인할 점
#include헤더 파일의 내용을 포함어느 경로에서 파일을 찾는가?
#define매크로 이름을 정해진 텍스트로 치환치환 뒤 연산 순서가 의도와 같은가?
#undef앞서 정의한 매크로를 해제해제 이후 이름이 더는 확장되지 않음
#if·#elif·#else·#endif조건에 맞는 코드만 컴파일 입력에 포함조건을 선행처리 시점에 판단할 수 있는가?

선행처리기는 프로그램이 실행된 뒤 분기하는 장치가 아닙니다. 실행 파일을 만들기 전에 코드의 포함 여부와 치환을 결정합니다. 그래서 조건부 컴파일의 조건에는 실행 중에야 알 수 있는 변수값이나 함수 호출을 직접 사용할 수 없습니다.

#include의 괄호 모양은 헤더를 찾는 출발점을 알려 준다

#include는 지정한 헤더 파일의 내용을 소스에 포함하도록 지시합니다. 꺾쇠괄호와 큰따옴표 형식은 검색 출발점이 다릅니다.

#include <stdio.h>
#include "project.h"
#include "sub/option.h"
  • <stdio.h>처럼 꺾쇠괄호를 쓰면 표준 헤더를 찾는 경로에서 검색합니다.
  • "project.h"처럼 큰따옴표를 쓰면 현재 작업 위치나 직접 지정한 경로를 우선 고려합니다.
  • "sub/option.h"는 하위 경로까지 명시한 프로젝트 헤더의 예입니다.

포함은 함수 호출이 아니라 컴파일 전 소스 구성입니다. 따라서 헤더 안의 선언이 선행처리 결과에 들어오고, 컴파일러는 그 결과를 번역합니다.

매크로는 함수처럼 보여도 텍스트 치환으로 작동한다

매크로는 특정 코드 패턴으로 치환되도록 정의한 이름입니다. 매크로 상수는 값에 이름을 붙이고, 함수형 매크로는 인수를 수식에 끼워 넣습니다. #undef는 매크로 정의를 해제합니다.

#define PI 3.141592
#define C_AREA(x) (PI * (x) * (x))

double area = C_AREA(5.0 + 5.0);

#undef PI

C_AREA(5.0 + 5.0)는 (3.141592 * (5.0 + 5.0) * (5.0 + 5.0))로 확장되어 314.1592를 만듭니다. 인수 주위의 괄호를 빼면 다음처럼 전혀 다른 연산식이 될 수 있습니다.

#define BAD_AREA(x) (3.141592 * x * x)

/* BAD_AREA(r + 5)의 확장 */
(3.141592 * r + 5 * r + 5)

r이 5라면 잘못된 확장은 15.70796 + 25 + 5 = 45.70796이 됩니다. 의도한 반지름 10의 원 넓이 314.1592와 크게 다릅니다. 매크로는 인수의 값을 계산해 함수에 전달하는 것이 아니라 수식의 글자를 끼워 넣으므로, 인수와 전체 수식에 괄호를 두어 연산 순서를 보호해야 합니다.

“호출 모양이 같으니 함수와 동일하게 계산된다”는 생각이 매크로 오류의 원인입니다. 매크로 문제는 이름을 실제 텍스트로 완전히 펼친 뒤 연산자 우선순위를 다시 읽어야 해결됩니다.

조건부 컴파일은 실행 분기가 아니라 소스 선택이다

#if, #elif, #else, #endif는 조건에 따라 컴파일할 코드를 선택합니다. 다음 예에서 DEBUG_MODE가 1이면 디버그 출력 문장이 컴파일 대상에 포함되고, 0이면 그 문장이 빠집니다.

#include <stdio.h>
#define DEBUG_MODE 1

int main(void) {
    int a = 14;
    int b = 22;

#if DEBUG_MODE
    printf("입력: %d, %d\n", a, b);
#endif

    printf("평균: %.1f\n", (a + b) / 2.0);
    return 0;
}

DEBUG_MODE가 1이면 입력과 평균 18.0이 함께 출력됩니다. 0으로 바꾸면 평균 계산 코드는 그대로 남고 디버그 출력만 컴파일 대상에서 제외됩니다. 실행 중 if문은 실행 파일 안에서 조건을 검사하지만, #if는 실행 파일을 만들기 전에 어느 소스 문장을 남길지 정한다는 차이가 있습니다.

짧은 코드를 세 단계로 펼치면 오류 위치가 보인다

자료형·변수·선행처리기가 함께 나온 코드는 다음 순서로 점검할 수 있습니다.

  1. 선행처리 단계: 헤더가 어디서 포함되고, 매크로가 어떤 텍스트로 확장되며, 어떤 조건부 코드가 남는지 적습니다.
  2. 컴파일 단계: 각 상수와 변수의 자료형, 표현 범위, 연산에 필요한 변환을 확인합니다.
  3. 실행 단계: 변수가 선언된 범위와 초기값을 찾고, 문장 순서에 따라 값의 변화를 추적합니다.

예를 들어 매크로 계산값이 이상하면 변수부터 고치기 전에 확장식을 확인합니다. 누적합이 실행마다 달라지면 매크로가 아니라 초기화를 확인합니다. 같은 이름의 출력이 함수마다 다르면 자료형보다 선언 위치와 가림을 확인합니다. 이렇게 처리 단계를 분리하면 서로 비슷해 보이는 오류를 원인별로 좁힐 수 있습니다.

최종 진단표: 치환이 잘못되었는가 → 형과 범위가 맞는가 → 올바른 기억공간을 보고 있는가 → 첫 사용 전에 값이 정해졌는가.

핵심 개념 정리

  • 자료형은 값의 비트 표현, 필요한 기억공간, 허용되는 연산을 함께 정합니다.
  • 정수형의 실제 크기와 범위는 대표 표를 암기하기보다 sizeof, <limits.h>로 확인합니다.
  • 열거형은 이름과 정수값을 연결하며 명시한 값 다음부터 다시 1씩 증가합니다.
  • 상수의 진법은 접두사, 자료형은 접미사, 문자와 문자열은 따옴표 종류로 판별합니다.
  • 변수는 크기·선언 위치·초기화를 함께 설계해야 범위 초과, 가림, 미정값 사용을 피할 수 있습니다.
  • 선행처리기는 컴파일 전에 헤더 포함, 매크로 치환, 조건부 코드 선택을 수행합니다.
  • 함수형 매크로는 텍스트 치환이므로 인수와 전체 식의 괄호를 통해 연산 순서를 보호합니다.

C 코드를 읽을 때는 눈앞의 실행 결과부터 추측하지 말고 ‘선행처리된 문장 → 자료형과 표현 범위 → 변수의 선언 위치와 초기값 → 실행 중 값 변화’의 순서로 펼치세요. 이 순서는 다음 차시의 입출력 함수와 연산자를 배울 때도 형식 지정, 피연산자 자료형과 계산 결과를 추적하는 기반이 됩니다.

예상문제 10선

1. C 언어에서 자료형이 결정하는 내용을 가장 정확히 묶은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 이름은 명칭 규칙의 문제이며 자료형은 그 이름이 가리키는 값의 표현과 연산을 정합니다.
  • ② 오답: 주석과 헤더 검색은 소스 구성 및 선행처리의 영역이지 자료형의 기능이 아닙니다.
  • ③ 정답: 자료형의 세 핵심 역할인 표현 규칙, 저장 공간, 허용 연산을 모두 포함합니다.
  • ④ 오답: 매크로 치환과 조건부 코드 선택은 선행처리기가 담당합니다.

2. 정수형의 크기와 범위를 이식성 있게 확인하는 접근으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 실행 환경에서의 실제 크기와 구현이 제공하는 최소·최대값을 각각 확인하는 방법입니다.
  • ② 오답: 4바이트는 대표 환경의 값일 수 있지만 C 언어가 모든 구현에 고정한 값은 아닙니다.
  • ③ 오답: 명칭의 문자 수는 변수가 저장할 수 있는 값의 범위와 관련이 없습니다.
  • ④ 오답: 출력 폭은 표시 형식이며 실제 메모리 크기나 값의 범위를 증명하지 않습니다.

3. enum fruit { APPLE, PEAR, MANGO = 4, GRAPE };에서 GRAPE의 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 값을 별도로 지정하지 않았다면 세 번째 이름의 값이 2이지만 MANGO에 4를 명시했습니다.
  • ② 오답: 단순한 선언 순서만 세어 명시적으로 지정된 4를 반영하지 않았습니다.
  • ③ 오답: 4는 MANGO의 값이며 다음 열거 이름은 그보다 1 큰 값을 받습니다.
  • ④ 정답: MANGO가 4로 재지정되었으므로 바로 다음 GRAPE는 5가 됩니다.

4. 문자 상수 'A'와 문자열 상수 "A"의 결정적 차이는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 문자열은 종결용 널 문자를 포함하지만 한 문자 상수와 같은 저장 구조로 보지 않습니다.
  • ② 정답: 작은따옴표와 큰따옴표가 각각 문자 한 개와 널 종결 문자열을 구분합니다.
  • ③ 오답: 따옴표의 차이를 실수형과 열거형의 차이로 잘못 연결했습니다.
  • ④ 오답: 둘은 소스에 직접 적은 상수 표현이며 선언 위치나 매크로 여부를 뜻하지 않습니다.

5. 지역변수 sum으로 1부터 10까지 누적하려 할 때 선언으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 초기화 전에 값을 읽으면 누적 계산의 시작 상태가 정해지지 않아 결과를 신뢰할 수 없습니다.
  • ② 오답: '0'은 정수 0이 아니라 숫자 문자의 코드값이므로 누적 시작값과 다릅니다.
  • ③ 오답: 매크로는 저장공간이 아닌 텍스트 치환이므로 실행 중 누적값을 보관할 변수가 될 수 없습니다.
  • ④ 정답: 정수 합을 담을 공간을 만들고 덧셈의 시작값 0을 첫 사용 전에 저장합니다.

6. 전역변수 int value=10;이 있고 함수 안에 int value=20;을 선언했다. 함수 안에서 value를 출력하면?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 사용 위치에서 가장 가까운 지역 선언이 선택되어 함수 안에서는 20을 가진 공간을 참조합니다.
  • ② 오답: 같은 이름은 변수 선택 규칙에 영향을 줄 뿐 두 값을 자동 계산하지 않습니다.
  • ③ 오답: 두 선언은 별도 기억공간을 만들며 지역변수의 초기화가 전역변수 값을 바꾸지 않습니다.
  • ④ 오답: 서로 다른 유효 범위에서는 같은 이름을 사용할 수 있으며 안쪽 선언이 바깥 이름을 가립니다.

7. #define LIMIT 10을 사용한 프로그램이 처리되는 흐름으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 매크로는 실행 중 만들어지는 변수가 아니며 치환은 컴파일 전에 일어납니다.
  • ② 오답: 선행처리는 컴파일보다 앞이고 매크로 확장은 함수 호출 방식이 아닙니다.
  • ③ 정답: 선행처리가 텍스트를 바꾼 결과를 컴파일러가 입력으로 받아 번역합니다.
  • ④ 오답: 링커의 결합 작업과 선행처리기의 텍스트 치환 및 조건 판정을 뒤섞었습니다.

8. 프로젝트의 현재 폴더에 있는 config.h를 포함하는 표현으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: #define은 매크로 정의에 쓰며 헤더 내용을 포함하지 않습니다.
  • ② 정답: 큰따옴표 형식은 프로젝트의 현재 위치나 지정 경로에서 헤더를 찾는 용도에 맞습니다.
  • ③ 오답: #include 뒤에 대입 기호와 세미콜론을 사용하는 문법이 아닙니다.
  • ④ 오답: 헤더 포함은 함수 호출이 아니라 #으로 시작하는 선행처리 지시어입니다.

9. #define SQUARE(x) ((x) * (x))일 때 SQUARE(3 + 2)의 확장 결과값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 인수 괄호가 없는 x*x에 3+2를 단순 치환했을 때 생길 수 있는 우선순위 착각입니다.
  • ② 정답: ((3 + 2) * (3 + 2))로 확장되므로 5×5=25입니다.
  • ③ 오답: 한쪽 인수만 괄호로 보호한 잘못된 확장을 가정한 값입니다.
  • ④ 오답: 3+2를 계산한 뒤 제곱하지 않고 두 번 더한 것으로 잘못 해석했습니다.

10. 디버그 출력만 제품용 실행 파일에서 제외하고 평균 계산은 유지하려 한다. 가장 적절한 방법은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 자료형 변경은 디버그 문장의 컴파일 포함 여부를 제어하지 않고 계산 범위만 바꿉니다.
  • ② 오답: 문자열 종결 방식은 출력 코드가 실행 파일에 들어갈지를 선택하지 않습니다.
  • ③ 오답: 이름 가림은 변수 선택을 복잡하게 만들 뿐 조건부로 코드를 제거하지 않습니다.
  • ④ 정답: 조건부 컴파일은 선행처리 단계에서 디버그 문장만 선택적으로 포함하거나 제외하면서 나머지 계산을 유지합니다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 자료형 확인 절차, 코드 처리 단계, 매크로 확장 계산과 오류 교정 예제는 학습자의 이해를 돕기 위해 직접 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 C프로그래밍 2강 「자료형과 선행처리기」 강의자료(2025)
  • 보충 자료: 외부 자료를 사용하지 않고 해당 차시 강의자료의 범위 안에서 재구성
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-09-06

댓글