프로그램의 작성 순서 정리
1. 프로그램 기본 작성 흐름
일반적인 프로그램의 흐름은 다음과 같습니다.
→ ② 입력
→ ③ 데이터 가공(연산)
→ ④ 출력
단계별 설명
| 데이터 저장 공간 확보 | 변수, 배열 등을 선언하여 메모리 공간 확보 | int a;, int arr[10]; |
| 입력 | 사용자로부터 데이터 입력 | scanf() |
| 데이터 가공 | 연산자 및 계산 수행 | +, -, *, / |
| 출력 | 결과를 화면에 출력 | printf() |
예시 코드
int main() {
int a, b, sum; // ① 저장 공간 확보
scanf("%d %d", &a, &b); // ② 입력
sum = a + b; // ③ 가공
printf("%d", sum); // ④ 출력
return 0;
}
제어문(Control Statement)
프로그램은 위에서 아래로 순차적으로 실행됩니다.
하지만 조건에 따라 실행 여부가 달라질 때 제어문을 사용합니다.
제어문의 종류
| 선택문 | if, switch~case | 조건에 따라 실행문 선택 |
| 반복문 | while, for, do~while | 조건이 참인 동안 반복 |
| 분기문 | break, continue, goto, return | 실행 흐름을 변경 |
1. 선택문 (if 계열)
1) 기본 if문
사용 목적
- 하나의 조건을 판단할 때 사용
구조
실행문;
}
특징
- 조건이 참일 때만 실행
- 실행문이 2개 이상이면 반드시 {} 사용
- 가독성을 위해 항상 중괄호 사용 권장
2) if ~ else문
사용 목적
- 두 가지 중 하나를 반드시 선택해야 할 때 사용
구조
실행문1;
} else {
실행문2;
}
보완 설명
- else에는 조건식이 없다.
- 둘 중 하나는 반드시 실행된다.
- 조건은 한 번만 검사된다 → 효율적
왜 if를 두 번 쓰지 말아야 할까?
printf("양수");
}
if (a <= 0) {
printf("0 또는 음수");
}
문제점:
- 조건을 두 번 검사
- 조건식이 정확하지 않으면 두 개 모두 실행될 수 있음
따라서 둘 중 하나 선택이라면 반드시 if ~ else 사용
3) if ~ else if ~ else문
사용 목적
- 3가지 이상 중 하나를 선택할 때
구조
실행문1;
}
else if (조건2) {
실행문2;
}
else {
실행문3;
}
중요한 특징
- 조건을 위에서 아래로 차례로 검사
- 하나가 참이면 나머지는 검사하지 않음
- 순서가 매우 중요함
예시
printf("A");
}
else if (score >= 80) {
printf("B");
}
else {
printf("C");
}
조건식 작성 시 주의사항
| 순서 중요 | 위 조건이 먼저 참이 되면 아래는 검사 안 함 |
| 중복 조건 피하기 | 논리적 흐름에 맞게 작성 |
| 가능성 높은 조건 먼저 | 검사 횟수 줄여 성능 향상 |
| 항상 중괄호 사용 | 실수 방지 |
제어문 핵심 정리표
| 1가지 실행 여부 판단 | if | 조건이 참일 때만 실행 |
| 2가지 중 하나 선택 | if ~ else | 반드시 하나 실행 |
| 3가지 이상 중 하나 선택 | if ~ else if ~ else | 위에서부터 순차 검사 |
제어문 전체 구조 요약표
| 선택문 | if | X | 1개 | 단일 조건 판단 |
| 선택문 | if~else | X | 1개 | 2가지 중 선택 |
| 선택문 | if~else if | X | 여러 개 | 다중 조건 선택 |
| 반복문 | for | O | 1개 | 횟수 반복 |
| 반복문 | while | O | 1개 | 조건 반복 |
| 반복문 | do~while | O | 1개 | 최소 1번 실행 |
| 분기문 | break | X | - | 반복 탈출 |
| 분기문 | continue | X | - | 다음 반복으로 |
| 분기문 | return | X | - | 함수 종료 |
핵심 포인트 정리
- 프로그램은 기본적으로 순차 실행된다.
- 조건에 따라 실행을 제어할 때 제어문을 사용한다.
- if는 1가지 판단
- if~else는 2가지 중 선택
- if~else if~else는 3가지 이상 중 선택
- 조건식의 순서가 매우 중요하다.
- 항상 중괄호를 사용하는 습관을 들인다.
if문 활용과 switch ~ case문 정리
1. if ~ else문은 하나의 문장이다
if ~ else문은 내부 실행문이 여러 줄이어도 전체가 하나의 제어문으로 취급됩니다.
printf("양수\n");
printf("입니다.\n");
} else {
printf("음수 또는 0\n");
}
위 구조 전체가 하나의 문장입니다.
2. if문 중첩 (Nested if)
1) 개념
if문 안에 또 다른 if문을 사용하는 것을 if문 중첩이라고 합니다.
if (조건2) {
실행문;
}
}
2) 왜 사용하는가?
① 선행조건이 있을 때
어떤 조건을 검사하기 전에 반드시 확인해야 할 조건이 있는 경우 사용합니다.
예시:
if (score >= 60) {
printf("합격");
}
}
→ 점수가 유효 범위인지 먼저 검사
→ 그 다음 합격 여부 판단
불필요한 검사를 줄일 수 있습니다.
② 실행 효율을 높이기 위해
범위를 나눈 후 다시 세부 비교를 하면 평균 검사 횟수를 줄일 수 있습니다.
예:
if (num < 25) {
// 처리
} else {
// 처리
}
} else {
if (num < 75) {
// 처리
} else {
// 처리
}
}
이처럼 나누어 검사하는 방식은
분할 정복 방식과 유사한 구조입니다.
조건이 많을수록 효율 개선 효과가 있습니다.
3) 중첩 if 사용 시 주의점
| 가독성 저하 | 들여쓰기 깊어질수록 읽기 어려움 |
| 논리 오해 가능 | 선행조건이 꼭 필요한 것처럼 보일 수 있음 |
| 복잡성 증가 | 유지보수 어려움 |
3. else 결합 문제 (Dangling else 문제)
C에서는 실행문이 한 줄이면 중괄호 {}를 생략할 수 있습니다.
if (b > 0)
printf("양수");
else
printf("음수");
이 코드는 다음과 같이 해석됩니다:
if (b > 0)
printf("양수");
else
printf("음수");
}
즉, else는 가장 가까운 if와 결합됩니다.
원래 의도와 다르게 동작할 수 있으므로
중첩 구조에서는 반드시 중괄호 사용 권장
4. switch ~ case문
1) 개념
여러 개의 정수 값 중 하나를 선택하여 실행할 때 사용하는 제어문입니다.
2) 기본 구조
case 상수1:
실행문;
break;
case 상수2:
실행문;
break;
default:
실행문;
}
3) 사용 조건
| 조건식 | 반드시 정수식 |
| case 값 | 정수 상수만 가능 |
| default | 생략 가능 |
사용 가능한 것:
- 정수형 변수
- 정수 상수
- 정수 연산 결과
사용 불가:
- 실수
- 문자열
- 범위 조건
5. break의 역할
break는 해당 case 블록을 탈출합니다.
break가 있는 경우
case 1:
printf("1");
break;
case 2:
printf("2");
break;
}
→ 해당 case만 실행
break가 없는 경우 (fall-through)
case 1:
printf("1");
case 2:
printf("2");
}
num이 1이면:
2
아래 case까지 계속 실행됩니다.
break 사용 원칙
| 일반 다중 선택 | 반드시 사용 |
| 의도적 fall-through | 제한적으로 사용 |
| 생략 시 | 반드시 주석으로 설명 |
6. default의 위치
default는 switch 블록 안 어디에 있어도 됩니다.
default:
printf("기타");
break;
case 1:
printf("1등");
break;
}
동작에는 문제 없습니다.
하지만 보통은 맨 마지막에 작성하여 예외 상황 처리에 사용합니다.
7. switch vs if 비교
| 조건 종류 | 모든 조건식 가능 | 정수값만 가능 |
| 범위 검사 | 가능 | 부적합 |
| 가독성 | 복잡해질 수 있음 | 값 비교에 적합 |
| break 필요 | 필요 없음 | 필요 |
핵심 요약 정리표
| if 중첩 | if 안에 if 사용 |
| 중첩 목적 | 선행조건 검사 / 실행 효율 개선 |
| else 결합 문제 | else는 가장 가까운 if에 결합 |
| switch | 정수 값 비교에 사용 |
| case | 정수 상수만 가능 |
| break | 블록 탈출, 일반적으로 필수 |
| fall-through | break 생략 시 아래 case 실행 |
| default | 예외 처리, 위치 자유 |
전체 개념 흐름 요약
- if문 중첩은 조건을 단계적으로 검사할 때 사용한다.
- 가독성 저하에 주의해야 한다.
- else는 항상 가장 가까운 if와 결합한다.
- switch는 정수값 기반 다중 선택에 적합하다.
- break는 대부분 반드시 필요하다.
- default는 예외 처리를 위해 사용한다.
출처 : 혼자 공부하는 C언어