newclass 2025. 3. 27. 23:04

2.2 연산자

2.2.1 산술 연산자

기본적인 수학 연산을 수행하는 연산자입니다:

int a = 10, b = 3;
int sum = a + b;        // 덧셈: 13
int difference = a - b; // 뺄셈: 7
int product = a * b;    // 곱셈: 30
int quotient = a / b;   // 정수 나눗셈: 3 (소수점 이하 버림)
int remainder = a % b;  // 나머지: 1

// 실수 나눗셈 (소수점 결과를 얻기 위함)
double result = static_cast<double>(a) / b;  // 3.33333

2.2.2 증감 연산자

변수의 값을 1씩 증가시키거나 감소시킵니다:

int x = 5;
x++;                    // 후위 증가: x는 이제 6
++x;                    // 전위 증가: x는 이제 7
x--;                    // 후위 감소: x는 이제 6
--x;                    // 전위 감소: x는 이제 5

전위 vs 후위 증감:

  • 전위(++x): 증가 후 값 사용
  • 후위(x++): 값 사용 후 증가
int a = 5, b = 5;
int resultA = ++a;      // a를 6으로 증가시킨 후, resultA에 6 할당
int resultB = b++;      // resultB에 5 할당 후, b를 6으로 증가

2.2.3 비교 연산자

두 값을 비교하여 참(true) 또는 거짓(false)을 반환합니다:

int x = 10, y = 20;
bool isEqual = (x == y);       // 같음: false
bool isNotEqual = (x != y);    // 같지 않음: true
bool isGreater = (x > y);      // 큼: false
bool isLess = (x < y);         // 작음: true
bool isGreaterOrEqual = (x >= y); // 크거나 같음: false
bool isLessOrEqual = (x <= y);    // 작거나 같음: true

// 결과 확인
std::cout << std::boolalpha;  // true/false로 출력
std::cout << "x == y: " << isEqual << std::endl;  // false

주의: C++에서 비교 연산자는 두 피연산자가 같은 타입이거나 암시적으로 변환 가능해야 합니다.

2.2.4 논리 연산자

불리언 값(true/false)을 결합하거나 반전시킵니다:

bool condition1 = true, condition2 = false;
bool andResult = condition1 && condition2;  // 논리 AND: false
bool orResult = condition1 || condition2;   // 논리 OR: true
bool notResult = !condition1;               // 논리 NOT: false

// 복합 논리식
bool complexLogic = (x > 5 && y < 30) || !(x == y);  // true

단락 평가(Short-circuit evaluation):

  • AND(&&): 첫 번째 조건이 거짓이면 두 번째 조건은 평가하지 않음
  • OR(||): 첫 번째 조건이 참이면 두 번째 조건은 평가하지 않음
// x가 0이면 두 번째 조건은 평가되지 않음 (0으로 나누기 오류 방지)
if (x != 0 && 100 / x > 10) {
    // 안전한 코드
}

2.2.5 비트 연산자

개별 비트 수준에서 연산을 수행합니다:

int a = 5;  // 이진수: 0000 0101
int b = 3;  // 이진수: 0000 0011

int bitwiseAND = a & b;   // 비트 AND: 0000 0001 (1)
int bitwiseOR = a | b;    // 비트 OR:  0000 0111 (7)
int bitwiseXOR = a ^ b;   // 비트 XOR: 0000 0110 (6)
int bitwiseNOT = ~a;      // 비트 NOT: 1111 1010 (-6, 2의 보수)

int leftShift = a << 1;   // 왼쪽 시프트: 0000 1010 (10)
int rightShift = a >> 1;  // 오른쪽 시프트: 0000 0010 (2)

비트 연산자의 일반적인 용도:

  • 플래그와 상태 정보 저장
  • 권한 및 옵션 설정
  • 저수준 최적화
  • 암호화 알고리즘
// 비트 플래그 사용 예시
const int READ = 0x1;     // 0001
const int WRITE = 0x2;    // 0010
const int EXECUTE = 0x4;  // 0100

int permissions = 0;
permissions |= READ;     // 읽기 권한 추가
permissions |= WRITE;    // 쓰기 권한 추가

bool canRead = (permissions & READ) != 0;  // true
bool canExecute = (permissions & EXECUTE) != 0;  // false

permissions &= ~WRITE;  // 쓰기 권한 제거

2.2.6 대입 연산자

변수에 값을 할당하는 연산자입니다:

int x = 10;           // 기본 할당
x += 5;               // x = x + 5와 같음: x는 이제 15
x -= 3;               // x = x - 3와 같음: x는 이제 12
x *= 2;               // x = x * 2와 같음: x는 이제 24
x /= 4;               // x = x / 4와 같음: x는 이제 6
x %= 4;               // x = x % 4와 같음: x는 이제 2

// 비트 연산자와 함께 사용
x &= 3;               // x = x & 3: x는 이제 2
x |= 8;               // x = x | 8: x는 이제 10
x ^= 6;               // x = x ^ 6: x는 이제 12
x <<= 1;              // x = x << 1: x는 이제 24
x >>= 2;              // x = x >> 2: x는 이제 6

2.2.7 조건(삼항) 연산자

조건 ? 참일_때_값 : 거짓일_때_값 형식의 간단한 조건문:

int a = 10, b = 20;
int max = (a > b) ? a : b;  // b가 더 크므로 max = 20

// if-else 대신 사용 가능
std::string status = (score >= 60) ? "합격" : "불합격";

// 중첩 사용도 가능 (하지만 가독성 주의)
int value = (a > b) ? (a > c ? a : c) : (b > c ? b : c);  // 최댓값

2.2.8 연산자 우선순위

C++에서 연산자는 우선순위에 따라 평가됩니다. 기본적인 우선순위:

  1. 스코프 해결 연산자 (::), 멤버 접근 (., ->)
  2. 증감 연산자 (++, --), 논리 NOT (!), 비트 NOT (~)
  3. 곱셈, 나눗셈, 나머지 (*, /, %)
  4. 덧셈, 뺄셈 (+, -)
  5. 시프트 연산자 (<<, >>)
  6. 비교 연산자 (<, <=, >, >=)
  7. 동등 연산자 (==, !=)
  8. 비트 AND (&)
  9. 비트 XOR (^)
  10. 비트 OR (|)
  11. 논리 AND (&&)
  12. 논리 OR (||)
  13. 조건(삼항) 연산자 (?:)
  14. 할당 연산자 (=, +=, -= 등)
// 연산자 우선순위 예시
int result = 5 + 3 * 2;  // 곱셈이 먼저: 5 + 6 = 11

// 괄호로 우선순위 변경
int result2 = (5 + 3) * 2;  // 덧셈이 먼저: 8 * 2 = 16

// 복잡한 표현식
bool check = x + 5 > y * 2 && !flag;  
// 1. x + 5, y * 2 계산
// 2. (x + 5) > (y * 2) 비교
// 3. !flag 계산
// 4. 논리 AND 연산

우선순위보다 괄호를 사용하는 것이 가독성에 좋습니다!