키콤백신 개발 이야기 - 파이썬의 기본문법 (제어문)

읽기 전에
Creative Commons License
본 내용은 키콤백신을 개발하면서 고민했던 내용들을 적은 것입니다. 따라서 다분히 개인적인 의견들이므로 보시는 분들에 따라서 이견을 가지실 수 있습니다. 그냥 "이 사람은 이렇게 개발하는구나" 하고 봐 주시면 좋겠습니다.

1. 들어가며

프로그래밍 언어들은 크게 구조적(절차적) 언어1와 객체지향 언어2로 구분할 수 있다. 두 언어의 특징 중 유사한 부분이라면 대체로 프로그램 흐름이 위에서 아래로 진행된다는 점이다(물론 객체지향 언어는 아니라고 반박할 분이 계시겠지만 결국 특정 로직을 파고 들어가고 들어가보면 결국 흐름은 위에서 아래로 진행된다). 하지만, 프로그래밍을 하다보면 이 흐름을 바꿔야 하는 시점이 있다. 예를 들면 특정 부분은 실행하지 않기도 하고 특정 부분을 반복하기도 한다. 이는 제어문이라는 특수한 프로그래밍 언어만의 별도 문법을 통해 프로그램 흐름을 제어한다. 파이썬에서는 제어문으로 if문, for문, while문이 존재한다.

2. 비교 연산자와 논리 연산자

프로그램의 흐름을 제어하기 위해서는 두 값을 비교하여 결과가 Yes 또는 No(정확하게는 True, False이다)를 구분하여 동작하게 된다. 또한 비교한 결과의 논리를 이용하게 되는데 여기에서는 파이썬의비교 연산자와 논리 연산자에 대해서 살펴본다.

2.1 비교 연산자

두 값을 비교하기 위한 연산자로 파이썬에서는 아래의 비교 연산자를 제공한다. 비교의 결과는 True 또는 False를 반환한다.

비교 연산자 의미
a == b a와 b가 같은가?
a != b a와 b가 같지 않은가?
a < b a가 b보다 작은가?
a <= b a가 b보다 작거나 같은가?
a > b a가 b보다 큰가?
a >= b a가 b보다 크거나 같은가?


아래는 비교 연산자를 이용한 예이다.

>>> a = 5
>>> b = 10
>>>
>>> a == b   # a와 b가 같은가?
False        
>>> a != b   # a와 b가 같지 않은가?
True
>>> a > b    # a가 b보다 큰가?
False
>>> a < b    # a가 b보다 작은가?
True
>>> _

2.2 논리 연산자

두 조건이 논리적 관계를 확인하기 위한 연산자로 파이썬에서는 아래의 논리 연산자를 제공한다. 결과는 True 또는 False를 반환한다.

논리 연산자 의미
a and b a와 b 모두가 True인가?
a or b a 또는 b 중 하나가 True인가?
not a a의 반대 값은?


참고로 프로그래밍 언어에서 보통 False0으로 정의한다. 그 이외의 값을 True로 정의한다. 파이썬에서는 0 뿐만 아니라 NoneFalse로 정의한다.

>>> a = True
>>> b = False
>>>
>>> a and b   # a와 b 모두가 True인가?
False
>>> a and a   # a와 a 모두가 True인가?
True
>>> a or b    # a 또는 b 중 하나라도 True인가?
True
>>> b or b    # b 또는 b 중 하나라도 True인가?
False 
>>> not a     # a의 반대값은?
False
>>> not b     # b의 반대값은?
True
>>> not 0     # 0 (False)의 반대값은?
True
>>> not 1     # 1 (True)의 반대값은?
False
>>> not None  # None (False)의 반대값은?
True
>>> _

3. if 문

제어문 중 선택문과 반복문이 존재한다. 이중 선택문이라 불리는 것이 if문이다. 파이썬에서 if문의 형식은 다음과 같다.

프로그램 실행이 진행되면 제일 먼저 if의 조건식을 체크하여 True이면 파이썬 문장1을 수행하게 된다. 만약 조건식이 False이면 elif의 조건식을 확인하게 되며 True라면 파이썬 문장2를 수행하고 elif는 계속적으로 추가 가능하다. 이 모든 조건식이 맞지 않다면 else파이썬 문장3을 수행한다.

>>> a = 5
>>>
>>> if a > 0 :        # a가 0보다 큰가?
...     print '양수'
... elif a < 0 :      # a가 0보다 작은가?
...     print '음수'
... else :            # 모든 조건식이 맞지 않은가?
...     print '0 (제로)'
...
양수
>>> _

들여쓰기와 내어쓰기

파이썬은 제어문 혹은 함수등에서 여러 문장들을 하나의 블록으로 지정할 때 들여쓰기를 사용한다. 일반적으로 들여쓰기는 탭(Tab)과 공백(Space)를 사용하는데 이는 개발자마다 성향의 문제이므로 어떤것을 사용하라고 이야기하기에는 애매하다. 하지만, 이미 앞서 키콤백신은 PEP8 코딩 스타일 가이드라인을 따른다고 언급한바 있다3. 따라서 들여쓰기는 공백 4개를 사용한다.

블록을 해제하고 싶다면 내어쓰기를 사용한다. 단, 내어쓰기를 하려면 들여쓰기를 이용하여 블록으로 지정하기 전 문장과 동일한 컬럼을 유지해야 한다.

>>> a = 1
>>> if a == 1 :
...     print 'Yes'
...
Yes
>>>  b = 1    # 블록으로 지정된 print 문장 이전인 if 문과 컬럼이 동일하지 않다
  File "<stdin>", line 1
    b = 1
    ^
IndentationError: unexpected indent
>>> _ 

4. for 문

파이썬에는 두개의 반복문이 존재하는데 그 중 하나가 for문이다. C/C++에서는 간혹 for을 이용하여 무한루프를 구현하기도 한다. C/C++는 for문에 조건식이 존재하여 해당 조건식을 항상 True로 만들면 무한루프의 구현이 가능하다.

하지만, 파이썬에서는 for문을 이용하여 무한루프를 만들지는 않는다. 즉 for문에 조건식이 존재하지 않는다. 아래는 for문의 형식이다.

for문의 형식에서 보는바와 같이 특별히 조건식이 없다. for 믈록에서 파이썬 문장1을 수행하다가 continue를 만나면 continue 아래 문장을 수행하지 않고 다음 for를 수행한다. 만약 break를 만나면 for문을 무조건 벗어나게 된다. 이때 강제로 블록을 벗어난 경우가 아니라면 else 블록을 수행하게 된다는 점을 기억해야 한다.

아래는 for문을 이용하여 0에서 9까지 값을 출력한 예제이다.

 >>> for i in range(10) :
...     print i
...
0
1
2
3
4
5
6
7
8
9
>> _

range()

for문이 C/C++와 달리 조건식이 없다고 이야기했다. 조건식이 없다면 어떤식으로 다양한 형식으로 값을 만들 수 있을까? 이는 range()를 통해 처리 가능하다.

>>> range(10)  # 0에서부터 10 이전 숫자로 구성된 리스트를 만들어 낸다
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> _

위 예에서 볼 수 있듯이 range()를 사용자가 원하는 만큼의 숫자를 리스트로 만들어 낼 수 있다. 즉, for문은 다음과 형태도 가능함을 의미한다.

>>> for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] : # 리스트로 대체함
...     print i
...
0
1
2
3
4
5
6
7
8
9
>>> _

0에서 부터 시작이 아니라 1에서 시작하고 싶을때는 어떻게 할까?

>>> range(1,10)  # 1에서 시작하여 10 이전 숫자로 구성
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> _

홀수 또는 짝수로 된 리스트를 만들 수는 없을까?

>>> range(1,10, 2) # 1에서 시작하여 10 이전 숫자인데 2씩 건너뜀 (홀수)
[1, 3, 5, 7, 9]
>>> range(0,10, 2) # 0에서 시작하여 10 이전 숫자인데 2씩 건너뜀 (짝수)
[0, 2, 4, 6, 8]
>>> _

이처럼 ragne()만으로도 다양한 형태의 수를 만들어 낼 수 있다. 물론 리스트의 형태로 만들어 낸다. 리스트의 형태로 만들어 낸다는 것은 단순히 숫자로만 구성되지 않을 수도 있다는 의미이다.

>>> for i in [1, 2, 3, 'hello'] : # 문자열도 입력 가능하다
...     print i
...
1
2
3
hello
>>> _

5. while 문

for문은 반복의 숫자가 정해진 경우에 사용한다면 while문은 언제 끝날지 알 수가 없을 때 사용한다. for문에 조건식이 없었던 반면 while에는 조건식이 존재한다. 아래는 while문의 형식이다.

조건식이 존재한다는 것만 제외하면 for문의 동작 원리와 동일하다. 0에서 9까지 출력하는 예제를 while문을 사용하면 다음과 같다.

>>> i = 0
>>> while i < 10 :
...     print i
...     i += 1
...
0
1
2
3
4
5
6
7
8
9
>>> _

6. 결론

파이썬에서 지원하는 제어문에 대해서 알아보았다. C/C++에는 do ~ while문이 존재하지만 파이썬에는 없다. 이는 while문으로 충분히 구현 가능하기 때문에 문제되지 않는다. 즉, 파이썬은 가장 간단한 형태의 문법만을 유지하여 제어문을 구현하고 있다.

파이썬을 계속적으로 사용하다보면 3개의 제어문으로도 프로그램 흐름을 제어하는데 문제가 없다는 것을 알게 될 것이다.


####Update

  • 2015-10-03 : 최초로 작성


크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.