루프는 어떤 로직을 반복해서 실행할 때 사용해요.
가장 흔한 두 가지는 while loop(반복 횟수가 정해지지 않은 반복)와 for loop(정해진 횟수만큼 하는, 즉 계수 반복)예요.
나중에 다른 개념에서 다룰 for each 루프도 있어요.
for loop는 헤더와, 루프의 본문을 중괄호로 감싼 코드 블록으로 이루어져 있어요.
헤더는 세미콜론 ;으로 구분되는 세 가지 요소, 즉 초기문, 조건, 그리고 또 다른 표현식으로 이루어져 있어요.
이 요소들은 각각 비워 둘 수도 있어요.
for (init_statement; condition; expression) {
some_statement;
}
boolean으로 평가되는 표현식이어야 하고, 루프를 언제 멈출지 결정해요.
이 조건이 true로 평가되는 동안에는 루프 안의 코드가 실행돼요.
이 표현식이 false로 평가되는 순간, 루프는 더 이상 반복되지 않아요.while loop는 조건 검사가 true인 동안 본문을 실행해요.
아래 코드는 for를 while loop로 바꾸는 방법을 보여줘요.
init_statement;
while(condition) {
some_statement;
expression;
}
루프를 다루다 보면 반복 횟수를 세는 카운터 변수에 1을 더하거나 1을 빼야 할 때가 많아요.
너무 흔한 일이라 증가와 감소에는 전용 연산자 ++와 --가 있어요.
이 연산자에는 전위형과 후위형이 있어요. 전위형은 문에서 사용되기 전에 변수를 바꾸고, 후위형은 사용된 뒤에 바꿔요. 대부분은 전위형을 쓰게 될 거예요.
int a{3};
int b{--a};
// b is 2, a is now 2
int c{a++};
// c is 2, a is now 3
for문 예제_초기문_은 보통 카운터 변수를 준비하고, _조건_은 루프를 계속할지 멈출지 판단하며, _증감문_은 보통 매 반복이 끝날 때 카운터를 증가시켜요.
int sum{0};
for (int i{1}; i < 10; ++i) {
sum += i;
}
이 루프는 1부터 9까지(9 포함)의 수를 모두 더해요.
break와 continue
루프 본문 안에서 break 키워드를 사용하면 루프 실행을 완전히 멈출 수 있어요.
int sum{2};
while(true) {
sum *= 2;
if (sum > 1000)
break;
}
// sum is now 1024
반면에 continue 키워드는 현재 반복의 실행만 멈추고 다음 반복을 이어가요.
int equal_sum{0};
for (int i{1}; i < 7; ++i) {
if (i%2 == 1) {
continue;
}
equal_sum += i;
}
// equal_sum is now 12
break와 continue를 최소한으로 쓰거나 아예 쓰지 않으면 루프의 논리를 이해하기가 보통 더 쉬워요.
두 키워드 모두 코드의 특정 부분을 건너뛰기 때문에, 흐름을 따라가기가 더 어려워지곤 해요.
이 연습 문제에서는 저축 계좌를 다뤄요. 매년 저축 계좌의 잔액은 이자율에 따라 갱신돼요. 은행이 적용하는 이자율은 계좌에 있는 금액(잔액)에 따라 달라져요:
0달러보다 작으면 3.213%예요(잔액이 더 음수가 돼요).0달러 이상 1000달러 미만이면 0.5%예요.1000달러 이상 5000달러 미만이면 1.621%예요.5000달러 이상이면 2.475%예요.네 가지 과제가 있고, 각 과제에서는 잔액과 이자율을 다뤄요.
주어진 잔액을 기준으로 이자율을 계산하는 interest_rate 함수를 구현해요:
interest_rate(200.75);
// => 0.5
주어진 잔액을 기준으로 이자를 계산하는 yearly_interest 함수를 구현해요:
yearly_interest(200.75):
// => 1.003750
이자율을 고려해 연간 잔액 갱신값을 계산하는 annual_balance_update 함수를 구현해요:
annual_balance_update(200.75);
// => 201.75375
매년 잔액에 이자가 더해진다는 점을 고려해, 목표 잔액에 도달하는 데 필요한 최소 연수를 계산하는 years_until_desired_balance 함수를 구현해요.
즉, 1년 후 잔액은 시작 잔액 + 시작 잔액에 대한 이자예요.
2년 후 잔액은 1년 후 잔액 + 1년 후 잔액에 대한 이자예요.
이런 식으로, 해당 연도의 잔액이 목표 잔액 이상이 될 때까지 반복해요.
double balance {200.75};
double targetBalance {214.88};
years_until_desired_balance(balance, targetBalance)
// => 14
반환되는 값은 int라는 점에 유의해요.
Exercism에 가입하고 C++ 트랙을 개념 19개연습 문제 100개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.