본문 바로가기
Python/Python Basic

10. Python - 반복문 2. while문으로 구구단 출력하기

by Rosmary 2019. 8. 20.
728x90
반응형

반복적인 코드를 자동으로 실행할 수 있도록 만드는 반복문은, 지난 포스팅에서 언급한 for 문 외에, while문도 존재한다. 코드가 작동하는 알고리즘 자체는 for문과 다르지 않다. 하지만, for 문과 달리, list나 tuple을 사용하지 않고, 프로그래머가 정의한 특정 조건을 이용해 코드 반복을 유지한다.(처음 들으면 뭔 소린가 싶겠지만, 예제를 보면 바로 이해가 될 것이다)

 

그럼, while 문에서 사용한다는 저 조건들은 어떻게 만들어지는가? 우선, 조건의 생성에 필요한 비교 연산자 및 boolean이라고 불리는 자료형에 대해 먼저 알아야한다.

 

 

1. 비교연산자

 

말 그대로, 비교 연산자라는 것은 서로 다른 두 값을 비교할 때 사용하는 연산자를 말한다. 초등학교 수학시간 때 많이 배웠던 부등호, 등호와 같은 것이 비교 연산자다. 대한민국의 의무 교육과정을 충실히 따라왔다면, 크게 어려운 내용은 없지만, 프로그래밍 언어에 사용되는 연산자의 모양새가 약간 다르기 때문에, 프로그래밍을 처음 접하는 분들이라면 적응에 시간이 필요할 것이다. 하나씩 살펴보자.

 

 

(1) == (서로 같은 값인가?)

 

1과 2는 같은 값인가? 두 살 배기 아이에게 물어도 아니라고 대답할 정도로 쉬운 문제다. 이 문제를 컴퓨터에게 python 코드를 이용해 물어보자. 어떻게 질문해야할까? 

 

 

위의 결과와 같이, 비교한 두 값이 같은지 다른지 묻는 연산에서는 등호 두 개를 연달아 붙인 연산자를 사용한다. 이 연산자는 숫자 뿐만 아니라, 문자열도 비교를 해준다.

 

 

특이하게도, 사람에게는 같은 의미를 가지는 두 문자열 "Hello"와 "hello"는, 컴퓨터에게는 전혀 다른 값으로 받아들여진다. 컴퓨터는 저 Hello라는 단어에 담긴 의미를 파악하는 것이 아니라, 문자열의 모양새를 판단하기 때문에 일어나는 일이다. 따라서, 컴퓨터가 문자열을 비교할 때 대, 소문자의 차이때문에 같은 값이 아니라는 결과가 나타나는 경우가 발생한다.

 

* 컴퓨터는 사람의 언어를 이해하지 못한다. 대신, 해당 언어가 이진 숫자로 변환된 값을 이해하고, 이를 통해 프로그래머의 요청을 수행하게 되는 것이다. 언어를 이진 숫자로 변환하는 코드 중에 가장 오래 사용된 것은 아스키(ASCII) 코드인데, 이는 2진 숫자 8자리로 구성되어 128개의 문자를 컴퓨터에게 이해시킬 수 있다. 가령 대문자 A는 65(01000001)번, 소문자 a는 97(01100001)번이다. 알파뱃에 따른 ASCII 코드 번호를 확인하고 싶다면, ord() 함수를 사용하면 된다.

 

최근에는 영문자 외의 타 언어도 표현하기 위해 128자만 표시 가능한 ASCII코드 대신, 유니코드를 사용한다.

 

 

그렇다면, 문자열로 표기된 숫자인 "1"과 숫자형 자료형으로 표기된 숫자 1의 비교는 어떤 결과를 나타낼까? 

 

위의 1과 "1"은 분명 사람이 이해하는 언어 관점에서는 같은 것이다. 그러나 컴퓨터는 이 두 값의 모양은 일치할지 몰라도 자료형이 일치하지 않기 때문에(문자열 자료형과 숫자형 자료형) 서로 다른 값으로 간주한다. 이는 ord()함수를 이용해서도 확인할 수 있다. 만약 문자열 1이 숫자 1과 같은 값을 가지려면, ord("1")의 값이 1로 나타나야 할 것이다. 그러나 결과는 그렇지 않다.

 

 

 

(2)  != (서로 다른 값인가?)

 

앞의 == 연산과는 전혀 반대되는 의미를 가지는 연산자이다. 느낌표(!)는 프로그래밍 언어에서, 일반적으로 반대나 제외를 의미한다. 영문자의 a-, anti-, non-과 같은 의미라고 보면 된다.

 

따라서 1과 2의 비교 연산에서 == 연산자를 !=로 바꾸면, 정 반대의 결과가 출력된다.

 

 

(3) <, >, <=, >= (두 값의 크기 비교 결과는?)

 

산수시간에 많이 보던 부등호다. 굳이 하나씩 설명하자면, 아래와 같다.

 

==============================

x < y  :  x는 y보다 작은 값인가?

x > y  :  x는 y보다 큰 값인가?

x <= y:  x는 y보다 작거나 같은 값인가?

x >= y:  x는 y보다 크거나 같은 값인가?

==============================

 

이 비교 연산자 역시, 숫자외에도 문자열의 비교가 가능한데, 문자열의 비교에 사용하는 값은 바로 앞에서 보았던 ASCII 코드와 같은 이진 숫자이다. 

 

"A"와 "a"를 비교한다고 해보자. 이 두 값의 ASCII 코드는 각각 65와 97이다. 만약 컴퓨터에게 "A" < "a" 연산 결과를 수행하라고 하면 어떤 결과를 돌려줄까? 

 

 

컴퓨터는 예상대로, ASCII 값이 큰 문자인 'a'가 더 큰 값을 가진다고 판단한다.

 

단 하나의 문자가 아니라, 여러 문자가 조합된 단어라고 하더라도, 비교가 가능한데, 이 때도 마찬가지로 ASCII 값을 사용한다. "Elephant"와 "Eagle" 중, 어떤 값이 더 클까?

 

==========================

Elephant =>     E: 69  l: 108 ..... 

Eagle     =>     E: 69  a: 97 .....

==========================

 

단어의 크기 비교는 알파뱃 순으로 나열된 사전을 생각하면 된다. 첫 글자인 E는 같은 값이기 때문에, 우열을 가리지 못하고 다음 문자인 l과 a의 값을 비교하게 되며, 이 때, 컴퓨터는 더 큰 ASCII 코드를 가지는 단어가 더 큰 값이라고 판단하게 된다.

 

*  문자열에 포함된 공백은, 아무것도 작성된 것이 아니라 ASCII 값이 0이라고 생각하는 사람들도 있을 듯 한데, 공백 역시 예상 외로 큰 ASCII 값을 가진다. ord(" ")를 입력하여 공백의 ASCII값을 확인해보자.

 

 

 

2. boolean 자료형

 

프로그래밍 언어에는 참과 거짓을 표현할 수 있는 boolean이라고 불리는 표현형이 있다(참고로, C언어에는 존재하지 않는 자료형이다). 이 boolean은 컴퓨터가 비교 연산 과정의 결과로 나타나는 참/거짓을 표현할 때 사용된다. 따라서 boolean 값이 가질 수 있는 값은 단 두 개, True와 False다.

 

이 boolean 값을 조건식에 이용할 때, 주의해야 할 점이 하나 있다. 필자가 빨간색에, 굵은 글씨(진지하게 보이기 위해 궁서체도 적용할까 고민했다)로 표기한 부분을 잘 보자. 맨 앞의 문자는 항상 대문자로 표기된다. 이는 우리가 지금까지 진행한 비교연산 결과 출력물에서도 확인할 수 있다. 이 다음에 알아볼 while 의 조건문 작성 과정에서, boolean 값의 맨 앞 문자를 소문자로 쓴다면, while 문은 제대로 작동하지 않는다.

 

조건문에 사용되는 연산자와 boolean 자료형에 대해 대략적으로 알아보았으니, 이제 본격적으로 while문에 대해 알아보자.

 

 

 

3. while 문

 

while문의 포맷은 다음과 같다.

 

=============================

while (조건문) :

    반복코드

=============================

 

얼핏 보면, for 문과 유사해보인다. 다른점이 있다면, 서두에 언급했듯이, List 나 Tuple이 아닌, 조건문이 반복 제어에 관여한다는 점이다. 

 

while 문은, 조건문이 참(True)인 경우에만 지속적으로 반복된다. 따라서, while 문 내에서 조건문이 거짓이 되도록 만드는 코드가 존재하지 않는다면, while문은 인류가 멸망하고도 계속해서 반복코드를 실행할 것이다. 다음의 코드를 실행해보자. 끝도 없이 결과물이 출력될 것이다.

 

===================

while (1<2):

    print("Hello")

===================

* 이 결과물은 스크린 샷 찍기가 어려워서 사진은 첨부하지 않는다. 컴퓨터의 무한 인사를 멈추고 싶다면 Ctrl+c를 누르자.

 

 

반면에, 조건문이 거짓인 경우에는, while 내의 반복 코드가 절대 실행되지 않는다.

 

 

이제, 이를 응용하여, 구구단 2단을 출력해보자.

 

 

 

 

4. while 문을 이용한 구구단의 출력

 

for문과 마찬가지로, while문 역시, 반복되는 코드를 자동으로 실행할 수 있도록 만들어 주는 프로그래밍 문법이다. 다만, 조건식을 이용해 반복을 유지하기 때문에, 조건식에 사용되는 변수값이, while 문을 한 번 실행한 뒤에 지속적으로 변경되어야, 무한루프(반복문의 결과가 종료되지 않고 계속해서 출력되는 것)에 빠지지 않는다. 

 

2단을 2 X 1에서 2 X 9까지 출력한다고 가정해보자. 우선, 단에 해당하는 숫자 2는 변화가 없다. 변화하는 값은 오로지 곱셈 연산자(X) 뒤의 숫자 뿐이다. 따라서 while문의 조건식에는 연산자 뒤에 위치한 숫자를 변수 형태로 집어넣어주면 될 것이다. 변하지 않는 2는 변수명을 dan으로, 변하는 숫자는 변수명을 n으로 선언한다.

 

변수명 n의 값은 while 문 내에 위치한 곱셈 연산 코드를 한 번 실행할 때마다, 1씩 증가시킬 것이다. 그리고, n이 9를 초과하는 값을 가지게 되면, 곱셈 연산은 중지되어야 한다. 

 

이 조건들을 참고하여 코드를 짜면, 아래와 같이 나타낼 수 있다.

 

================================

dan = 2

n = 1

 

while ( n < 10 ):

    print("{} X {} = {}".format(dan, n, dan * n)

    n = n + 1                                                  => 혹은 간단하게 n += 1로 작성하기도 한다

================================

 

실제 명령창에 해당 코드를 입력한 결과는 다음과 같다.

 

 

해당 코드의 진행 과정을 차례대로 분석하면 아래와 같다.

 

============================================================================

1. dan = 2, n = 1이다.

2. while문에 진입하여 조건식을 비교한다. n=1이므로 n < 10 조건에 부합한다.

3. while 문 내의 곱셈 출력 코드를 실행한다. 2 X 1 = 2가 출력된다.

4. while 문 내의 n값 증가 코드를 실행한다.   n += 1 이므로 n은 2가 된다.

 

5. while 문 내의 모든 코드를 수행하고, 다시 while문의 처음으로 돌아와 조건식을 비교한다. 

   n = 2 이므로 n < 10 조건에 부합한다.

6. while 문 내의 곱셈 출력 코드를 실행한다. 2 X 1 = 2가 출력된다.

7. while 문 내의 n값 증가 코드를 실행한다.   n += 1 이므로 n은 2가 된다.

.

.

.

============================================================================

 

 

 

while 문은 for 문과 마찬가지로, while 문 안에 while 문을 사용할 수 있다.(추가로 더 언급하자면, while 문 안에 for문을 사용하거나, for문 안에 while 문을 사용하는 것도 가능하다) 그리고, 이를 이용해 지난번과 마찬가지로 2단에서 4단까지의 구구단을 한 번에 출력할 수 있다.

 

=============================================

dan = 2

 

while (dan < 5) :

    n  = 1

    while (n < 10) :

        print("{} X {} = {}".format(dan, n, dan * n)

        n = n + 1                                                                 => 혹은 간단하게 n += 1로 작성하기도 한다

    dan = dan + 1

=============================================

 

출력 결과는 다음과 같다.

 

 

위의 내용을 참고하여, 2단에서 9단까지 출력될 수 있도록 코드를 작성하고 실행해보자.

 

마지막으로, 비교 연산자에 대해 표로 간략히 정리를 하면서 이번 포스팅을 마무리한다.

 

비교 연산자
 A == B A와 B가 같은가?
A != B A와 B가 다른가?
A < B  or A <= B A가 B보다 작은가? or A가 B보다 작거나 같은가?
A > B  or A >= B A가 B보다 큰가? or A가 B보다 크거나 같은가?
연산의 결과로, Boolean값인 True와 False가 반환됨

 

FIN.

반응형

댓글