반응형

개요

반복문은 while문과 for 문이 있다. while문은 조건식을 기분으로 while문에 해당되는 코드 블록을 반복 실행을 할지 여부를 따진다. for 문은 순차적으로 접근이 가능한 값으로 부터 모두 접근할때까지 for문에 해당되는 코드 블록을 반복해서 실행한다.

논리적으로 생각해 보면 while 문이나 for 문은 if 문 처럼 조건식을 사용한다. 다만, 분기를 나누느냐 반복을 하느냐의 차이가 있을 뿐이다.

while

while 키워드로 시작하는 문장의 조건식의 결과가 True 이면 해당 코드 블록을 실행하고 False 면 코드 블록을 실행하지 않는다. 다만, 해당 코드 블록을 전부 실행한 이후 벗어나기 전에 while 문장으로 다시 돌아오는 원리로 동작한다. 만약 처음 부터 조건식이 False 라면 해당 코드브록은 if문처럼 실행하지 않고 건너 뛴다.

# 1부터 5까지 더하기
maxValue = 5
result = 0
value = 1
while maxValue > value:
	result = result + value
	value = value + 1
print("result:", result)

위험한 반복문

다음 코드는 절대로 하지 말아야 하는 코드다. 과거의 컴퓨터나 저수준 환경의 컴퓨터에서는 저런 코드를 실행하면 cpu 칩이 타거나 과열되어 멈추는 현상이 발생된다. 현재는 OS상에서 의도적인 무한 while문을 경고로 강제 종료하는 경우도 있지만, 강제 종료가 되지 않는 경우 시스템상 cpu 점유율을 차지하면서 아예 컴퓨터가 느려지면서 멈출 수 도 있다.

# 하지말아야 할 짓
while True
	pass

for

for 키워드는 in 과 함께 사용된다. for 와 in 사이에는 for문에 해당하는 코드 블록에서 사용할 변수명(혹은 복수의 변수명), in 뒤에는 복수형 자료형으로 구성된다. 아래의 예시를 보면 iterator 라는 변수가 있는데, 실제로 iterator라고 부른다. 초기 iterator는 마땅한 번역이 없어서 반복자라고 불리기도 했으나 오늘날에는 그냥 그대로 부르고 개념적으로 다음 값을 리턴할 수 있는 객체라 부른다.

for iterator in [1, 2, 3]:
    print(iterator)
# 1
# 2
# 3

 그러나 실제로는 for문에 해당되는 코드 블록내에서 사용되는 임시 변수라고 보는 것이 적절하고 실질적으로는 문법상 iterator를 이 임시 변수에 대입한 것이라고 보는게 낫다. 왜냐면 코드 블록 내에서 iterator에 다른 값을 대입하는 것이 가능하다. 하지만 이 iterator가 정확히 객체라면 대입시 이 for문은 망가져야 한다. 그러나 문제 없이 계속 실행되니 실질적인 iterator 즉, 객체는 손을 못 대게 막혀 있고 복제 버전만 임시 변수에 대입해서 사용하고 있는 것이다.

그리고 이 iterator를 생성할 수 있는 자료형을 iterable 로 구분한다. list, 뒤에 나올 range() 같은 함수들이 있다.

for문의 반복이 멈추는 조건은 iterator 가 None 즉, 더이상 줄 값이 없을 때 조건문 처럼 for문의 코드 블록을 스킵하게 된다.

 대략적인 동작 방식만 보면 while 문과 달리 조건식이 없는 것 같지만, 내부적으로는 iterator 라는 변수의 값이 비어 있는지를 따져서 코드 블록을 실행할지 여부를 결정한다. 이는 오랫동안 프로그래머들이 실무에서 자주 사용하는 패턴을 단순화 했기 때문이다. 때문에 오래된 언어인 C, C++, Java의 기본 for 문과는 다른 동작을 하는 것 처럼 보인다.

range()

range() 함수는 내장형 함수이다. 호출할 때마다 주어진 범위내의 값을 순차적으로 반환하는 함수이다. 입력 받는 숫자의 개수에 따라 동작 달라진다. 간단한 예시는 다음과 같다.

# 0부터 5까지 더하기
result = 0
for i in range(6):
    result = result + i
print("result:", result)
# 1부터 5까지 더하기
result = 0
for i in range(1, 6):
    result = result + i
print("result:", result)
# 1부터 10까지 홀수만 더하기
result = 0
for i in range(1, 11, 2):
    result = result + i
print("result:", result)

해당 함수는 프로그래머의 오랜 경험상 for문을 실무에서 많이 사용하는 방식으로 변경된 것이다. 따라서 C나 C++의 기본 for문와 방식이 다르다. 하지만, 레거시 for문 처럼 정수를 순차적으로 반복하는 동작이 필요하여 range() 같은 함수가 그 역할을 하고 있다.

for문과 관련된 함수들이 이외에도 있으나 함수에 대해서 먼저 공부하고 나서 다시 다루게 될 것이다.

반복문 관련 키워드

반복문에서 조건문과 조합하여 사용할 수 있는 키워드가 있다.

break

해당 키워드를 만나면 실행중인 반복문의 코드 블록에서 즉시 빠져나와서 반복문의 코드 블록 이후의 코드를 실행한다. 보통 조건문을 조합해서 사용한다.

value = 0
while True:
	if value > 10:
		break
	value = value + 1
print("value:", value)

continue

해당 키워드를 반복문내에서 만나면 반복문에 해당하는 코드블럭의 조건문이 시작하는 위치부터 실행을 한다. 보통 조건문과 같이 조합하여 사용한다. continue 키워드 뒤의 반복문 블록은 실행하지 않고 반복문의 조건식에 해당하는 위치에서 다시 실행한다. for 문의 경우 다음 iterator 를 받게된다.

value = 0
while value < 10:
	value = value + 1
	if value % 2 == 1:
		continue
	print("value:", value)

 

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

코드 블록, 조건문(if)  (1) 2024.05.01
불(bool)과 연산  (0) 2024.04.29
딕셔너리(dict)  (0) 2024.04.29
튜플(Tuple)  (1) 2024.04.27
리스트(list)  (0) 2024.04.27
반응형

C++11 :  범위기반 for 문

배경

 이미 C++11에서부터 존재했지만, 신경을 안쓰면 잘 모르는 for문의 기능이다. 이미 다른 언어들은 기존부터 foreach라는 키워드로 제공했던 기능이다.


 for문에서 직접 범위기반으로 반복하는 것이 가능 해짐으로써 STL 컨터이너 사용에 좀 더 편리 해졌다.



사용방법

#include <iostream>
#include <vector>

int main(const int argc, const char * argv[])
{
    std::vector<int> vec{ 1, 2, 3, 4};
    // 기존 반복자 사용방법
    auto itVec = vec.begin();
    for(; itVec != vec.end(); ++itVec)
    {
        std::cout << (*itVec) << std::endl;
    }

    // 범위 for문
    for(auto valVec : vec)
    {
        std::cout << valVec << std::endl;
    }
    return 0;
}


 첫 for문은 반복자를 이용한 원소 출력인 반면, 두번째 for문은 범위를 이용해서 원소를 확인하는 방법이다. auto 키워드는 C++11에서 가장 먼저 사용하게 되기때문에 자세한 설명은 생략한다.(auto 링크)



주요 특징

 1. 기존 반복자를 사용하지 않고 시퀀스(메모리가 연결된 자료형)형 컨테이너의 원소를 확인을 할 수 있다.
 2. 읽는 원소는 시퀀스 내부 원소의 형으로 변환된다.

 3. 범위 for문을 사용하여 읽는 시퀀스내부의 원소 값을 수정할 수 없다.



참조자료

MSDN 범위기반 for문




반응형

+ Recent posts