파이썬 강좌 – 명령문, 표현식 ~ 문법을 이루는 것들

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

우리는 지금껏 많은 문법적인 요소를 배웠습니다. 많은 것들은 서로 얽히고 섥히는데요, 예를 들면 대입문의 왼쪽에는 변수 하나만 올 수 밖에 없었지만 오른쪽에는 연산자부터 시작하여 함수 호출이나 온갖 것이 올 수 있었고, 또 그런 것들을 섞어서도 사용할 수 있었습니다. 어떤 것은 섞을 수 있고, 어떤 것은 그렇지 못합니다. 그렇다면, 그것들을 나누는 기준은 무엇일까요?

이번 강좌에서는 우리가 지금껏 배웠던 문법을 좀 더 정확히 이해하는 강좌이며, 문법적인 쓰임새를 알아보기보다는 문법의 설계에 초점이 두어집니다. 이 강좌에서는 어떤 새롭고 신선한 시도는 하지 않지만, 실제 파이썬 문서를 볼 때 나오는 갖가지 용어를 좀 더 정확하게 이해할 수 있게 될 것입니다.


표현식(expression)

표현식이란 평가(evaluate)될 수 있는 문법 단위를 뜻합니다. 표현식은 중첩해서 여러 번 사용할 수 있습니다. 또한 표현식이 평가되는 순서 또한 엄밀하게 정해져 있는데요, 일일히 다 외울 필요는 없고 필요할 때마다 보면 됩니다. 아래 내용은 우리가 지금까지 써왔던 익숙한 물건들을 한번 더 점검하는 느낌으로 보시면 됩니다.


이름

이름으로부터 값을 불러옵니다. 이름이란 곧 변수를 뜻합니다. 파이썬 인터프리터가 a = b라는 대입문을 보게 되면 제일 먼저 변수 범위 내에서 b라는 변수가 실존하는지 찾습니다. 만약 있다면, 거기에 해당하는 값을 가져옵니다.

문맥과 상관없이 이름이 등장한다면 오류가 발생합니다. 아래 예제에서는 ab가 공백으로 구분되어 사용되었는데, 이는 어떤 문법도 해당하지 않으므로 파이썬 인터프리터는 뭐 어쩌라고? 라는 짜증나는 말투로 에러를 발생시킵니다.

a = 10
b = 20
print(a b)
  File "c:/Users/tooth/Desktop/test2.py", line 3
    print(a b)
            ^
SyntaxError: invalid syntax

리터럴

리터럴(숫자, 문자, 리스트 등)로부터 값을 불러옵니다. 리터럴이란, 소스 코드에 작성된 고정된 값을 의미합니다. 우선 문자 리터럴부터 살펴볼까요? 파이썬 인터프리터가 a = "안녕하세요"라는 대입문을 맞닥뜨렸을 때에는 쌍따옴표로 둘러싸여진 문자들의 나열을 인식하게 됩니다. "안녕하세요"라는 문자열이 의미하는 바는 절대 변하지 않습니다. "안녕하세요" = "하이" 처럼 실질적인 의미를 바꾸려는 시도는 SyntaxError: cannot assign to literal 라는 에러 메시지로 프로그램을 실행도 못하게 합니다. 문자 리터럴은 잘 알다시피 쌍따옴표 뿐만 아니라 '문자열'과 여러 줄에 걸친 문자열에 쓰이는 '''긴문자열''', """긴문자열"""도 해당합니다.

a = 13에서 13과 같은 숫자도 마찬가지로 동작합니다. 13은 어찌보면 쌍따옴표 없이 숫자 문자가 두 개 이어진 형태인데, 이를 실제 계산할 수 있는 십진수 13이라는 수로 취급하게 됩니다. 우리에게는 십진수가 너무 익숙하여 자연스럽게 쓰지만, 사실 수라는 개념은 실체하지는 않지요. 손가락으로 ?? 해도 13을 의미할 수 있는 것처럼, 파이썬에서도 2진법, 8진법, 16진법 등 다양한 표기를 지원합니다.

a = 0xd
b = 0o15
c = 0b1101
d = 13
print(a, b, c, d)
13 13 13 13

리스트 리터럴은 []로 둘러싸여져 있고, ,로 구분되어 나열된 여러 개의 표현식으로 이루어집니다. 흔히 알다시피 [1, 3, 5] 이런 모양입니다. 튜플(1, 2, 3) 이렇게 표현하지요. 딕셔너리와 세트도 다 방법이 있다는 건 이미 배웠습니다!


속성 참조

속성이란 어떤 객체 안에 포함되어있는, 이름을 가진 객체들입니다. a.b를 하게 되면 우선 a라는 이름을 찾을테고, 그 다음 a라는 변수 내부에 b라는 속성이 있는지 검사하게 됩니다. 메소드같은 경우가 헷갈릴 수 있는데요, 메소드를 호출할 수 있는(Callable) 속성이라고 취급할 수가 있어서, 전부 통용될 수 있습니다. 아래 예제의 두 번째 줄에서는 append라는 메소드를 불러오고 있습니다.

ls = [2, 3]
ls.append(1)
print(ls)
[2, 3, 1]

항목 참조

항목 참조란 앞선 것 바로 뒤[...]를 쓰는 것입니다. ...에는 또 다른 표현식이 들어가도 상관없습니다. 리스트 리터럴과는 다른 점이, 리스트 리터럴은 아무것도 없는 데서 대괄호가 시작했다면, 이 항목 참조는 앞선 것이 반드시 존재해야 합니다. 이는 리스트의 항목에 접근할 때 사용하는 그 대괄호가 맞습니다. 한가지 TMI를 방출하자면, 항목 참조가 작동하는 방식은, 앞선 것에 __getitem__ 메소드가 구현되어 있다면, 그 메소드를 호출시킵니다. 아래 예제는 우리가 흔히 쓰는 리스트와 직접 만든 클래스를 보여줍니다.

ls = [1, 2, 3]
print(ls[1])

class Test:
    def __getitem__(self, i):
        print("아이템 겟또다제-!", i)

a = Test()
a[6]
2
아이템 겟또다제-! 6

연산 (각종 연산자)

연산자는 훨씬 간단합니다. 마음가는 대로 쓰세요. 연산자는 대응되는 특별 메소드가 존재하므로 확장하기도 쉽답니다.

print(3 + 4 - 2)
5

호출 (call)

앞선 표현식 바로 뒤에 괄호()를 쓰면 호출(call)하게 됩니다. 괄호 내부에는 인자로 넘길수 있도록 여러 개의 값이 들어갈 수 있습니다. 우선 앞선 것이 변수가 될수도 있고, 어떤 계산 결과가 될 수도 있고, 정확히 뭐가 올지는 모릅니다. 하지만 무엇이 되었든 일단 호출할 수 있는건지 아닌지 체크를 해본 다음, 호출할 수 있다면 호출해버리고 그렇지 않다면 에러를 냅니다.

아래 예제에서는 함수(g)를 리턴하는 함수(b)를 리턴하는 함수(r)의 호출 과정을 보여줄 수 있습니다. 예제가 다소 작위적이긴 하지만, 괄호를 연속으로 써서 연속으로 호출할 수 있다는 것을 알 수 있습니다.

def r():
    def b():
        def g():
            print("rgb!")
        return g
    return b
r()()()
rgb!

만약 호출할 수 있는(callable) 객체가 아니라면 에러를 발생합니다.

a = 3
a()
Traceback (most recent call last):
  File "c:/Users/tooth/Desktop/test2.py", line 2, in <module>
    a()
TypeError: 'int' object is not callable

에러 메시지를 살펴보면, int 형의 객체는 호출할 수 없다고 나옵니다.


파이썬에서는 슬라이싱이나 await 표현식 (추가 예정) 등도 표현식에 포함된다고 정의하고 있지만, 앞서 살펴본 이야기에서 크게 벗어나는 논리는 아니므로, 이러한 사례는 그때그때 접하면서 가볍게 다시 익히면 됩니다. 조건문이 아닌 조건 표현식이라는 것도 있으니 상황에 맞게 사용하면 되겠습니다!


명령문 (statement)

statement를 우리 말로 번역하면 명령문입니다. 우리가 컴퓨터의 구성요소를 배울 때 “명령“이라는 단어를 배웠다는 걸 기억하시나요? 크게 신경쓰지 마세요, 사실 여기서는 “명령“보단 ““이 더 중요합니다. 문법를 설명할 때 대입문, if 문for 문 처럼 ~~문이라고 했었는데요, 바로 그것들을 전부 포함하는 개념입니다. 파이썬에서는 한 줄에 하나만 쓸 수 있는 것을 단순문(simple statement)이라고 하며 블록 단위로 쓸 수 있는 것을 복합문(compound statement)라고 합니다. 다른 언어에서도 기본적인 골자는 비슷합니다. 우선 단순문부터 알아보도록 합시다.


단순문 (simple statement)

단순문이란 한 줄에 하나가 들어갈 수 있는 문법 단위를 뜻합니다. 다음과 같습니다. 단순문은 여러 개의 표현식을 포함할 수도 있고, 표현식이 하나도 쓰여지지 않을 수도 있습니다. 단순문 내부에는 단순문이나 복합문을 포함할 수 없습니다. 한 줄에 여러 개를 쓸 수도 없습니다.

오직 표현식으로만 이루어진 단순문이 있습니다. 이 단순문은 리터럴이나 이름으로 시작하여 각종 계산, 함수 호출, 접근 등을 할 수 있습니다. 표현식은 금방 전에 다루었으니 그것을 살펴보시면 되겠습니다.

어떤 블록에 아무런 내용도 없음을 나타내는 pass, 반복문에서 곧장 반복문을 빠져나오라는 지시를 나타내는 break, 반복문에서 다음 루프로 즉시 이동하라는 continue 등은 어떠한 표현식도 사용하지 않습니다.

함수의 반환을 의미하는 return은 뒤따라오는 표현식이 없다면 None을 반환하며 함수를 즉시 끝내고, 표현식이 등장한다면 해당 표현식을 평가한 최종 값이 반환됩니다.

가장 흔하게 사용되는 단순문인 대입문 또는 복합 대입문은 왼쪽에는 변수명 하나가, 오른쪽에는 표현식이 들어갑니다. 그 외에도 모듈을 임포트하는 import, 예외를 발생시키는 raise, 제너레이터를 만들 때 쓰이는 yield 등의 단순문이 존재하며, 이는 필요할 때 사용하면 됩니다.


복합문 (compound statement)

복합문은 단순문보다 더 큰 개념입니다. :와 들여쓰기를 통해 새로운 블록을 시작하며, 블록 내부에는 또 다시 복합문이나 단순문이 들어갈 수 있습니다. 복합문은 뒤따라오는 블록을 포함하고 있기 때문에 대개 여러 줄에 걸쳐서 작성됩니다. 불록에 대한 자세한 내용은 우리가 블록을 처음 접했던 조건문 글에서 확인할 수 있습니다.

우리가 if, elif, else를 이용해 만드는 조건문, while, for-in, else 등으로 만드는 반복문, try-except-else-finally 로 만드는 예외 처리문(try문)을 포함해 def로 제너레이터(추가 예정)나 함수를 정의하는 것, class클래스를 정의하는 것 모두 복합문입니다. 자세한 내용은 각 강좌를 참조하시면 되겠습니다.


  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to top