[C/C++] 8. switch / case 문과 삼항 연산자

앞서 조건문과 비교 연산자를 알아보았다. 이번 글에서는 특정 변수의 값에 따라 깔끔하게 분기 처리하는 * 문, 핵심 키워드인 *, 그리고 구문을 한 줄로 축약할 수 있는 **삼항 연산자를 정리한다. 문은 기준이 되는 변수의 값과 일치하는 위치로 이동하여 코드를 실행하는 분기문이다. - *: 평가 대상 변수의 값과 일치하는 지점부터 실행한다. - *: 일치하는 가 하나도 없을 때 실행된다. (생략 가능) |구분|if - else if|switch - case| |---|---|---| |조건식|범위 지정 및 복잡한 논리식 가능 ()|정수/문자 형태의 단일 변수 값 비교 위주| |가독성|조건이 많아질수록 코드가 길어지고 복잡해짐|값이 딱 떨어지는 여러 조건 처리 시 가독성이 뛰어남| 가령 게임에서 상태 값(0: 대기, 1: 이동, 2: 공격, 3: 사망)에 따라 연동되는 로직을 구현할 때는 문을 사용하는 것이 훨씬 직관적이다. 문 내에서 를 만나면 해당 블록()을 완전히 탈출한다. 만약 내부에 를 작성하지 않으면, 문법 에러는 나지 않지만 다음 의 코드까지 연속해서 실행되어 최종 까지 도달하는 치명적인 논리 버그가 발생한다. 여러 에 대해 동일한 로직을 수행해야 할 때는 의도적으로 를 생략하여 로직을 하나로 묶을 수 있다. 이는 문에서 논리합() 연산자를 사용하는 것과 같다. 삼항 연산자는 간단한 구문을 단 한 줄로 축약할 수 있는 연산자다. - 삼항 연산자는 코드를 간결하게 만들어 주지만, 조건이 중첩되거나 길어지면 오히려 코드 가독성이 크게 떨어진다. - 따라서 단순히 값을 대입하거나 반환하는 직관적이고 명확한 상황에서만 선택적으로 사용하는 것이 좋다. - 값이 깔끔하게 떨어지는 다중 분기에는 보다 가 가독성 측면에서 유리하다. - 문 작성 시 * 누락으로 인한 논리 오류를 항상 경계하자. - *삼항 연산자**는 간단한 대입식에서만 한정적으로 사용하여 코드 깔끔함과 가독성을 모두 챙기자.

2026년 8월 1일

[C/C++] 7. if / else 조건문과 비교 연산자

앞서 논리 연산자와 참/거짓의 기준에 대해 알아보았다. 이번 글에서는 프로그램의 흐름을 제어하는 대표적인 구문인 , , 조건문과 이를 구성하는 비교 연산자, 그리고 실무에서 자주 하는 조건문 구성 시의 주의사항을 정리한다. 문은 말 그대로 "만약 ~라면"을 의미한다. 소괄호 안의 조건식이 참(이 아닌 수)이면 중괄호 내부의 코드를 실행하고, 거짓()이면 실행하지 않고 건너뛴다. 문의 조건식에는 두 값을 비교하여 참() 또는 거짓()을 반환하는 비교 연산자가 주로 사용된다. |연산자|기호|의미|예시 (a = 10, b = 20)|결과| |---|---|---|---|---| |같다||두 값이 같은가?||거짓 ()| |다르다||두 값이 다른가?||참 ()| |크다 / 작다|, |초과 / 미만인가?||참 ()| |크거나 같다 / 작거나 같다|, |이상 / 이하인가?||거짓 ()| > ⚠️ 초보자가 자주 하는 실수: 대입 연산자()와 비교 연산자()를 헷갈려 으로 작성하면, 에 이 대입된 후 은 이 아니므로 무조건 참(True) 으로 처리되는 버그가 발생한다. 하나의 조건뿐만 아니라 여러 상황에 따라 다른 코드를 실행해야 할 때 구문을 확장하여 사용한다. - *: 앞선 조건이 거짓일 때, 다음 조건을 순차적으로 검사한다. (원하는 만큼 추가 가능) - *: 연결된 모든 조건이 거짓일 때 최종적으로 실행되는 블록이다. (생략 가능) - 특징: 연결된 구문 중 하나의 조건이라도 참이 되어 실행되면, 나머지 아래의 조건검사는 완전히 건너뛴다. 조건문 작성 시 가장 중요한 설계 판단 중 하나는 "조건들을 하나로 연결할 것인가, 독립적으로 나눌 것인가?"이다. 키와 키가 로 연결되어 있으면, 키를 누르고 있는 동안에는 키 입력 조건을 검사조차 하지 않는다. 따라서 대각선 이동(W+A 동시 입력)이 불가능해진다. 동시 처리가 필요한 독립적인 사건들은 별개의 문으로 작성해야 정상적으로 동시 입력을 처리할 수 있다. - 문은 조건식이 이 아니면 참, 이면 거짓으로 판단하여 실행을 결정한다. - 로 연결된 구조는 단 하나만 실행되고 나머지는 스킵된다. - 동시 처리가 필요한 개별 조건(예: 키 입력)은 로 묶지 말고 독립된 문으로 작성해야 한다.

2026년 8월 1일

[C/C++] 6. 논리 연산자

앞서 증감 연산자를 알아보았다. 이번 글에서는 조건식에서 참(True)과 거짓(False)을 판단하는 논리 연산자, C++에서 추가된 * 자료형, 그리고 컴퓨터가 참과 거짓을 바라보는 기준을 정리한다. 컴퓨터 프로그래밍에서 조건 판단의 기준은 매우 명확하다. - *거짓 (False): 오직 만을 의미한다. - **참 (True): 이 아닌 모든 수를 의미한다. (1, 100, -5 등 모두 참으로 간주) 논리 연산의 결과는 참일 경우 **, 거짓일 경우 이라는 대표 정수값으로 반환된다. 초보자가 "오직 1만 참이다"라고 오해하기 쉽지만, **0이 아닌 모든 값은 조건식에서 참으로 평가된다는 점을 명심해야 한다. C 언어 초창기에는 참과 거짓을 나타내기 위해 일반 형 변수(0 또는 1)를 사용했지만, C++에 이르러 참/거짓 전용 자료형인 과 키워드(, )가 추가되었다. - 크기: 1 바이트 (8 비트) - 특징: 변수에 이나 같은 숫자를 대입해도, 내부적으로는 0이 아니므로 (1)로 자동 변환하여 저장한다. 논리 연산자는 주어진 조건들의 참/거짓 조합을 계산할 때 사용한다. - 원리: 참을 거짓으로, 거짓을 참으로 뒤집는다. - $\rightarrow$ (0) - $\rightarrow$ (1) - 일반 정수에도 적용 가능: 은 , 은 이 된다. - 원리: 양쪽 피연산자가 모두 참(0이 아닌 값)일 때만 참(1)을 반환한다. (교집합) - 하나라도 거짓()이면 결과는 거짓()이 된다. - 원리: 양쪽 피연산자 중 하나라도 참이면 참(1)을 반환한다. (합집합) - 둘 다 거짓()일 때만 결과가 거짓()이 된다. |연산자|기호|설명|조건 (참이 되는 경우)| |---|---|---|---| |NOT||논리 반전|거짓(0)을 뒤집을 때| |AND||논리곱|모든 피연산자가 참일 때| |OR||논리합|피연산자 중 하나 이상이 참일 때| - 컴퓨터는 만 거짓, 이 아닌 모든 숫자는 참으로 인식한다. - C++의 자료형은 1바이트 크기이며, 어떤 숫자를 대입하든 또는 으로 변환하여 관리한다. - 논리 연산자(, , )는 향후 배우게 될 조건문(, )과 삼항 연산자의 핵심 기초가 되므로 확실히 정리해 두자.

2026년 8월 1일

[C/C++] 5. 증감 연산자

앞서 산술 연산자와 우선순위에 대해 알아보았다. 이번 글에서는 변수의 값을 간편하게 증가시키거나 감소시키는 증감 연산자(, ), 그리고 많은 초보자가 헷갈려 하는 전위(Prefix)와 후위(Postfix) 방식의 차이점을 정리한다. 증감 연산자는 변수의 값을 한 단계 증가시키거나 감소시키는 단항 연산자다. - * (증가 연산자): 변수의 값을 1 증가시킨다. - * (감소 연산자): 변수의 값을 1 감소시킨다. > **💡 올바른 개념 잡기: 단순히 "1이 더해진다"보다는 "다음 단계로 이동한다"로 이해하는 것이 좋다. 나중에 학습할 포인터(Pointer) 연산에서는 피연산자의 자료형 크기에 따라 '한 단계'의 이동 단위가 4바이트, 8바이트 등으로 달라지기 때문이다. 증감 연산자는 변수의 앞이나 뒤 중 어디에 붙이느냐에 따라 연산의 우선순위가 완전히 달라진다. - 원리: "선 증가, 후 연산" - 변수의 값을 먼저 증가시킨 후, 해당 라인의 다른 연산(대입 등)을 수행한다. - 원리: "선 연산, 후 증가" - 해당 라인의 모든 연산을 먼저 처리한 후, 가장 마지막에 변수의 값을 증가시킨다. (대입 연산자보다도 우선순위가 낮다) 단독으로 또는 를 사용할 때는 결과에 차이가 없다. 하지만 실무나 객체지향 프로그래밍(C++)에서는 전위 방식을 기본적으로 사용하는 습관을 들이는 것이 권장된다. 1. 복합 연산 시의 실수를 방지: 후위 연산자는 연산 순서가 직관적이지 않아 버그를 유발하기 쉽다. 2. 성능상의 이점 (클래스 및 객체): - C++에서 사용자 정의 객체(클래스/구조체)에 증감 연산자를 오버로딩할 때, 후위 연산자는 값이 변경되기 전의 상태를 저장해 둘 임시 객체를 생성해야 한다. - 따라서 불필요한 복사 비용이 발생할 수 있으므로, 특별한 사유가 없다면 전위 연산자()를 사용하는 것이 성능상 유리하다. - 증감 연산자는 단순 1 증가가 아닌 "다음 단계로의 이동"으로 이해하는 것이 포인터 개념 확장에 도움이 된다. - 전위()는 증가 후 대입, 후위()는 대입 후 증가한다. - 코드의 직관성과 가독성을 위해 특별한 이유가 없다면 전위 방식을 우선 사용하자.

2026년 8월 1일

[C/C++] 4. 산술 연산자

앞서 정수와 실수의 메모리 표현 방식을 알아보았다. 이번 글에서는 데이터를 계산할 때 사용하는 가장 기본적인 산술 연산자, 연산 시 발생하는 임시 메모리 저장, 그리고 나누기(/)와 나머지(%) 연산자의 특수성을 정리한다. C/C++에서 식을 구성할 때 사용하는 연산자는 우측의 피연산자를 기반으로 연산을 수행한다. - 덧셈(), 뺄셈(), 곱셈(): 일반적인 사칙연산과 동일하게 동작한다. - 대입 연산자( harness): 우항의 값을 좌항의 변수에 저장(메모리 이동)한다. 컴퓨터는 지시된 명령어에 따라 엄격한 우선순위를 적용하여 계산한다. CPU가 연산을 수행할 때, 연산 과정의 중간 결과는 CPU 내부의 레지스터(Register) 등 임시 메모리 공간에 잠시 머무른다. 만약 처럼 연산만 하고 대입 연산자()를 사용하지 않으면, 연산 결과는 변수에 반영되지 않고 그대로 휘발되어 사라진다. 자기 자신의 값에 특정 연산을 수행한 후 다시 자신에게 저장하는 구문은 복합 대입 연산자를 사용해 간결하게 축약할 수 있다. 나누기 연산은 피연산자의 자료형(정수 vs 실수)에 따라 동작 방식이 완전히 달라진다. - 정수 나눗셈(): 소수점을 표기할 수 없으므로, 몫만 남고 소수점 아래는 버려진다. - 나머지 연산자(, 모듈러스): 나눗셈 후 남은 나머지를 구한다. 오직 정수형 피연산자끼리만 사용 가능하다. 실수 나눗셈에서는 소수점 이하까지 연산이 수행되므로 나머지라는 개념 자체가 존재하지 않는다. 따라서 실수에 연산자를 사용하면 컴파일 에러가 발생한다. 코드에 직접 작성하는 숫자를 상수(Literal)라고 부른다. 코드에 적힌 상수는 그 자체로 특정 자료형과 크기를 갖는다. 실수 연산 결과(예: )를 정수형() 변수에 대입하려 하면 소수점이 잘려 나가며 데이터 손실 경고(Warning)가 발생한다. 이 경우 명시적 형변환을 통해 컴파일러에게 의도를 전달해야 한다. - 연산만 수행하고 변수에 대입하지 않으면 중간 결과는 휘발된다. - (나머지) 연산자는 정수끼리만 가능하며 실수에는 사용할 수 없다. - 코드에 직접 적는 실수 상수는 기본적으로 타입이므로, 변수에 담을 때는 * 접미사*를 붙여주도록 하자.

2026년 8월 1일

C 태그 포스트 | Gyulog