연산자와 제어문

연산자와 제어문

1. 산술 연산자

기본 산술 연산자

연산자 의미 예시
+ 덧셈 a + b
- 뺄셈 a - b
* 곱셈 a * b
/ 나눗셈 a / b
% 나머지 a % b
#include <iostream>

int main() {
    int a = 17, b = 5;

    std::cout << "a + b = " << a + b << std::endl;  // 22
    std::cout << "a - b = " << a - b << std::endl;  // 12
    std::cout << "a * b = " << a * b << std::endl;  // 85
    std::cout << "a / b = " << a / b << std::endl;  // 3 (정수 나눗셈)
    std::cout << "a % b = " << a % b << std::endl;  // 2

    return 0;
}

정수 나눗셈 vs 실수 나눗셈

#include <iostream>

int main() {
    int a = 7, b = 2;

    // 정수 나눗셈 (소수점 버림)
    std::cout << "7 / 2 = " << a / b << std::endl;  // 3

    // 실수 나눗셈
    std::cout << "7.0 / 2 = " << 7.0 / 2 << std::endl;  // 3.5
    std::cout << "(double)7 / 2 = " << static_cast<double>(a) / b << std::endl;  // 3.5

    return 0;
}

증감 연산자

#include <iostream>

int main() {
    int a = 5;

    std::cout << "a = " << a << std::endl;    // 5
    std::cout << "++a = " << ++a << std::endl; // 6 (전위: 먼저 증가)
    std::cout << "a++ = " << a++ << std::endl; // 6 (후위: 나중에 증가)
    std::cout << "a = " << a << std::endl;    // 7

    return 0;
}

2. 대입 연산자

복합 대입 연산자

#include <iostream>

int main() {
    int a = 10;

    a += 5;   // a = a + 5
    std::cout << "a += 5: " << a << std::endl;  // 15

    a -= 3;   // a = a - 3
    std::cout << "a -= 3: " << a << std::endl;  // 12

    a *= 2;   // a = a * 2
    std::cout << "a *= 2: " << a << std::endl;  // 24

    a /= 4;   // a = a / 4
    std::cout << "a /= 4: " << a << std::endl;  // 6

    a %= 4;   // a = a % 4
    std::cout << "a %= 4: " << a << std::endl;  // 2

    return 0;
}

3. 비교 연산자

연산자 의미 예시
== 같다 a == b
!= 다르다 a != b
< 작다 a < b
> 크다 a > b
<= 작거나 같다 a <= b
>= 크거나 같다 a >= b
#include <iostream>

int main() {
    int a = 5, b = 10;

    std::cout << std::boolalpha;  // true/false로 출력
    std::cout << "a == b: " << (a == b) << std::endl;  // false
    std::cout << "a != b: " << (a != b) << std::endl;  // true
    std::cout << "a < b: " << (a < b) << std::endl;    // true
    std::cout << "a > b: " << (a > b) << std::endl;    // false
    std::cout << "a <= b: " << (a <= b) << std::endl;  // true
    std::cout << "a >= b: " << (a >= b) << std::endl;  // false

    return 0;
}

4. 논리 연산자

연산자 의미 예시
&& AND (그리고) a && b
\|\| OR (또는) a \|\| b
! NOT (부정) !a
#include <iostream>

int main() {
    bool a = true, b = false;

    std::cout << std::boolalpha;
    std::cout << "a && b: " << (a && b) << std::endl;  // false
    std::cout << "a || b: " << (a || b) << std::endl;  // true
    std::cout << "!a: " << (!a) << std::endl;          // false
    std::cout << "!b: " << (!b) << std::endl;          // true

    // 복합 조건
    int age = 25;
    bool isStudent = true;

    bool discount = (age < 20) || isStudent;  // 학생이거나 20세 미만
    std::cout << "할인 적용: " << discount << std::endl;  // true

    return 0;
}

단락 평가 (Short-circuit Evaluation)

#include <iostream>

int main() {
    int x = 0;

    // &&: 첫 번째가 false면 두 번째 평가 안 함
    if (false && (++x > 0)) {
        // x는 증가하지 않음
    }
    std::cout << "x after &&: " << x << std::endl;  // 0

    // ||: 첫 번째가 true면 두 번째 평가 안 함
    if (true || (++x > 0)) {
        // x는 증가하지 않음
    }
    std::cout << "x after ||: " << x << std::endl;  // 0

    return 0;
}

5. 비트 연산자

연산자 의미 예시
& AND a & b
\| OR a \| b
^ XOR a ^ b
~ NOT ~a
<< 왼쪽 시프트 a << n
>> 오른쪽 시프트 a >> n
#include <iostream>

int main() {
    int a = 5;  // 0101
    int b = 3;  // 0011

    std::cout << "a & b = " << (a & b) << std::endl;  // 1 (0001)
    std::cout << "a | b = " << (a | b) << std::endl;  // 7 (0111)
    std::cout << "a ^ b = " << (a ^ b) << std::endl;  // 6 (0110)
    std::cout << "~a = " << (~a) << std::endl;        // -6

    std::cout << "a << 1 = " << (a << 1) << std::endl;  // 10 (1010)
    std::cout << "a >> 1 = " << (a >> 1) << std::endl;  // 2 (0010)

    return 0;
}

6. 삼항 연산자

조건 ? 참일_때_값 : 거짓일_때_값
#include <iostream>

int main() {
    int a = 10, b = 20;

    // if-else 대체
    int max = (a > b) ? a : b;
    std::cout << "최댓값: " << max << std::endl;  // 20

    // 문자열 선택
    int score = 85;
    std::string result = (score >= 60) ? "합격" : "불합격";
    std::cout << "결과: " << result << std::endl;  // 합격

    // 중첩 (가독성 주의)
    int num = 0;
    std::string sign = (num > 0) ? "양수" : (num < 0) ? "음수" : "영";
    std::cout << "부호: " << sign << std::endl;  // 영

    return 0;
}

7. if 문

기본 if 문

#include <iostream>

int main() {
    int age = 18;

    if (age >= 18) {
        std::cout << "성인입니다." << std::endl;
    }

    return 0;
}

if-else 문

#include <iostream>

int main() {
    int score = 75;

    if (score >= 60) {
        std::cout << "합격" << std::endl;
    } else {
        std::cout << "불합격" << std::endl;
    }

    return 0;
}

if-else if-else 문

#include <iostream>

int main() {
    int score = 85;

    if (score >= 90) {
        std::cout << "A" << std::endl;
    } else if (score >= 80) {
        std::cout << "B" << std::endl;
    } else if (score >= 70) {
        std::cout << "C" << std::endl;
    } else if (score >= 60) {
        std::cout << "D" << std::endl;
    } else {
        std::cout << "F" << std::endl;
    }

    return 0;
}

if 문에서 변수 선언 (C++17)

#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> scores = {{"Alice", 90}, {"Bob", 85}};

    // C++17: if문 내 변수 선언
    if (auto it = scores.find("Alice"); it != scores.end()) {
        std::cout << "Alice's score: " << it->second << std::endl;
    }

    return 0;
}

8. switch 문

기본 switch 문

#include <iostream>

int main() {
    int day = 3;

    switch (day) {
        case 1:
            std::cout << "월요일" << std::endl;
            break;
        case 2:
            std::cout << "화요일" << std::endl;
            break;
        case 3:
            std::cout << "수요일" << std::endl;
            break;
        case 4:
            std::cout << "목요일" << std::endl;
            break;
        case 5:
            std::cout << "금요일" << std::endl;
            break;
        case 6:
        case 7:
            std::cout << "주말" << std::endl;
            break;
        default:
            std::cout << "잘못된 값" << std::endl;
    }

    return 0;
}

fall-through (의도적 생략)

#include <iostream>

int main() {
    char grade = 'B';

    switch (grade) {
        case 'A':
        case 'B':
        case 'C':
            std::cout << "합격" << std::endl;
            break;
        case 'D':
        case 'F':
            std::cout << "불합격" << std::endl;
            break;
        default:
            std::cout << "잘못된 등급" << std::endl;
    }

    return 0;
}

switch 문 주의사항

// switch는 정수형, 문자형, enum만 사용 가능
// 문자열은 불가 (C++에서)

// 변수 선언 시 중괄호 필요
switch (value) {
    case 1: {
        int x = 10;  // 중괄호로 범위 지정
        // ...
        break;
    }
    case 2:
        // ...
        break;
}

9. for 루프

기본 for 루프

#include <iostream>

int main() {
    // 1부터 5까지 출력
    for (int i = 1; i <= 5; i++) {
        std::cout << i << " ";
    }
    std::cout << std::endl;  // 1 2 3 4 5

    return 0;
}

역순 for 루프

#include <iostream>

int main() {
    for (int i = 5; i >= 1; i--) {
        std::cout << i << " ";
    }
    std::cout << std::endl;  // 5 4 3 2 1

    return 0;
}

중첩 for 루프

#include <iostream>

int main() {
    // 구구단 2단
    for (int i = 1; i <= 9; i++) {
        std::cout << "2 x " << i << " = " << 2 * i << std::endl;
    }

    // 별 삼각형
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= i; j++) {
            std::cout << "*";
        }
        std::cout << std::endl;
    }

    return 0;
}

출력:

*
**
***
****
*****

범위 기반 for 루프 (C++11)

#include <iostream>
#include <vector>

int main() {
    int arr[] = {1, 2, 3, 4, 5};

    // 배열 순회
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 참조로 수정
    for (int& num : arr) {
        num *= 2;
    }

    // vector 순회
    std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
    for (const auto& name : names) {
        std::cout << name << std::endl;
    }

    return 0;
}

10. while 루프

기본 while 루프

#include <iostream>

int main() {
    int count = 1;

    while (count <= 5) {
        std::cout << count << " ";
        count++;
    }
    std::cout << std::endl;  // 1 2 3 4 5

    return 0;
}

무한 루프와 탈출

#include <iostream>

int main() {
    int num;

    while (true) {
        std::cout << "숫자 입력 (0 종료): ";
        std::cin >> num;

        if (num == 0) {
            break;  // 루프 탈출
        }

        std::cout << "입력: " << num << std::endl;
    }

    std::cout << "종료" << std::endl;

    return 0;
}

11. do-while 루프

최소 한 번은 실행됩니다.

#include <iostream>

int main() {
    int num;

    do {
        std::cout << "1~10 사이 숫자 입력: ";
        std::cin >> num;
    } while (num < 1 || num > 10);  // 조건이 참이면 반복

    std::cout << "입력한 숫자: " << num << std::endl;

    return 0;
}

while vs do-while

#include <iostream>

int main() {
    int x = 0;

    // while: 조건 먼저 검사
    while (x > 0) {
        std::cout << "while 실행" << std::endl;
        x--;
    }
    // 출력 없음

    // do-while: 최소 한 번 실행
    do {
        std::cout << "do-while 실행" << std::endl;
        x--;
    } while (x > 0);
    // "do-while 실행" 출력됨

    return 0;
}

12. break와 continue

break

루프를 즉시 탈출합니다.

#include <iostream>

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break;  // 5에서 탈출
        }
        std::cout << i << " ";
    }
    std::cout << std::endl;  // 1 2 3 4

    return 0;
}

continue

현재 반복을 건너뜁니다.

#include <iostream>

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;  // 짝수 건너뛰기
        }
        std::cout << i << " ";
    }
    std::cout << std::endl;  // 1 3 5 7 9

    return 0;
}

13. 연산자 우선순위

우선순위 연산자
1 (높음) (), [], ->, .
2 !, ~, ++, --, sizeof
3 *, /, %
4 +, -
5 <<, >>
6 <, <=, >, >=
7 ==, !=
8 &
9 ^
10 \|
11 &&
12 \|\|
13 ?:
14 (낮음) =, +=, -=

: 헷갈리면 괄호를 사용하세요!


14. 요약

분류 연산자
산술 +, -, *, /, %
비교 ==, !=, <, >, <=, >=
논리 &&, \|\|, !
비트 &, \|, ^, ~, <<, >>
대입 =, +=, -=, *=, /=
제어문 용도
if-else 조건 분기
switch 다중 분기
for 횟수 기반 반복
while 조건 기반 반복
do-while 최소 1회 실행 반복

다음 단계

04_Functions.md에서 함수를 배워봅시다!

to navigate between lessons