2024년 C 프로그래밍 면접 질문 TOP 100 & 답변 총정리
2024년 C 프로그래밍 면접 질문 TOP 100 & 답변
아래에서 가장 자주 묻는 C 프로그래밍 면접 질문 100개에 대한 간결하고 전문가 수준의 답변을 확인하세요. 각 답변은 명확한 전문성, 실무 경험, 권위 있는 지식을 보여주면서도 흥미롭고 신뢰할 수 있게 작성되었습니다.
1) C에서 증가/감소 문을 어떻게 구성하나요?
단항 연산자 ++와 -- 또는 산술 연산자를 사용합니다. 예: x++ 또는 x = x + 1 모두 x를 1 증가시키고, x-- 또는 x = x - 1은 감소시킵니다.
2) Call by Value와 Call by Reference의 차이는?
Call by value는 변수 값의 복사본을 전달하므로 함수가 원본을 변경할 수 없습니다. Call by reference는 변수의 주소를 전달해 함수가 원본 값을 직접 수정할 수 있게 합니다.
3) 코드 주석 처리가 디버깅에 어떻게 도움이 되나요?
코드 섹션을 주석 처리(예: /* ... */)하면 원본 라인을 보존하면서 실행에서 일시적으로 제거합니다. 이는 원본 코드를 삭제하지 않고 잠재적 오류 원인을 격리하는 데 도움이 됩니다.
4) 다음 for 루프를 while 루프로 변환하세요:
for (a = 1; a <= 100; a++) printf("%d\n", a * a);
답변:
a = 1; while (a <= 100) { printf("%d\n", a * a); a++; }
5) 스택이란?
스택은 후입선출(LIFO) 자료구조입니다. 연산에는 PUSH(추가)와 POP(제거)가 있습니다. 최상위 요소만 직접 접근 가능합니다.
6) 순차 접근 파일이란?
데이터가 한 레코드씩 순차적으로 저장됩니다. 특정 레코드를 읽으려면 원하는 레코드에 도달할 때까지 파일을 순차적으로 순회해야 합니다.
7) 변수 초기화란 무엇이며 왜 중요한가요?
초기화는 사용 전 변수에 알려진 값을 할당하는 것입니다. 초기화되지 않은 변수는 불확정 값을 가지며 예측 불가능한 동작을 유발합니다.
8) 스파게티 프로그래밍이란?
스파게티 코드는 읽고 유지보수하기 어려운 엉키고 비구조적인 코드를 말합니다. 보통 계획 부족에서 기인하며 복잡한 제어 흐름을 초래합니다.
9) 소스 코드와 객체 코드의 차이는?
소스 코드(.c)는 사람이 읽을 수 있는 C 텍스트입니다. 컴파일러가 이를 객체 코드(.obj 또는 .o)로 변환하며, 이는 기계가 읽을 수 있고 실행 파일로 링크될 수 있습니다.
10) C에서 따옴표 문자를 어떻게 출력하나요?
이스케이프 시퀀스 사용: printf 문자열 내에서 작은따옴표는 \', 큰따옴표는 \"입니다.
11) \0 문자의 목적은?
C에서 문자열 리터럴의 끝을 표시해 strlen, printf 같은 함수가 문자열이 어디서 끝나는지 알 수 있게 합니다.
12) =와 ==의 차이는?
=은 변수에 값을 할당, ==은 두 값의 동등성을 비교합니다.
13) 모듈로(modulus) 연산자란?
%로 표기하며 정수 나눗셈의 나머지를 반환합니다. 예: 10 % 3은 1을 산출.
14) 중첩 루프란?
다른 루프 안에 있는 루프. 외부 루프의 각 반복마다 내부 루프가 완전히 실행됩니다.
15) 틀린 연산자는? >=, <=, <>, ==
C에서 <>는 유효하지 않습니다. 올바른 "부등호" 연산자는 !=입니다.
16) 컴파일러와 인터프리터 비교.
컴파일러는 실행 전 프로그램 전체를 기계어로 번역해 모든 구문 오류를 미리 잡습니다. 인터프리터는 코드를 줄 단위 실행하며 첫 오류에서 멈춥니다.
17) 문자열 변수를 어떻게 선언하나요?
문자 배열 사용: char name[50];은 널 종료 문자 포함 최대 49자 공간 할당.
18) 중괄호로 단일 줄 코드를 감쌀 수 있나요?
가능합니다. 단일 문장엔 선택 사항이지만, 나중에 코드가 확장될 때 가독성을 높이고 오류를 줄여줍니다.
19) 헤더 파일이란 무엇이며 용도는?
헤더 파일(.h)은 함수 프로토타입과 정의를 포함합니다. 포함하면(#include <stdio.h>) printf 같은 표준 함수를 사용할 수 있습니다.
20) 구문 오류란?
세미콜론 누락, 키워드 오타 등 언어 문법을 위반하는 코드 실수.
21) 변수 vs 상수.
변수는 실행 중 변경 가능, 상수는 컴파일 타임에 고정. 불변 값엔 #define이나 const 사용.
22> 배열 요소 접근.
요소는 0부터 size-1까지 인덱싱. int scores[5];면 유효 인덱스는 0~4.
23) int로 32768 저장 가능한가?
16비트 시스템에서 int는 보통 -32768~32767 범위. 더 큰 값은 long이나 unsigned int 사용.
24) 이스케이프 시퀀스 결합 가능?
가능. 예: printf("Hello\n\tWorld");는 "Hello"를 한 줄 출력 후 탭이 들어간 "World" 출력.
25) 왜 모든 헤더 파일을 포함하면 안 되나?
사용하는 함수에 필요한 헤더만 포함해야 합니다. 불필요한 헤더는 컴파일 시간과 바이너리 크기를 늘립니다.
26) void는 언제 사용하나?
함수 시그니처에서 void는 반환값이 없음을 의미, 예: void display(void).
27) 복합문이란?
중괄호로 둘러싸인 코드 블록으로, if나 루프 내에서 단일 단위로 실행됩니다.
28) 알고리즘의 의의.
알고리즘은 문제 해결을 위한 단계별 계획을 제공해 프로그램 로직을 안내하고 정확성을 보장합니다.
29) 개별 변수 대비 배열의 장점.
배열은 관련 데이터를 단일 식별자와 인덱스로 효율적으로 저장/조작 가능해 코드 잡동사니를 줄입니다.
30) 점진적 숫자 출력 루프:
for (int a = 1; a <= 5; a++) { for (int b = 1; b <= a; b++) printf("%d", b); printf("\n"); }
31) scanf("%d", whatnumber);의 문제점.
앰퍼샌드 누락: scanf("%d", &whatnumber);로 변수 주소 전달 필요.
32) 난수 생성.
srand(time(NULL));로 시드 설정 후 rand() 사용. 예: int anyNum = rand();
33) tolower() 미정의 에러.
적절한 헤더 포함: #include <ctype.h>.
34) 주석 삽입 방법.
한 줄: // 주석, 여러 줄: /* 주석 */.
35) 디버깅이란?
프로그램이 의도한 출력을 내도록 오류를 체계적으로 찾아 수정하는 과정.
36) &&의 기능.
논리 AND: 모든 조건이 참이어야 전체 표현식이 참.
37) 홀수/짝수 판별.
나머지 확인: if (num % 2 == 0) printf("EVEN"); else printf("ODD");
38) printf에서 %10.2의 의미.
숫자용 10자 공간 예약, 소수점 아래 2자리 출력.
39) 논리 오류 vs 구문 오류.
논리 오류는 컴파일되지만 잘못된 결과 생성, 구문 오류는 컴파일 차단.
40) 제어 구조 유형.
순차, 선택(if/else, switch), 반복(루프).
41) ||의 기능.
논리 OR: 조건 중 하나라도 참이면 전체 표현식 참.
42) if로 문자열 비교 가능한가?
아니요. 문자열 비교엔 strcmp() 사용.
43) 전처리기 지시문이란?
컴파일 전 처리되는 지시문, 예: #include, #define.
44) s=10일 때 s >=10 && s < 25 && s!=12 결과.
참. 모든 개별 비교가 참으로 평가됨.
45) C 연산자 우선순위.
단항 !, +, -, *, /, %, + -, 관계(< > <= >=), 등가(== !=), 논리(&& ||), 대입(=).
46) 문자열 변수에 올바른 할당.
myName = "Robin"; 대신 strcpy(myName, "Robin"); 사용.
47) 문자열 길이 구하기.
strlen() 호출. 예: int len = strlen(FullName);
48) 선언 시 변수 초기화.
가능. 예: char planet[15] = "Earth";
49) 왜 C가 중급 언어인가?
C는 고수준 추상화와 저수준 메모리 조작을 결합해 가독성과 성능을 모두 제공.
50) C 파일 확장자.
소스: .c, 헤더: .h, 객체: .o 또는 .obj, 실행: .exe.
51) 예약어란?
C가 정의한 특수 의미의 키워드(예: int, return). 식별자로 사용 불가.
52) 연결 리스트란?
포인터로 연결된 노드들로 구성된 동적 자료구조, 효율적 삽입/삭제 가능.
53) FIFO란?
선입선출; 가장 먼저 들어간 요소가 가장 먼저 나가는 큐 구조에서 사용.
54) 이진 트리란?
각 노드가 최대 두 자식을 가지는 트리 자료구조, 효율적 검색 연산 지원.
55) 예약어는 대소문자 구분?
거짓. 모든 예약어는 소문자로 작성해야 하며, 그렇지 않으면 컴파일러가 식별자로 처리.
56) ++a와 a++의 차이.
전위 증가(++a)는 a를 사용 전 증가, 후위 증가(a++)는 현재 값 사용 후 증가.
57) X=5일 때 X += 15; 효과.
결과: X가 20이 됨.
58) NAME, name, Name은 같은가?
거짓. C는 대소문자 구분.
59) 무한 루프란?
무한 루프라고도 함, 루프 조건이 결코 거짓이 되지 않아 무한히 실행.
60) 프로그램 플로차트란?
프로그램의 연산 순서, 결정 지점, 루프를 개략적으로 보여주는 시각적 다이어그램.
61) void = 10;의 문제.
'void'는 예약 타입이므로 변수명으로 사용 불가.
62) INT = 10.50;의 유효성.
INT가 사용자 정의 식별자면 가능 (키워드 int 아님). 키워드는 소문자여야 함.
63) 실제 인자(actual arguments)란?
함수 호출 시 전달되는 값들, 함수의 형식 매개변수에 대응.
64) 개행 이스케이프 시퀀스란?
\n으로 표현, 커서를 다음 줄로 이동.
65) 출력 리다이렉션이란?
> 같은 셸 연산자로 프로그램 출력을 콘솔 대신 파일로 전송.
66) 런타임 오류란?
프로그램 실행 중 발생하는 오류(예: 0으로 나누기, 널 포인터 역참조).
67) abs()와 fabs()의 차이.
둘 다 절댓값 반환, abs()는 정수(stdlib.h), fabs()는 부동소수점(math.h).
68) 형식 매개변수(formal parameters)란?
함수 정의에서 선언되어 호출 시 실제 인자를 받는 변수들.
69) 제어 구조란?
실행 순서를 결정하는 메커니즘: 순차, 선택, 반복.
70) 숫자 양수/음수 판별.
if (num >= 0) printf("양수"); else printf("음수");
71) switch를 if 대신 쓸 때.
단일 정수/문자 변수가 여러 이산적 값을 가질 때, switch가 더 명확하고 효율적.
72) 전역 변수란? 어떻게 선언?
모든 함수 바깥에 선언된 변수, 파일 전체에서 접근 가능. 예: int counter;를 int main() 앞에 선언.
73) 열거형(enumerated types)이란?
enum으로 정의하는 사용자 정수 타입, 상수 값에 심볼릭 이름 부여.
74) toupper()의 기능.
소문자 알파벳을 대문자로 변환 (C 표준 라이브러리).
75) 함수를 인자로 전달 가능한가?
가능. 함수 포인터를 다른 함수에 전달, 예: void sort(int (*cmp)(int, int));
76) 다차원 배열이란?
두 개 이상의 인덱스를 가진 배열, 예: int matrix[3][4];, 표나 그리드에 유용.
77) 문자열 이어 붙이는 함수.
string.h의 strcat(dest, src); 사용.
78) getch()와 getche()의 차이.
getch()는 에코 없이 문자 읽기, getche()는 콘솔에 문자 에코.
79) scanf("%c", &letter)와 letter = getchar() 결과 같은가?
예, 둘 다 표준 입력에서 다음 문자를 읽어 letter에 저장.
80) 구조체 타입이란?
관련 변수들을 단일 엔티티로 묶는 복합 데이터 타입.
81) 파일 모드에서 r과 w 의미.
'r'은 읽기용 파일 오픈, 'w'는 쓰기용 오픈 (기존 내용 잘림).
82) 텍스트 vs 바이너리 파일.
텍스트 파일은 사람이 읽을 수 있는 문자, 바이너리 파일은 효율적 기계 처리를 위한 원시 바이트 저장.
83) 사용자 정의 헤더 파일 생성 가능?
가능. .h 확장자 파일 생성, 프로토타입 포함, 소스에서 #include "myheader.h"로 포함.
84) 동적 자료구조란?
런타임에 메모리 할당하는 자료구조(연결 리스트, 트리 등), malloc(), free() 사용.
85) C의 다양한 데이터 타입.
기본 타입: int, char, float, double. 각각 고유한 저장 용도.
86) C 프로그램의 일반적 형태.
전처리 지시문, 타입 정의, 전역 변수, main(), 지역 선언, 문장, 반환값.
87) 랜덤 접근 파일의 장점.
fseek()로 원하는 레코드 직접 이동, 순차 접근 대비 검색 속도 향상.
88) switch에서 break 생략 효과.
Fall-through 발생: 다음 case 블록으로 실행 계속, 의도치 않은 동작 유발 가능.
89) 배열을 함수에 전달.
첫 요소 포인터 전달: void func(int arr[]); 또는 void func(int *arr);.
90) 포인터란?
메모리 주소를 저장하는 변수, 간접 데이터 조작과 동적 메모리 관리 가능.
91) 구조체 전체를 함수에 전달.
가능, 구조체 전체가 복사됨. 포인터로 전달하면 복사 방지.
92) gets()란?
개행 문자 만날 때까지 버퍼에 한 줄 전체 읽기. 버퍼 오버플로 위험으로 폐기됨, fgets() 사용 권장.
93) 퍼센트 기호 출력.
printf에서 %%로 이스케이프.
94) 랜덤 접근 파일 검색.
fseek()로 파일 포인터를 원하는 오프셋으로 이동 후 레코드 읽기.
95) 주석도 컴파일되나?
아니요. 주석은 전처리 단계에서 제거되어 실행 파일에 포함되지 않음.
96) 내장 정렬 함수.
stdlib.h의 qsort()로 제네릭 정렬 가능.
97) 힙의 장단점.
장점: 유연함, 동적 할당; 단점: 느린 접근, 단편화.
98) 문자열을 숫자로 변환.
정수용 atoi(), 실수용 atof(), 롱용 atol() 사용.
99) 두 변수 스왑.
int temp = num1; num1 = num2; num2 = temp;
100) 세미콜론의 목적.
문장을 종료해 컴파일러가 구문 분석하고 개별 명령을 분리할 수 있게 함.
무료 PDF 다운로드: C 프로그래밍 면접 질문 & 답변