제어문까지 왔다면 이제부터는 재미를 좀 붙일 수 있다.
제어문은 거의 대부분의 언어에 기본으로 장착된 개념이다. 이거는 하나의 개념을 배우면 다른 언어에서도 자연스럽게 적응할 수 있다. 약간의 문법 차이는 있으나 기본적으로 제어문이 하는 일은 같다.
아래의 그림은 FLOW CHART 이다. 어디선가 본 적이 있을 것이다. 시작과 종료 사이에 조건에 따라 분기한다. 프로그램의 경우의 수가 2개다. 시작과 종료는 순차적 프로그램의 방향이다. 모든 프로그램에게는 시작이 있고 종료가 있다. 세분화해서 이야기하면 아주 깊은 주제다.
"Life is too short, you need Python"
인생은 매우 짧으니 파이썬은 설명이 쉬워야 한다. if문은 길을 선택하는 것이다.
if문의 문법이다.
if 조건식 :
코드블록
if문법은 조건식이 불형을 리턴하면 True 일 경우 코드블록을 실행하고 False 인 경우 코드블록을 건너뛴다. 이때 코드블록에는 들여쓰기가 들어가야 한다. (indentation 은 IDLE 에서 자동으로 주지만 보통 공백 4칸을 많이 쓴다.)
*예제는 다음과 같다.
direction = "right"
if direction == "right":
print("You go right")
if direction == "left":
print("You go left")
if direction == "center":
print("You go center")
결과는 당연히 You go right 이다. 세번의 분기가 있었다. 두번째 세번째 길도 갈 수가 있으나 direction 변수 하나만 있다면 세 길중 하나만 택하게 된다.
이렇든 if문은 심오한 부분이 있다. if문은 두갈래 선택을 원하지만 if문을 연결해서 사용하면 경우의 수는 다양해진다.
if문을 연결해서 쓰면 계속해서 조건식을 검사한다. 우의 예제는 세번이나 조건을 검사한다. 검사 숫자를 줄이는 한가지 방법은 if else를 사용하는 것이다.
if else 문도 똑같다. 둘중 하나가 실행된다. 그런데 if문을 검사해서 True면 else문은 실행하지 않는다. 반대로 if문이 False가 되면 else문이 자동 실행된다.
direction = "I don't know"
if direction == "right":
print("You go right")
else:
print("You go left or Center")
-결과값 : You go left or Center
이 코드는 한번만 검사를 한다. right가 아니면 else문을 자동실행시킨다. 그러니까 else문에 조건이 없는 것이다. 철저한 흑백논리다. "인문계가 아니면 이공계다." 이런 말과 같다.
편하긴 하지만 세상에는 흑백논리로 해결이 안되는 일도 많다. 따라서 새로운 방법을 사용한다.
elif 문은 else if의 약자이다. 이것은 조건을 더 따져볼 수 있게 한다. if부터 조건 검사를 하다가 하나만 실행이 되면 나머지 코드는 검토 할 필요없이 종료한다.
direction = "left"
if direction == "right":
print("You go right")
elif direction == "left":
print("You go left")
else:
print("You go Center")
-결과값: You go left
elif 문의 숫자에는 딱히 한계가 없다. 만들고 싶은 만큼 만들어도 된다. 허나 좋은 코딩을 만들고 공유하려면 최대한 간결하게 하는게 좋다. 실제 발생가능성이 0.000001도 없는 경우에(아주 희박한 경우를 말함. 컴퓨터에서 0.000001 은 높은 수치임) 대한 코드가 주를 이룬다면 소위말하는 가성비가 낮다.
direction = "left"
if direction == "right":
print("You go right")
elif direction == "left":
print("You go left")
elif direction == "back":
print("You go back")
elif direction == "another world":
print("You go another world")
else:
print("You go Center")
그러니까 진짜로 있음직한 상황에 대해서만 코드를 짜는것이 기술이다. 그런 사고방식은 스스로 깨우쳐야 한다... 고 하지만 일반적 수준이면 충분하다. 내가 길을 가는데 오른쪽과 왼쪽 두 개 중에 선택하는 경우는 많이 있다. 그런데 4차원의 세계로 가는 길은...?? 있을지 모르겠으나(정말 궁금하다) 그런 경우는 보통 사람은 생각 안하는게 정상이다.
if조건문은 컴퓨터에게 인공지능을 부여할 수 있다. AI는 결국 우리에게 수많은 논리게이트와 if문을 빠져나온 대답을 들려주는 기계이다. 옛날의 컴퓨터와 다른 점은 if 라는 질문을 수백만번 연산한 다음에 말해주니까 매우 그럴싸 하다는 것이다. 2016년 알파고가 이세돌을 이겼을 때 바둑 한수를 두기 위해서 초당 10만개의 수를 고려한다고 했다. 엄청난 숫자다. 단순한 if 조건문의 연속이라도 초당 10만개라는 것은 충분히 인간에게 의미있는 숫자를 만들기 충분하다.
많은 경우 전통적 프로그래밍 언어책이 좀 그렇다. 이걸 배우는 목적은 거의 설명하지 않고, 이 교재로 수업을 듣는 사람들이 이미 공학도라는 가정을 한다. 그것도 아주 철저한 마인드의 공학도라고 생각한다.
그래서 흥미를 잃기가 쉽다. 아니면 수업이 끝나면 잊어버린다. 코딩을 배워서 AI같은 흥미진진한 일상 생활의 대화로 이끌어 오는 것은 힘들다.
그래서 if문을 하나 배우더라도 잠깐만 더 생각해보면 많은 의미를 가져갈 수 있다는 말이다. if문은 조건에 따른 코드 블록을 운영하는데 원리는 논리게이트의 확장이라고 볼 수 있다.
위와 같이 1과 0을 가지고 분기하던 방식을 확장해서 if 조건문에는 복잡한 연산도 가능하고 코드블록도 유기적으로 만들 수 있다. 불형 연산에 대하여는 아래 이전 포스트를 참고한다.
direction = "whatever"
if direction == "right":
print("You go right")
else:
if direction == "left":
print("You go left")
else:
print("You go Center")
중첩된 if문을 nested if statement 라고 한다. 제어문들은 얼마든지 그 안에서 중첩시킬 수 있다. 너무 많이 중첩시키지 않고 프로그램의 목적에 따라 적절하게 중첩시키는 것이 필요하다. 여기서는 들여쓰기 규칙을 준수해야지 않그러면 오류가 난다. 파이썬이 다른 문법들은 대체로 유연한데 유독 들여쓰기 indentation 에 있어서 철저하다. 이것이 전통적 언어에 익숙한 사람들을 괴롭히는 원인 중 하나이다. 가독 스타일이 전혀 다르다.
어디서 소스코드를 긁어와서 실행시켜 볼려해도 나의 indentation 과 맞지 않으면 수십개의 오류 메시지가 좌절감을 줄 수 있다. 한 가지 방법은 IDLE의 권장 세팅을 사용하는 것이다. if 조건문: 후 엔터를 치면 커서는 자동으로 들여쓰기 구간에 진입한다. 또한 Pycharm이나 VSC 등의 IDLE에서는 가이드와 오류표시(빨간줄) 가 나와서 수정에 도움이 된다.
들여쓰기는 좀 주의해서 봐야한다. 잘 들여쓰면 가독성이 높아지는 것도 어느정도 사실이라 볼 수 있다. 허나 { } <- 코드블록에 이거를 더 좋아하면 어쩔 수가 없다. 이것은 미의 문제도 있다. 남들에게 강요할 필요도 강요받을 것도 없다.
또하나 : (콜론)을 찍는 것을 잊으면 안된다. 기존 언어의 사용자들에게 혼란스러운 부분이다. Java 나 C에는 이게 없다. 파이썬은 콜론을 찍어야 다음 라인으로 이동하는 줄 안다. 나도 지금도 자주 범하는 오류다. IDLE가 있기 때문에 찾아내는 것은 쉽다.
사실 오픈소스란게 다들 자기 스타일이 있을 수 밖에 없지만... 자체적인 규약은 필요하다. 궁금한 사람은 PEP 8이 세계적으로 통용되고 있으므로 아래 문서를 참고한다. 호불호가 있으니 자기 상황에 적응시키도록 한다.
https://www.python.org/dev/peps/pep-0008/
코드를 공유한다면 타인이 짐작할 수준에서 중첩시킨다. 혼자만 사용할 거면 상관은 없다. 재미로 복잡하게 만들어 보는 것도 학습이 된다. 다들 하지 말라는 코딩 규칙이 있는데 왜 그런지 이유는 잘 안가르쳐준다.
if문과 for문 while 문을 조합해서 CPU에게 초당 백만단위의 일을 시켜보면 왜 그런지 바로 알게된다. 자기 PC의 CPU가 불타는걸 원하는 사람은 아무도 없다. 컴퓨터는 여전히 비싸고 예민한 제품이기 때문이다. 단 그렇게 CPU를 혹사시킨 책임은 스스로가 져야한다.
인터프리터를 사용해서 자신만의 코드를 연습해보고 다음 단계로 넘어간다.