C++ 는 이전에 배운대로 아래와 같은 "조건"에 필요한 연산자를 지원한다
< <= > >= == !=
이런 비교 연산자 들을 활용해 다양한 로직을 구성할 수 있는데,
C++ 에는 다음과 같은 조건 명령문 이 있다 :
if : 조건이 참이면 코드 블럭 ({})을 실행else : 조건이 거짓이면 코드 블럭을 실행else if : 앞의 조건이 거짓이면 다음에 이어지는 새로운 조건의 참/거짓 을 판별switch : 다양한 코드블럭 중에 조건(경우) 에 따라 실행할 코드블럭을 정함if 는 소문자로 사용한다는 걸 기억하자
if (20 > 18) {
cout << "20 은 18 보다 크다";
}
int x = 20;
int y = 18;
if (x > y) {
cout << "x 는 y 보다 크다";
}

else 를 사용해 조건이 거짓일 때 실행할 코드를 짤 수 있다
int time = 20;
if (time < 18) {
cout << "Good day.";
} else {
cout << "Good evening.";
}
else if 는 앞에 있는 if 조건이 false 가 떴을 때
새로 확인할 조건을 추가할 수 있다
int time = 22;
if (time < 10) {
cout << "Good morning";
} else if (time < 20) {
cout << "Good day";
} else {
cout << "Good evening";
}
if...else 구문을 축약한 버전이 있는데,
3개의 피연산자로 구성되었기 때문에 이를 삼항 연산자 라고 부른다
복수 행을 가진 코드를 짧게 정리할 수 있기 때문에,
간단한 if...else 구문의 대체로 애용된다.
variable = (condition) ? expressiontrue : expressionFalse;
변수 = (조건) ? 참일 때 표현식 : 거짓일 때 표현식
int time = 20;
if (time < 18) {
cout << "좋은 하루";
} else {
cout << "좋은 저녁";
}
이 구문을
int time = 20;
string result = (time < 18) ? "좋은 하루" : "좋은 저녁";
cout << result;
이렇게 축약 가능하다

int doorCode = 1337;
if (doorCode == 1337) {
cout << "문이 열립니다";
} else {
cout << "비밀번호가 틀립니다";
}
int myNum;
cin >> myNum;
if (myNum > 0) {
cout << "양수";
} else if (myNum < 0) {
cout << "음수";
} else {
cout << "0";
}

홀수냐 짝수냐 구분 :
int myNum = 5;
if (myNum % 2 == 0) {
cout << myNum << " is even.\n";
} else {
cout << myNum << " is odd.\n";
}
switch 를 사용해 여러 개의 코드블럭 중 실행할 코드를 고를 수 있다
switch(표현식) { case x: // x일 때 실행할 코드 break; case y: // y일 때 실행할 코드 break; default: 아무것도 매칭되지 않았을 때 실행할 코드 }
작동하는 구조는 :
switch 괄호에 표현식을 넣어주면break 와 default 키워드는 선택사항int day = 4;
switch (day) {
case 1:
cout << "Monday";
break;
case 2:
cout << "Tuesday";
break;
case 3:
cout << "Wednesday";
break;
case 4:
cout << "Thursday";
break;
case 5:
cout << "Friday";
break;
case 6:
cout << "Saturday";
break;
case 7:
cout << "Sunday";
break;
}
// Outputs "Thursday" (day 4)
break 키워드가 있는 곳에 도달하면,
더이상 다른 걸 실행하지 않고 switch 코드 블럭 안에서 탈출하게 된다
위에 쓴 예시로 따지자면,
표현식을 확인해서 맞는 케이스를 찾았으니 더이상 테스트할 필요 없이 break
실행할 필요가 없는 코드를 무시해 주므로 유용한 기능이다
default 키워드는 매칭된 게 없을 경우 실행할 코드를 정할 때 쓰인다
int day = 3;
switch (day) {
case 6:
cout << "토요일";
break;
case 7:
cout << "일요일";
break;
default:
cout << "주말 언제 오나";
}
루프문은 특정 조건에 도달할 때까지 코드를 반복한다
시간 절약, 에러 감소, 코드 가독성 등의 장점이 있다
while 키워드를 사용한 루프문은 "특정 조건이 true인 동안" 계속해서 반복된다
int i = 0;
while (i < 5) {
cout << i << "\n";
i++;
}
※ 위 경우의 i++ 처럼,
반복문이 제대로 종료되도록 해주는 구문을 까먹지 않기!
int countdown = 3;
while (countdown > 0) {
cout << countdown << "\n";
countdown--;
}
do/while 루프문은 while 루프의 변종으로 :
일단 do 에 있는 코드 블럭을 한번 실행하고,
(참/거짓 관계없이, 코드 순서상 while의 조건확인 보다 위에 있기 때문에 당연)
그다음 while 에 붙은 조건을 확인한 뒤 반복한다.
while (조건); 같이
;으로 마무리해줘야한다는 거에 주의
int i = 0;
do {
cout << i << "\n";
i++;
}
while (i < 5);
마찬가지로 반복문을 끝내줄 구문,
i++등은 빼먹지 않도록
그러면 시작부터 조건이 거짓일 경우엔? :
앞서 말했듯 일단 1번 실행하고 끝이 난다.

이게 일반 while 루프문과 구별짓는 차이점이라고 할 수 있겠다.
일단 한번 실행된 걸 확인하기 쉽기 때문에
do/while 문의 유용성이 돋보인다
짝수만 출력하는 반복문 :
int i = 0;
while (i <= 10) {
cout << i << "\n";
i += 2;
}
특정 숫자를 역순으로 정렬하기 :
// 특정 숫자 변수
int numbers = 12345;
// 역순으로 정렬한 숫자를 담을 변수
int revNumbers = 0;
// 역순 재정렬 과정
while (numbers) {
// 'numbers' 의 마지막 숫자를 구하고 'revNumbers' 에 더한다
revNumbers = revNumbers * 10 + numbers % 10; // 기존 숫자에 * 10 + 이전 숫자를 10으로 나눈 나머지
// 'numbers' 의 마지막 숫잘르 지운다
numbers /= 10; // 10으로 나눈 몫으로 재할당
}
cout << "Reversed numbers: " << revNumbers << "\n";

while문과 if else문을 같이 사용한 예시 :
int dice = 1;
while (dice <= 6) {
if (dice < 6) {
cout << "No Yatzy\n";
} else {
cout << "Yatzy!\n";
}
dice = dice + 1;
}

만약 "몇번을 반복할 지" 확실히 정해져있는 경우에는
while 루프 보다는 for 루프가 더 유효하다
for (구문 1; 구문 2; 구문 3) {
// 실행할 코드블럭
}
for 내부 코드 실행 전에for (int i = 0; i < 5; i++) {
cout << i << "\n";
}

위 예시의 경우
1) 루프 시작 전에 int i = 0 으로 변수를 생성하고
2) 루프의 조건인 i < 5 를 명시하며
3) 내부 코드가 실행될 때마다 같이 실행되서 반복문을 멈추게 해줄 i++
for (int i = 0; i <= 10; i = i + 2) {
cout << i << "\n";
}
i += 2 와 같은 구조로 동작한다

int sum = 0;
for (int i = 1; i <= 5; i++) {
sum = sum + i;
}
cout << "Sum is " << sum;
for (int i = 5; i > 0; i--) {
cout << i << "\n";
}
루프 안에 또다른 루프를 설정해줄수 있는데, 이를 "중첩 루프" 라고 부른다
"안쪽 루프"는 "바깥쪽 루프"의 반복 1회마다 1회씩 실행된다
// Outer loop
for (int i = 1; i <= 2; ++i) {
cout << "Outer: " << i << "\n"; // Executes 2 times
// Inner loop
for (int j = 1; j <= 3; ++j) {
cout << " Inner: " << j << "\n"; // Executes 6 times (2 * 3)
}
}
i++와++i는 동일하게 동작하는 모습

1단부터 3단까지의 예제
for (int i = 1; i <= 3; i++) { // i 1부터 3까지
for (int j = 1; j <= 3; j++) { // j 1부터 3까지
cout << i * j << " "; // i*j 값을 출력
}
cout << "\n"; // 한 개 단이 끝나면 개행
}

"for-each" 라는 루프문도 존재하는데,
배열(또는 기타 데이터 구조)의 요소를 루프할 때 쓰인다.
구조는 :
for (데이터타입 변수이름 : 배열이름) {
// 실행할 코드
}
아래는 배열 요소들을 루프하기 위해 "for-each" 루프를 사용한 예시 :
int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i : myNumbers) {
cout << i << "\n";
}

이 구조를 문자열 내부의 문자들을 따라 적용할 수도 있다
문자열 = '문자들의 배열' 이니까
string word = "문자열을 따라서";
for (char c : word) {
cout << c << "\n";
}

한국어로 시도했지만 출력되지 않는 모습
최소한 공백에서 '탈출' 될줄 알았는데 아무것도 출력되지 않았다
- 알아보니 한글은 아스키코드(ASCII)에 포함되어 있지않아 1바이트가 아니고
유니코드를 통해 2바이트 크기가 되기 때문에
한char씩 출력하려고 하면 아무것도 보이지 않는 것
엄밀히 말하면 출력은 했지만 2바이트여야 보이는 걸
반으로 쪼개서 안보이는 상태라고 할 수 있겠다
for (int i = 0; i <= 100; i += 10) {
cout << i << "\n";
}

for (int i = 1; i <= 10; i = i + 2) {
cout << i << "\n";
}

for (int i = 2; i <= 512; i *= 2) {
cout << i << "\n";
}

int number = 2;
int i;
// Print the multiplication table for the number 2
for (i = 1; i <= 9; i++) {
cout << number << " x " << i << " = " << number * i << "\n";
}

break 명령은 앞서 봤듯이 switch 구문에서 벗어나는 용도로 사용되지만,
루프문에서도 마찬가지의 기능으로 사용할 수 있다
for (int i = 0; i < 10; i++) {
if (i == 4) {
break; // i 가 4가 되면 거기서 멈춘다
}
cout << i << "\n";
}

i가 4가 되서 루프가 멈췄기 때문에 루프 내부 코드가 더이상 실행되지 않고
3 에서 출력이 멈춘 모습
continue 명령은 좀 특수한데,
"루프문에서 1번의 구간을 건너뛴다"
for (int i = 0; i < 10; i++) {
if (i == 4) {
continue;
}
cout << i << "\n";
}
위 예시를 기준으로 하자면,
if에 달린 조건인 i == 4 가 만족되면
=> 아래 있는 cout << i << "\n"; 코드를 한번 건너뛰어준다
0~9 까지 출력하지만 4는 출력되지 않고 건너뛰어지는 것

int i = 0;
while (i < 10) {
cout << i << "\n";
i++;
if (i == 4) {
break;
}
}
int i = 0;
while (i < 10) {
if (i == 4) {
i++;
continue;
}
cout << i << "\n";
i++;
}
결국 위의 for 문과 같은 기능이다.
비교해서 다소 복잡해보이는 게 확실히 반복횟수가 정해져있다면
for문이 유리한 이유가 느껴지는 모습