반응형

Python의 가장 큰 특징은 그 독특한 "구문(statement)"스타일에 있다. "들여쓰기(intent)"를 이용한 구문 작성 및 기본적인 제어 구문에 대해 설명한다.


구문과 들여 쓰기의 관계

프로그래밍 언어로는 "값"과 "계산"이 기본라고 했었다. 그럼, 다음에 중요한 것은 무엇일까요? 여러가지 생각나는 것이 있지만, 아마 프로그램의 "제어"일 거다.

단지, 명령을 순차적으로 실행하는 것만으로는 극히 제한된 사용법 밖에 할 수 없다. 프로그램의 상황에 따라 "여기는 이것을 실행", "이것은 OO번 반복"과 같이 프로그램의 흐름을 제어함으로써 보다 복잡한 프로그램이 만들 수 있게 되기 때문이다.

이러한 프로그램의 움직임에 대해 이것 저것 지시하기 위해 준비되어 있는 것이 '구문'이라는 것이다. 그 중에서도 그 흐름을 제어하기 위해 마련된 것을 "제어 구문(control statement)"라고 한다.

Python의 구문 표기법은 매우 독특하다. 그것은 "들여 쓰기"를 사용한 방법이다. "들여 쓰기"란 텍스트의 시작 위치를 탭이나 공백으로 오른쪽으로 보내는 것이다.

Python에서는 다양한 구문이 들여 쓰기를 사용하여 작성한다. 예를 들어, 구문에서 "이런 경우 다음 작업을 수행한다"라는 것을 설명한다고 하자. 그러면, 그 구문 중에 준비하는 처리는 그거보다 오른쪽으로 들여 쓰여져 있다. 그리고 그 들여 쓰기 위치에서 쓰여져 있는 것이 "그 구문 안에 처리"라고 판단되는 것이다.

그 구문을 끝내고 원래대로 돌아가려면 이전 위치로 들여 쓰기를 되돌린다. 즉, Python은 "그 문장이 어떤 위치에서 쓰기 시작하고 있는가"에 따라 어떤 구문의 처리인가를 인식하는 것이다.

간단히 이해를 돕기 위해 아래의 구문 작성 내용을 보도록 하겠다.

Python 구문 작성

보통 문장 ......
구문 그 1
     구문 1의 처리 ......
     구문 1의 처리 ......
     구문의 1에 또한 구문
         그 또한 중 처리 ......
         그 또한 중 처리 ......
     구문 1의 처리 ......
구문 2
     구문 2의 처리 ......
보통 문장
보통 문장
...... 중략 ......

이런 식으로 문장의 시작 위치를 조금씩 다르게 하여 구문이 작성된다. 이는 들여 쓰기 공백 수를 잘못하게 되면 문법적인 에러가 발생하기도 한다는 것을 의미한다.

Python 들여 쓰기는 일반적으로 탭 대신 공백이 사용된다. 표준으로 공백 8개 문자씩 넣는 방식이 많지만, 이것은 특별히 정해져 있는 것은 아니고, 4개 문자도 2개 문자로도 인식하고 동작한다.

단, 너무 공백 수가 적으면 문법의 구성이 알아 보기 힘들어 지거나, 들여 쓰기가 실수가 증가하기도 하고, 공백 수가 너무 많으면 점점 문장이 오른쪽으로 이동하여 문장의 끝이 보이지 않게 될 수도 있다. 그러기에 적당한 폭을 생각하면서 쓰도록 하자.



조건 분기의 기본은 "if"구문

제어 구문을 크게 나누면 "조건 분기"와 "반복"으로 구성되어 있다. 우선 조건 분기부터 살펴 보겠다.

조건 분기는 문자 그대로 "조건에 따라 처리를 분기한다"는 것이다. 그 기본은 양자 택일의 분기하는 "if"구문이다. 이것은 다음과 같은 형태를 하고 있다.

if의 기본형 (1)

if 조건:
    옳았을 때의 처리

if의 기본형 (2)

if 조건:
    옳았을 때의 처리
else:
    잘못된 때의 처리

if 문은 여러가지 작성 방법이 있다. 기본은 조건을 확인하고 그것이 옳았을 때에 작업을 수행한다는 것이다. 이것은 if문 후에 검사 조건이 되는 것을 쓰고 콜론(:)을 쓴다. 그러고 그 이후의 들여 쓰기된 부분을 수행한다.

옳았을 때의 처리와는 별도로 잘못된 경우에도 어떤 처리를 하고 싶다면, 옳았을 때 수행할 처리가 끝나는 곳에, 들여 쓰기를 if 위치로 돌아가서 "else :"라고 쓴다. 그리고 또 오른쪽으로 들여 쓰기하여 수행 할 서치를 작성하면 된다.

또한 조건을 하나뿐만 아니라 차례로 확인하는 "elif:"와 같은 것도 있지만, 일단은 "if ~: ", "else : " 2개만 기억해두면 충분하다.

아래에 간단한 예제는 아래와 같다.

x = 1234
check = x % 2
if check == 0: 
    print(str(x) + "는、짝수입니다.") 
else: 
    print(str(x)  + "는, 홀수입니다.") 
print("....end.")

변수 x가 짝수인지 홀수인지를 검사 프로그램이다. x를 2로 나눈 나머지를 확인하고, 그것이 제로인지 여부에 표시할 텍스트를 변경하고 있다. 변수 x의 값을 다양하게 변경하여 동작을 확인해 보자.



조건은 어떻게 쓰는거야?

이 if문을 사용하기 위해서는 '조건'이라는 것을 어떻게 작성해야 해야 할지가 중요하다. Python이라는 프로그래밍 언어를 이해하는데 있어서 조건은 꼭 알아야 한다. 조건에 대해 정리하면 대략 다음과 같다.

숫자를 비교하는 식

가장 많이 쓰는 것은 숫자를 비교하는 식이다. 이전 페이지 샘플도 숫자 비교 식을 사용했다. 두 값을 비교하여 "어느 쪽이 큰지"라든가 "같은 값인지에 대한 여부"등을 체크하는 식이다. 이것은 다음과 같은 기호가 준비되어 있다.

기호설명
값1 == 값2값1과 값2는 동일하다.
값1 != 값2값1과 값2는 같지 않다.
값1 < 값2값1보다 값2 더 크다.
값1 <= 값2값1보다 값2 쪽이 크거나 같다.
값1 > 값2값1보다 값2 쪽이 작다.
값1 >= 값2값1보다 값2 쪽이 작거나 같다.

부울 값과 변수

"부울"이라는 것은 "옳고 그른지? "라는 양자 택일에 대한 값이었다. 이것은 True 또는 False의 값 중 하나였다. if문에는 그 후의 변수와 값이 True이면 다음의 작업을 수행한다. False라면 작업을 수행하지 않거나 또는 else: 이후의 처리를 실행한다.

결론

사실은 "숫자를 비교하는 식"과 "부울 값과 변수"는 어느 쪽도 같은 것이다. 첫번째에서 "두 값을 비교하는 식"에서는 두개의 식을 비교한 결과를 논리 값으로 반환하는 역할을 한다. 즉, 상세히 따져보면 "True인가? False인가?"에서 모든 if 조건문의 결정이 가능하다는 것이다.



조건에서 반복 while 문

이어서, 또 하나의 제어 구문 "반복"에 대해 알아보겠다. 반복은 2개의 구문으로 되어 있다. 첫번째 조건을 사용하여 반복을 체크하는 "while"구문이라는 것이다.

while 구문의 기본형 (1)

while 조건:
    반복 처리 ......

while 구문의 기본형 (2)

while 조건:
    반복 처리 ......
else :
    반복 종료시 처리 ......

여기에서도 "조건"라는 것이 등장했다. 이것은 if에서 나온 조건과 동일하다. 즉, "True인가? False인가?"를 확인하는 수식 및 변수 혹은 값이다.

이 while 구문은 조건을 확인하고 그것이 True인 동안에는 그 구문의 처리를 반복 실행을 계속한다. 그리고 조건이 False가 되면 반복에서 빠져 나와 다음 처리를 한다. 만약, else:문이 있었다면, 반복을 빠져 나오면서 이를 실행한다.

아래에 간단한 샘플을 보도록 하자.

x = 100
count = 1
total = 0
while count <= x: 
    total = total + count 
    count = count + 1
else: 
    print(str(x) + "까지 합계는 " + str(total) +"이다.") 
print(".....end.")

1에서 변수 x까지의 합을 계산하고 표시하는 샘플이다. x의 값을 다양하게 변경하여 결과를 확인해 보도록 하자.

이 샘플에서는 "while count <= x:"와 같은 while의 조건을 설정한다. 즉, count 값이 x보다 작거나 같은 동안 반복을 계속하고, x보다 커지면 빠져 나오게 된다.

결국은 당연 하지만, 반복 실행하는 과정에서 변수 count 값이 조금씩 커지게 하지 않으면 안된다. 그렇지 않으면, while에서 영원히 벗어날 수 없게 되어 버린다. 이런 경우를 "무한 루프"라고 한다. while을 사용할 때에는 이런 무한 루프에 빠지지 않도록 조건의 내용과 그 결과가 반복에서 어떻게 변화해 가는가를 잘 생각해서 작성을 해야 한다.



많은 값을 순서대로 반복하는 for구문

사실, 반복에는 또 다른 구문이 있다. 그것은 "for"구문이다. 이 for는 "많은 값을 순서대로 처리하는 경우"에 사용한다

for 구문의 기본형 (1)

for 변수 in 많은 값:
    반복 처리 ......

for 구문의 기본형 (2)

for 변수 in 많은 값:
    반복 처리 ......
else :
    반복 종료시 처리

프로그래밍 언어에는 "많은 값을 한곳에 모아 처리하는 기능"이 준비되어 있다. for는 그러한 것들을 위한 전용 반복 구문이다. 즉, 많은 값을 차례로 꺼내 처리를 실행하는 것은 결국에 준비되어 있는 모든 값에 대해 반복을 하는 것이다.

이 "많은 값"이라는 것이 무엇인가 대해 실제 사용 예제로 알아보도록 하자. 아래의 예제는 이전 페이지에서 while에 대한 샘플을 for 구문에 쓰고 다시 작성한 거다.

x = 100
total = 0
for n in range(1, x + 1): 
    total = total + n 
else: 
    print(str(x) + "까지의 합계는 " + str(total)) 
print("....end.")

여기에서는 range(...)는 본 적이 없는 것이 사용되고 있는데, 이것은 "1에서 변수 x까지의 모든 숫자를 하나의 묶음으로 만드는 함수"이다. 이것으로 "1,2, 3 ... 100"는 모든 숫자를 하나의 묶음을 만들고 그 하나 하나를 꺼내 total에 더해 가고 있는 거다.

그런데, 이 for문을 사용하기 위한 포인트는 "많은 값을 모은 것"이라는 게 무엇인가? 라는 점인데, 이것은 일반적으로 "배열"라는 것이다. 다음에는 배열과 그와 관련된 것에 대해 설명하기로 하겠다.

반응형

'Python' 카테고리의 다른 글

[Python] 클래스 사용  (0) 2017.12.22
[Python] 함수(function)  (0) 2017.12.22
[Python] 리스트, 튜플, 레인지, 세트, 사전  (0) 2017.12.22
[Python] 구문(statement)  (0) 2017.12.22
[Python] 우선 값과 계산의 기본  (0) 2017.12.22
[Python] Python 개발 환경  (0) 2017.12.22

+ Recent posts