[엔트리파이선]<6>명령어로 반복하기 실행

컴퓨터는 프로그래밍된 대로 문제를 해결하며 수천~수만 번의 반복적인 일을 실수 없이 빠른 속도로 처리합니다. 반복 능력을 자동화한다면 문제를 효율적이고 정확하게 해결할 수 있습니다. 엔트리파이선에서 반복을 알아봅시다.

컴퓨터에서 반복은 원하는 명령어를 계속 실행하도록 만드는 것입니다. 반복을 위한 명령어는 여러 가지가 있고 사용 방법은 다릅니다. 우리가 특정 명령어를 반복해서 실행하기 위해서는 반복 횟수를 정해줄 수 있습니다. 특정 조건을 만족하면 논리연산 값을 만족하지 않을 때까지 반복하도록 만들 수도 있어요.

엔트리 실행창(왼쪽)과 콘솔창
<엔트리 실행창(왼쪽)과 콘솔창>

컴퓨터에게 명령어를 통해 반복하도록 할 때는 반복 횟수나 상황을 정확히 안내해야 합니다. 그렇지 않은 경우 자원을 많이 소비하는 비효율적인 프로그램이 될 수 있어요. 컴퓨터는 사람이 시킨 대로 계속 반복하기 때문이죠. 항상 정확하게 표현하는 능력을 기르는 게 중요합니다.

앞서 살펴본 연산은 이번에도 계속 활용됩니다. 반복하기 위한 횟수나 상황을 표현하기 위해 연산을 사용하기 때문이에요. 우선 'while 논리연산:' 의 반복구조를 살펴봅시다. 엔트리 프로그래밍에서 많이 사용하는 '무한반복', '~일 때 까지 반복' 블록과 유사합니다. 'while 논리연산:' 반복구조는 실제 파이선과 동일한 명령어와 구조를 가지고 있습니다.

while 명령어는 지금까지 'Entry.print' 명령어에서 살폈던 구조와 다르게 'Entry.'이라는 표현이 없습니다. 엔트리 고유 명령어가 아닌 파이선에서도 동일하게 사용되는 명령어기 때문입니다. while 명령어를 사용해 반복할 때는 논리연산으로 몇 번 반복할 것인지 정하는 게 중요합니다.

[그림1] def when_start(): 입력 예시
<[그림1] def when_start(): 입력 예시>

[그림1]처럼 논리연산을 위한 변수 n을 만들고 'def when_start():' 명령어를 통해 시작하기를 눌렀을 때 명령어가 실행되게 합시다.

[그림2]와 같이 n이라는 변수 값이 10보다 작을 때까지만 명령어가 반복되도록 하기 위해 'n < 10'이라는 논리연산을 추가합시다. 다음에는 컴퓨터에게 반복할 명령어를 입력해야 합니다. 'while(n < 10) :' 명령어를 입력하고 난 뒤 엔터를 쳐서 반복할 명령어를 입력합시다.

[그림2] while (n < 10) 입력 예시
<[그림2] while (n < 10) 입력 예시>

이상하네요. 'while (n < 10) :'을 입력한 뒤 엔터키를 눌렀을 뿐인데 커서가 이상하게 뒤로 조금 이동해 깜빡거립니다. 다음 줄로 이동할 때 커서가 뒤로 이동했던 건 'def when_start():' 명령어를 입력했을 때 봤던 모습이네요.

왜 이렇게 되는 걸까요. 컴퓨터는 늘 우리가 시키는 대로 실행되고, 우리는 컴퓨터가 이해할 수 있도록 명령어를 내려야하기 때문이에요. 커서를 안쪽으로 이동시켜 명령어를 입력하는 것을 들여쓰기라고 합니다. 보통 스페이스키를 네 번 누르거나 탭(Tab)키를 한 번 눌러서 씁니다.

텍스트 언어는 계속 줄을 바꿔가며 입력하고 줄 순서대로 실행됩니다. 반복을 위해서는 컴퓨터에게 '여기까지 블록을 반복해'라고 알려줘야 합니다. 컴퓨터는 다음과 같이 명령어를 이해하고 실행합니다.

“while 명령어가 있다. → 다음 논리 연산을 확인 해야겠어. → 논리 연산이 참이라면 다음 줄에 있는 명령어를 실행하자. → 들여쓰기가 돼있구나. → 이 명령어는 앞으로 반복하라는 명령어야. 먼저 실행을 할까. → 그 다음 명령어도 들여쓰기가 돼있어. 이것도 반복해볼까. → 논리 연산이 참일 동안은 들여쓰기 돼있는 명령어를 계속 반복하자. → 논리 연산이 거짓이 됐어. → 들여쓰기된 명령어는 다 지나고 다음 명령어부터 실행하면 되겠구나.” 순으로 이해·작동합니다.

이제 n 변수에 반복해 1을 더해주고 그 값을 출력해봅시다. 먼저 'Entry.print_for_sec(n, 1)'으로 변수 n값을 1초 동안 출력합시다. while 명령어 다음에 들여쓰기를 해야겠죠. 1초 출력했다면 n값에 1씩 더하기 위해 [그림3]처럼 'n += 1'이라는 명령어를 입력해요.

[그림3] Entry.print_for_sec(n, 1) 입력
<[그림3] Entry.print_for_sec(n, 1) 입력>

'n += 1'은 연산 방법이며 명령어가 실행될 때마다 1씩 계속 더해주는 명령어입니다. 실행해서 명령어가 출력되는 모습을 살펴봅시다. [그림4]와 같이 n값이 10보다 커지지 않을 때까지 그 값을 출력하는 것을 볼 수 있어요.

[그림4] 명령어 출력
<[그림4] 명령어 출력>

'n < 10'이라는 논리연산을 항상 참으로 만들면 어떻게 될까요. 'n < 10' 대신 항상 참이 되도록 1 < 10을 입력하고 실행합시다. 끝없이 명령어가 실행되는 것을 확인할 수 있습니다.

파이선에서 'while 문'이 논리연산을 통해 반복했다면 'for문'은 변수 혹은 리스트와 같은 자료구조와 함께 사용돼 효율적 반복을 하도록 도와줍니다. 파이선에서의 for문은 다양한 구조로 활용되지만 엔트리파이선에서는 반복하는 범위를 정해주고 실행하는 용도로 사용해야 합니다.

[그림5] for문, range 입력·적용 예시
<[그림5] for문, range 입력·적용 예시>

엔트리파이선에서 'for문'을 실행하면 'range' 명령어가 추가됩니다. 'range'는 범위를 지정하는 함수라고 할 수 있어요. range(10)으로 특정숫자값을 입력했을 때는 [그림5]처럼 0부터 숫자 미만, range(2, 10)이라고 범위를 입력했을 때는 2부터 9까지 값을 입력하고 출력합니다.

그러나 엔트리파이선에서는 범위를 지정할 수 없고 'for i in range(숫자 값 또는 변수 등 데이터):' 형태로 고정돼 있어요. 반복 횟수를 입력하는 것으로만 한정해 사용할 수 있습니다.

박종진기자 truth@etnews.com

위방향 화살표