Quick

    [C언어] 조건문

 

목록으로

안녕하세요! 미래의 소프트웨어 엔지니어를 꿈꾸는 학생 여러분, 그리고 열정적으로 코딩 교육을 이끌어주시는 강사님과 선생님들! 오늘 우리는 프로그래밍의 뇌(Brain)라고 불리는 아주 핵심적인 문법에 대해 깊이 있게 다루어 볼 예정입니다.

바로 C언어 프로그래밍 기초에서 결코 빠질 수 없는 '조건문'입니다. 컴퓨터가 스스로 상황을 판단하고 다르게 동작할 수 있도록 만드는 놀라운 마법, 지금부터 상세한 원리와 실습 코드를 통해 완벽하게 마스터해 보겠습니다.

■ 1. 알고리즘의 3대 제어 구조의 이해

모든 컴퓨터 프로그램의 뼈대가 되는 코딩 알고리즘은 크게 세 가지 기본 제어 구조로 이루어져 있습니다. 바로 순차구조, 선택구조, 반복구조입니다.

프로그램 코드는 기본적으로 위에서 아래로 한 줄씩 순서대로 실행되는 '순차구조'를 가집니다. 하지만 우리가 소프트웨어를 개발할 때, 항상 똑같은 길로만 갈 수는 없습니다. 사용자의 입력값이나 특정 센서의 데이터 값 등 주어진 상황(조건)에 따라서 실행해야 할 명령어를 다르게 결정해야 하는 순간이 반드시 찾아옵니다. 이때 프로그램의 흐름을 두 갈래, 혹은 세 갈래 이상으로 나누어주는 핵심적인 역할을 하는 것이 바로 오늘 배울 조건문(선택구조)입니다.

이후에 배우게 될 '반복구조' 역시 이러한 조건의 참(True)과 거짓(False)을 판단하여 반복 실행 여부를 결정하므로, 조건문의 완벽한 이해는 C언어 마스터를 위한 필수 관문이라고 할 수 있습니다.

■ 2. 조건문의 가장 기본 형태: If-else문 구조 분석

C언어 조건문에서 가장 기본적이고 널리 사용되는 형태는 바로 if-else문입니다. "만약(if) ~라면 A를 실행하고, 그렇지 않으면(else) B를 실행하라"는 인간의 자연스러운 논리적 사고방식과 가장 닮아있는 문법입니다. 학생들이 프로그래밍 논리를 처음 훈련할 때 가장 먼저 접하게 되는 실습 예제 코드를 함께 살펴보겠습니다.

#include

int main(void) {
int num = 0;
printf("숫자를 입력해주세요 : \n");
scanf("%d", &num);

// 조건식: num을 2로 나눈 나머지가 0과 같다면 (짝수 조건)
if(num % 2 == 0) {
printf("%d는 짝수입니다. \n", num); // 조건이 참(True)일 때 실행
} else {
printf("%d는 홀수입니다. \n", num); // 조건이 거짓(False)일 때 실행
}
return 0;
}

위 코드의 원리는 간단합니다. 먼저 scanf 함수를 통해 사용자로부터 숫자를 변수 num에 입력받습니다. 그리고 제어의 흐름이 if(num % 2 == 0) 이라는 조건식으로 진입하게 됩니다. 여기서 사용된 '%' 연산자는 나눗셈의 '나머지'를 구하는 매우 중요한 산술 연산자입니다.

입력받은 숫자를 2로 나누었을 때 나머지가 0과 완벽히 일치한다면 그 조건식은 '참(True)'이 되어 짝수를 출력하는 첫 번째 블록이 실행됩니다. 반대로 나머지가 1이 남는다면 조건식은 '거짓(False)'이 되어 else 블록으로 넘어가 홀수를 출력하게 됩니다. 코딩 강사님들께서 지도하실 때 주의점: 초보 학생들은 대입 연산자(=)와 수학적 같음을 의미하는 관계 연산자(==)를 자주 혼동하므로 이 부분을 확실히 짚어주시는 것이 좋습니다. 참고로 else 블록은 상황에 따라 생략이 가능합니다.

■ 3. 간결하고 빠른 코드 작성: 조건 연산자 (삼항 연산자)

앞서 배운 if-else 문을 단 한 줄의 코드로 우아하고 간결하게 압축할 수 있는 고급 문법이 있습니다. 바로 물음표(?)와 콜론(:) 기호로 이루어진 조건 연산자(삼항 연산자)입니다. 실무 개발 현장에서 변수에 값을 빠르고 간단하게 대입해야 할 때 매우 유용하게 쓰이는 기법입니다.

조건 연산자의 작동 원리는 직관적입니다. 맨 앞의 [조건식]을 먼저 평가한 후, 그 결과가 참(True)이면 콜론 기준 왼쪽의 [값1]을 반환하고, 거짓(False)이면 오른쪽의 [값2]를 반환하여 실행합니다. 아래 두 개의 숫자를 비교하는 실습 코드를 확인해 볼까요?

#include

int main(void) {
int x, y;
printf("숫자1을 입력해주세요 : \n");
scanf("%d", &x);
printf("숫자2를 입력해주세요 : \n");
scanf("%d", &y);

// 조건 연산자 활용 비교 연산
printf("큰 수 = %d \n", ( x > y ) x : y);
printf("작은 수 = %d \n", ( x < y ) x : y);
return 0;
}

■ 4. 다중 조건 분기의 최적화: Switch-case문 활용법

만약 프로그램 내에서 발생할 수 있는 선택지가 2가지를 넘어 3가지, 4가지 혹은 수십 가지로 늘어난다면 어떻게 코딩해야 할까요? 중첩된 else-if 문을 계속해서 이어나갈 수도 있겠지만, 코드가 길어질수록 가독성은 심각하게 떨어지게 됩니다. 이럴 때 다중 조건 분기를 가장 깔끔하고 효율적으로 처리할 수 있는 문법이 바로 switch-case 구문입니다.

#include

int main(void) {
int score = 0;
printf("시험 점수를 입력하세요 \n");
scanf("%d", &score);

// 정수형 나눗셈을 통해 10의 자리 숫자만 추출
switch(score / 10) {
case 10:
case 9:
printf("A등급 \n"); // 몫이 10이거나 9일 때 실행
break;
case 8:
printf("B등급 \n"); // 몫이 8일 때 실행
break;
case 7:
printf("C등급 \n"); // 몫이 7일 때 실행
break;
default :
printf("F등급 \n"); // 위의 case에 해당하지 않는 모든 경우
break;
}
return 0;
}

switch-case 문은 입력된 기준 값을 각 case의 라벨 값과 비교하여 일치하는 블록으로 곧바로 점프하는 매커니즘을 가집니다. 위 성적 산출 프로그램 코드를 분석해보면, 정수형(int) 변수의 특성을 매우 똑똑하게 활용했습니다. C언어에서 정수끼리의 나눗셈은 소수점 이하를 버립니다. 즉, 사용자가 95점을 입력하면 95/10의 결과는 9.5가 아니라 9가 되어 곧바로 case 9로 이동해 "A등급"을 출력하게 됩니다.

만약 학생이 65점을 입력했다면 어떻게 될까요? 계산된 몫은 6이 되지만 코드 내에 case 6은 존재하지 않습니다. 이처럼 어떠한 조건 값과도 일치하지 않는 예외 상황을 처리해 주는 안전장치가 바로 'default' 키워드입니다. 따라서 60점대 이하는 모두 default 문장으로 빠져 "F등급"을 출력하게 됩니다.

그리고 여기서 가장 주의해야 할 핵심 문법은 바로 'break' 키워드입니다. switch문은 case 조건이 맞아 블록 안으로 진입하면, 그 아래에 있는 모든 코드를 순차적으로 실행해 버리는 특성이 있습니다. 따라서 원치 않는 다음 case가 연달아 실행되는 것을 막고 조건문 블록 자체를 완전히 빠져나가게 하려면, 반드시 각 동작의 끝에 break를 명시적으로 작성해 주어야 합니다. 코딩 교육 시 학생들의 디버깅 에러 중 상당수가 이 break 누락에서 발생하므로 각별한 지도가 필요합니다.

지금까지 알고리즘 설계의 필수 관문인 C언어의 다양한 조건문(if-else, 삼항 연산자, switch-case)의 개념과 실습 코드에 대해 알아보았습니다. 조건문은 단순히 코드를 작성하는 것을 넘어, 문제 해결을 위한 논리적 사고력(컴퓨팅 사고력)을 기르는 가장 훌륭한 훈련 도구입니다. 눈으로만 읽지 마시고 직접 IDE 에디터를 켜서 예제 코드를 변형해 보며 타이핑해 보시길 강력히 권장합니다.

오늘 다룬 제어문의 흐름, 잘 이해가 되셨나요? 선택구조에 익숙해지셨다면 이제 동일한 동작을 수십, 수백 번 자동으로 처리하게 해주는 강력한 '반복문(Loop)'을 배울 준비가 끝난 것입니다. 다음 시간에는 더욱 흥미롭고 역동적인 반복문 실습 프로젝트로 여러분을 찾아오겠습니다. 계속해서 즐거운 코딩 학습 이어나가시길 바랍니다!

연관 컨텐츠

결제 및 주문

공지사항 목록