WEEK 01 / LECTURE 01

표현식과 흐름 제어

표현식과 흐름 제어

1. 전체 학습 흐름

자료형 변환
    ↓
조건식의 true / false
    ↓
if·switch로 선택
    ↓
while·for로 반복
    ↓
break·continue로 반복 제어
구분문법역할
선택if, if else, switch조건에 따라 실행할 코드 선택
반복while, do while, for조건을 만족하는 동안 코드 반복

2. 자료형 변환

서로 다른 자료형을 함께 계산하면 C++가 계산에 사용할 공통 자료형을 결정합니다.

int a = 5;
double b = 2.5;
auto c = a + b;

위 계산에서는 a가 double로 변환됩니다.

int 5 + double 2.5
        ↓
double 5.0 + double 2.5
        ↓
double 7.5
표현식처리결과
3 + 4.53을 double로 변환double 7.5
7 / 2두 값 모두 intint 3
7 / 2.07을 double로 변환double 3.5
static_cast<double>(7) / 27을 명시적으로 변환double 3.5

정수 승격

bool, char, short처럼 작은 정수형은 산술 계산에서 일반적으로 int로 승격됩니다.

bool / char / short
        ↓
       int

축소 변환

double pi = 3.14;
int number = pi;
3.14
 ↓ 소수 부분 손실
3
uint16_t x = 10000;
uint8_t y = x;  // uint8_t 범위를 벗어나 데이터 손실 가능

중괄호 초기화는 일부 축소 변환을 Compile 단계에서 막아줍니다.

int number{3.14};  // Compile Error

3. 부동소수점 오차

#include <iostream>
 
using namespace std;
 
int main() {
    float sum = 0.0f;
 
    for (int i = 0; i < 1000; i++) {
        sum += 0.1f;
    }
 
    cout << sum << endl;
    return 0;
}
0.1을 근삿값으로 저장
        ↓
1000번 반복해서 덧셈
        ↓
작은 오차가 누적될 수 있음

부동소수점 값은 상황에 따라 아주 작은 허용 오차를 두고 비교합니다.

#include <cmath>
 
double a = 0.1 + 0.2;
double b = 0.3;
 
bool same = abs(a - b) < 0.000001;

4. 논리 연산자

연산자의미결과가 true인 경우
A && BANDA와 B가 모두 참
A || BORA와 B 중 하나 이상이 참
!ANOTA가 거짓
int x = 5;
int y = !x;

C++에서 0은 거짓, 0이 아닌 값은 참으로 평가됩니다.

x = 5
5는 0이 아니므로 true
!true는 false
false를 int로 변환하면 0
 
최종 y = 0

5. 증감 연산자

x++;  // x를 1 증가
x--;  // x를 1 감소

단독 문장으로 사용하면 다음 코드와 같은 효과입니다.

x = x + 1;
x = x - 1;

전위와 후위

형식표현식에서의 동작
x++현재 값을 먼저 사용한 후 증가
++x먼저 증가한 후 증가한 값 사용
x--현재 값을 먼저 사용한 후 감소
--x먼저 감소한 후 감소한 값 사용
#include <iostream>
 
using namespace std;
 
int main() {
    int x = 5;
 
    cout << x++ << ' ';  // 5 출력 후 x는 6
    cout << ++x << endl; // x를 7로 만든 후 7 출력
 
    return 0;
}

실행 결과:

5 7

피해야 할 코드

int result = x++ + ++x;  // 피해야 함

증감은 별도 문장으로 분리하는 것이 안전하고 읽기 쉽습니다.


6. 복합 대입 연산자

복합 대입같은 의미
x += 3x = x + 3
x -= 3x = x - 3
x *= 3x = x * 3
x /= 3x = x / 3
x %= 3x = x % 3
int score = 80;
score += 10;

최종 결과:

score = 90

7. 주요 연산자 우선순위

1. ( )
2. ++  --
3. *  /  %
4. +  -
5. <  <=  >  >=
6. ==  !=
7. &&
8. ||
9. =

복잡한 표현식은 우선순위에만 의존하지 말고 괄호를 사용합니다.

bool canEnter = (age >= 18) && hasTicket;

8. if

if는 조건이 참일 때만 Block을 실행합니다.

if (condition) {
    // condition이 true일 때 실행
}

예:

int grade = 95;
 
if (grade >= 90) {
    cout << "A" << endl;
}

실행 흐름:

grade >= 90 계산
        ↓
true인가?
 ├─ Yes → Block 실행
 └─ No  → Block 건너뛰기

=와 == 구분

if (grade = 100)   // 대입: 잘못된 의도
if (grade == 100)  // 비교: 올바른 코드

grade = 100은 grade에 100을 저장합니다. 대입식의 결과 100은 0이 아니므로 조건이 참으로 평가됩니다.


9. if else와 else if

if else는 조건에 따라 두 경로 중 하나를 실행합니다.

if (score >= 60) {
    cout << "Pass" << endl;
} else {
    cout << "Fail" << endl;
}

여러 조건을 순서대로 검사할 때는 else if를 사용합니다.

char letterGrade;
int grade = 85;
 
if (grade >= 90) {
    letterGrade = 'A';
} else if (grade >= 80) {
    letterGrade = 'B';
} else if (grade >= 70) {
    letterGrade = 'C';
} else {
    letterGrade = 'F';
}

위에서부터 검사하여 처음 참이 된 분기 하나만 실행합니다. 따라서 더 높은 점수 조건을 먼저 작성해야 합니다.

grade >= 90 ?
 ├─ true  → A
 └─ false → grade >= 80 ?
              ├─ true  → B
              └─ false → 다음 조건

10. switch

switch는 하나의 값을 여러 case와 비교합니다.

switch (expression) {
    case value1:
        statements;
        break;
 
    case value2:
        statements;
        break;
 
    default:
        statements;
}

예:

#include <iostream>
 
using namespace std;
 
int main() {
    int menu = 2;
 
    switch (menu) {
        case 1:
            cout << "Start" << endl;
            break;
        case 2:
            cout << "Settings" << endl;
            break;
        default:
            cout << "Invalid menu" << endl;
    }
 
    return 0;
}

실행 결과:

Settings

break의 역할

break가 없으면 일치한 case 아래의 다음 case까지 계속 실행될 수 있습니다.

if와 switch

ifswitch
범위와 복합 조건에 적합하나의 값과 여러 상수를 비교할 때 적합
score >= 90menu == 1, menu == 2
자유로운 조건식 사용case에는 상수값 사용

11. while

while은 조건을 먼저 확인하고, 참인 동안 Block을 반복합니다.

while (condition) {
    statements;
}

예:

#include <iostream>
 
using namespace std;
 
int main() {
    int i = 1;
 
    while (i <= 3) {
        cout << i << ' ';
        i++;
    }
 
    return 0;
}

실행 결과:

1 2 3

실행 추적:

단계조건출력실행 후 i
시작1 <= 3 → true12
2회2 <= 3 → true23
3회3 <= 3 → true34
종료4 <= 3 → false없음4

무한 반복 주의

int i = 1;
 
while (i <= 3) {
    cout << i;
    // i++가 없으므로 조건이 계속 true
}

12. do while

do while은 본문을 먼저 실행하고 조건을 검사합니다. 따라서 본문이 최소 한 번 실행됩니다.

do {
    statements;
} while (condition);

예:

int i = 1;
 
do {
    cout << i << ' ';
    i++;
} while (i <= 3);

실행 결과:

1 2 3

while과 do while

whiledo while
조건을 먼저 검사본문을 먼저 실행
0회 실행 가능최소 1회 실행
선조건 반복후조건 반복
} while (condition);

13. break와 continue

Keyword반복문에서의 역할
break현재 반복문을 즉시 종료
continue현재 회차의 남은 코드를 건너뛰고 다음 반복 진행
for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue;
    }
 
    if (i == 5) {
        break;
    }
 
    cout << i << ' ';
}

실행 결과:

1 2 4

실행 과정:

i = 1 → 출력
i = 2 → 출력
i = 3 → continue → 출력 생략
i = 4 → 출력
i = 5 → break → 반복 종료

14. for

for는 반복 횟수를 제어할 때 주로 사용합니다.

for (initialization; condition; update) {
    statements;
}

실행 순서:

initialization — 처음 한 번
        ↓
condition
   ├─ false → 반복 종료
   └─ true
        ↓
       body
        ↓
      update
        └────→ condition으로 이동

예:

#include <iostream>
 
using namespace std;
 
int main() {
    for (int i = 1; i < 10; i++) {
        cout << i << ' ';
    }
 
    return 0;
}

실행 결과:

1 2 3 4 5 6 7 8 9

본문은 i가 1부터 9일 때 실행되므로 총 9회 실행됩니다.

감소 반복

for (int i = 10; i >= 0; i--) {
    cout << i << ' ';
}

홀수와 짝수 판별

for (int i = 1; i < 10; i++) {
    if (i % 2 == 1) {
        cout << i << " is odd" << endl;
    } else {
        cout << i << " is even" << endl;
    }
}
i % 2 == 0 → 짝수
i % 2 == 1 → 양의 홀수

무한 반복

for의 조건을 생략하면 항상 참으로 처리됩니다.

for (;;) {
    // 무한 반복
}

종료 조건과 break가 없다면 프로그램이 계속 반복됩니다.


15. 범위 기반 for

범위 기반 for는 Array나 Container의 각 요소를 순서대로 방문합니다.

#include <iostream>
#include <vector>
 
using namespace std;
 
int main() {
    vector<int> numbers = {1, 2, 3, 4};
 
    for (int number : numbers) {
        cout << number << ' ';
    }
 
    return 0;
}

실행 결과:

1 2 3 4
일반 for범위 기반 for
초기화·조건·갱신을 직접 작성각 요소를 자동으로 순회
Index 또는 횟수 제어에 적합모든 요소를 읽을 때 간결

요소를 복사하지 않고 읽기만 할 때는 다음 형식을 사용할 수 있습니다.

for (const int& number : numbers) {
    cout << number << ' ';
}

16. 반복문 선택 기준

상황적합한 반복문
반복 횟수가 명확함for
조건이 참인 동안 반복while
본문을 최소 한 번 실행do while
Container의 모든 요소 순회범위 기반 for

문법적으로 많은 for와 while을 서로 바꿀 수 있지만, 의도를 가장 명확하게 보여주는 반복문을 선택합니다.


17. 자주 하는 실수

대입과 비교 혼동

if (grade = 100)   // 대입
if (grade == 100)  // 비교

정수 나눗셈 착각

7 / 2    // 3
7 / 2.0  // 3.5

반복 변수 갱신 누락

int i = 0;
 
while (i < 10) {
    cout << i;
    // i++ 누락 → 무한 반복
}

switch에서 break 누락

switch (menu) {
    case 1:
        cout << "One";
        // break가 없으면 다음 case로 진행 가능
    case 2:
        cout << "Two";
}

do while 마지막 세미콜론 누락

do {
    // 반복할 코드
} while (condition); // 세미콜론 필요

같은 표현식에서 여러 번 증감

int result = i++ + ++i; // 피해야 함

각 증감 연산을 별도 문장으로 분리합니다.


최종 핵심

  1. 혼합 자료형 계산에서는 자동 변환이 발생합니다.
  2. 축소 변환은 값이나 정밀도를 잃을 수 있습니다.
  3. 부동소수점은 근삿값이므로 작은 오차가 생길 수 있습니다.
  4. &&, ||, !는 조건을 결합하거나 반전합니다.
  5. x++는 값을 사용한 후 증가하고 ++x는 증가한 후 값을 사용합니다.
  6. if는 조건, switch는 여러 값 중 하나를 선택할 때 사용합니다.
  7. while은 조건을 먼저 검사하고 do while은 본문을 먼저 실행합니다.
  8. for의 순서는 초기화 → 조건 → 본문 → 갱신입니다.
  9. break는 반복을 종료하고 continue는 현재 회차를 건너뜁니다.
  10. 범위 기반 for는 Container의 모든 요소를 순회할 때 사용합니다.

오늘도 한 걸음 앞으로.

내용을 이해했다면 학습 완료를 체크해 주세요.

학습 기록은 현재 브라우저에 저장됩니다.
FORIF / C++ STUDY한지석 윤정재