25.05.22 (4) - C++ Tutorial 4

김영하·2025년 5월 22일

C++

목록 보기
4/32

C++ Tutorial


If...Else

조건과 if 명령문

C++ 는 이전에 배운대로 아래와 같은 "조건"에 필요한 연산자를 지원한다
< <= > >= == !=

이런 비교 연산자 들을 활용해 다양한 로직을 구성할 수 있는데,
C++ 에는 다음과 같은 조건 명령문 이 있다 :

  • if : 조건이 참이면 코드 블럭 ({})을 실행
  • else : 조건이 거짓이면 코드 블럭을 실행
  • else if : 앞의 조건이 거짓이면 다음에 이어지는 새로운 조건의 참/거짓 을 판별
  • switch : 다양한 코드블럭 중에 조건(경우) 에 따라 실행할 코드블럭을 정함

if 명령문

if 는 소문자로 사용한다는 걸 기억하자

if (20 > 18) {
cout << "20 은 18 보다 크다";
}
int x = 20;
int y = 18;
if (x > y) {
cout << "x 는 y 보다 크다";
}


else 명령문

else 를 사용해 조건이 거짓일 때 실행할 코드를 짤 수 있다

int time = 20;
if (time < 18) {
	cout << "Good day.";
} else {
	cout << "Good evening.";
}

else if 명령문

else if 는 앞에 있는 if 조건이 false 가 떴을 때
새로 확인할 조건을 추가할 수 있다

int time = 22;
if (time < 10) {
cout << "Good morning";
} else if (time < 20) {
cout << "Good day";
} else {
cout << "Good evening";
}

Short Hand if else

"삼항 연산자"

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";
}

C++ Switch

switch 명령문

switch 를 사용해 여러 개의 코드블럭 중 실행할 코드를 고를 수 있다

switch(표현식) {
case x:
// x일 때 실행할 코드
break;
case y:
// y일 때 실행할 코드
break;
default:
아무것도 매칭되지 않았을 때 실행할 코드
}

작동하는 구조는 :

  • switch 괄호에 표현식을 넣어주면
  • case 에 있는 내용과 표현식을 비교해서
  • 매칭된, 결과가 동일한 게 있으면 해당하는 코드가 실행된다
  • breakdefault 키워드는 선택사항
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 키워드

break 키워드가 있는 곳에 도달하면,
더이상 다른 걸 실행하지 않고 switch 코드 블럭 안에서 탈출하게 된다

위에 쓴 예시로 따지자면,
표현식을 확인해서 맞는 케이스를 찾았으니 더이상 테스트할 필요 없이 break

실행할 필요가 없는 코드를 무시해 주므로 유용한 기능이다


default 키워드

default 키워드는 매칭된 게 없을 경우 실행할 코드를 정할 때 쓰인다

int day = 3;
switch (day) {
  case 6:
    cout << "토요일";
    break;
  case 7:
    cout << "일요일";
    break;
  default:
    cout << "주말 언제 오나";
}

C++ While Loop

루프문

루프문은 특정 조건에 도달할 때까지 코드를 반복한다
시간 절약, 에러 감소, 코드 가독성 등의 장점이 있다


While Loop

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 Loop

do/while 루프문은 while 루프의 변종으로 :
일단 do 에 있는 코드 블럭을 한번 실행하고,
(참/거짓 관계없이, 코드 순서상 while의 조건확인 보다 위에 있기 때문에 당연)
그다음 while 에 붙은 조건을 확인한 뒤 반복한다.

while (조건); 같이 ; 으로 마무리해줘야한다는 거에 주의


Do/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;
}


For Loop

만약 "몇번을 반복할 지" 확실히 정해져있는 경우에는
while 루프 보다는 for 루프가 더 유효하다

for (구문 1; 구문 2; 구문 3) {
// 실행할 코드블럭
}
  • 1번 구문은 : for 내부 코드 실행 전에
    한번만 실행될 구문
  • 2번 구문은 : 내부 코드를 실행할 조건
  • 3번 구문은 : 내부 코드가 실행된 이후에 매번 실행될 구문

숫자 출력

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";
}

C++ Nested Loops

중첩 루프

루프 안에 또다른 루프를 설정해줄수 있는데, 이를 "중첩 루프" 라고 부른다
"안쪽 루프"는 "바깥쪽 루프"의 반복 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"; // 한 개 단이 끝나면 개행
}


Foreach Loop

for-each 루프문

"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바이트여야 보이는 걸
    반으로 쪼개서 안보이는 상태라고 할 수 있겠다

실생활 예제

  • 100까지 10단위로 세기
for (int i = 0; i <= 100; i += 10) {
  cout << i << "\n";
}

  • 홀수 세기
for (int i = 1; i <= 10; i = i + 2) {
  cout << i << "\n";
}

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

  • 구구단의 2단
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 and Continue

Break

break 명령은 앞서 봤듯이 switch 구문에서 벗어나는 용도로 사용되지만,
루프문에서도 마찬가지의 기능으로 사용할 수 있다

for (int i = 0; i < 10; i++) {
  if (i == 4) {
    break; // i 가 4가 되면 거기서 멈춘다
  }
  cout << i << "\n";
}

i가 4가 되서 루프가 멈췄기 때문에 루프 내부 코드가 더이상 실행되지 않고
3 에서 출력이 멈춘 모습


Continue

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는 출력되지 않고 건너뛰어지는 것


While loop 사용예시

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 문이 유리한 이유가 느껴지는 모습

profile
내일배움캠프 Unreal 3기

0개의 댓글