메뉴

문서정보

목차

값(Value)와 타입(Type)

값(Value)은 숫자나 문자로 프로그램의 가장 기본이 되는 요소다. 지금까지 우리가 본 값은 1,2와 "Hello, World!"다.

이 값들은 각각 고유한 타입을 가진다. 예를 들어 1,2와 같은 숫자는 integer 이고 "Hello, World!"와 같은 문자열은 string 타입에 해당된다. 개발자와 인터프리터는 따움표로 묶여 있는 것을 보고, string 타입의 값인지를 알 수 있다. 어떤 경우에는 인터프리터가 값의 타입을 알려주기도 한다. 인터프리터가 개발자에게 값의 타입을 알려주는 것은 파이선 언어의 특징이다. C, C++ 같은 언어들은 개발자가 값의 타입을 명확히 결정해서 (인터프리터 혹은 컴파일러)에게 알려줘야만 한다.

파이선에서는 아래와 같이 타입을 알아낼 수 있다.
>>> type("Hello, World!")
<type 'str'>
>>> type(17)
<type 'int'>
>>> 
문자열은 str 타입이고, 정수는 int 타입이다. 소숫점이 있는 숫자는 float, 부동 소숫점으로 표현한다.
>>> type(3.2)
<type 'float'>
그렇다면 17과 3.2는 어떤 타입일까 ? 숫자처럼 보일 수 있겠으나 따움표로 묶여있으므로 문자열 str 타입이다.
>>> type('17')
<type 'str'>
>>> type('3.2')
<type 'str'>
1,000,000은 어떨까 ? int 일까 str 일까. 이런류의 처리는 언어에 따라 다르다. C 처럼 엄격한 언어들은 아예 컴파일이 되지 않을 것이다. 파이선은 좀 너그러워서, 굳이 에러까지 뱉지는 않고 적당하게 처리해 준다.
>>> 1,000,000
(1, 0, 0)
말 그대로 정말 자기 맘대로 해석한다. 파이선은 1,000,000을 쉼표로 구분된 정수 시퀀스로 해석한다. 뭔가 애매모호한 정보를 에러로 처리한 것이냐, 나름대로 처리해 줄 것이냐 하는 것은 언어의 지향점에 대한 문제다. 이런 파이선의 특징을 좋게 보는 개발자도 있지만, 명확하지 않아서 싫다고 하는 개발자도 있다.

내 입장은 "명확한 방법을 두고 굳이 명확하지 않은 방법을 쓸 필요는 없다"이다. int를 표현하고 싶다면 1000000, 문자열로 표현하고 싶다면 1,000,000을 쓰면 될 일이다.

변수(variables)

프로그래밍 언어의 가장 강력한 기능은 변수에 대한 조작이다. 변수란 값을 저정한 공간을 참조하기 위한 이름이다. 할당문을 이용해서 새 변수를 만들고 여기에 값을 저장 할 수 있다.
>>> message = 'And now for something completely different'
>>> n = 17
>>> pi =  3.1415926535897932
이 예제에는 세 개의 할당문이 있다. 첫 번째 줄은 message라는 이름의 변수에 문자열을 할당한다. 두번째는 변수 n에 17을 할당하고, 마지막 줄에서 변수 pi에 파이의 근사치를 대입한다.

변수는 종이와 연필을 이용해서도 표현 할 수 있는데, 일반적으로 화살표를 이용해서 나타낼 수 있다. 이런 종류의 그림을 상태 다이어그램이라고 부른다. 각 변수의 상태를 나타내기 때문이다.

 상태다이어그램

변수의 타입은 저장하고있는(가리키고 있는) 값의 타입이다.
>>> type(message)
<type 'str'>
>>> type(n)
<type 'int'>
>>> type(pi)
<type 'float'>

변수의 이름과 키워드

보통 프로그래머는 변수에 저장된 값의 의미를 쉽게 알 수 있도록 변수의 이름을 만든다. 잘 만들어진 변수 이름은 그 자체가 문서의 일부분으로 기능 한다.

변수 이름의 길이는 유저가 정할 수 있다. 문자와 숫자 모두를 포함 할 수 있지만 반드시 문자로 시작해야 한다. 변수 이름의 첫 문자로 대문자를 사용해도 괜찮지만 소문자로 시작하는게 좋다.(이유는 나중에 설명한다.)

밑줄문자(언더바라고 보통 부른다.)는 my_name, airspeed_of_unladen_swallow와 같이 여러 단어로 구성된 이름을 만들기 위해서 사용한다. 잘못된 변수 이름을 사용하면, 문법에러를 출력한다.
>>> 76trombones = 'big parade'
  File "<stdin>", line 1
    76trombones = 'big parade'
              ^
SyntaxError: invalid syntax
>>> more@ = 1000000
  File "<stdin>", line 1
    more@ = 1000000
        ^
SyntaxError: invalid syntax
>>> class = 'Advanced Theoretical Zymurgy'
  File "<stdin>", line 1
    class = 'Advanced Theoretical Zymurgy'
          ^
SyntaxError: invalid syntax
76trombones은 숫자로 시작하고 more@ 는 @를 포함해서 에러인 것은 알겠다. 그런데 "class"는 뭐가 문제일까?

class는 파이선의 키워드다. 파이선은 프로그램을 만드는데 필요한 수십가지의 키워드를 미리 정의하고 있다. 이런 키워드들은 파이선이 내부적으로 사용하는 것이므로 변수이름등으로 사용하면 안된다.

파이선2는 31개의 캐워드를 가지고 있다.
and       del       from      not       while    
as        elif      global    or        with     
assert    else      if        pass      yield    
break     except    import    print              
class     exec      in        raise              
continue  finally   is        return             
def       for       lambda    try

연산자와 피연산자

연산자는는 덧셉이나 곱셈 같은 연산을 위해서 사용하는 특수한 심볼이다. 연산자라고 부르기도 한다. 피연산자는는 연산자를 사용하는 값이다.

대표적인 연산자로 +, -, *, /, ** 등이 있다. 아래의 예제를 보자.
20+32   hour-1   hour*60+minute   minute/60   5**2   (5+9)*(15-7)
다른 언어에서 ^는 지수로 사용하지만 파이션에서는 XOR연산자로 사용한다. XOR연산자는 비트연산자라고 부른다. 이 책에서는 비트연산자를 다루지 않는다. 비트 연산자를 공부하고 싶다면 Bitwise Operators문서를 참고하자.

아래 예제를 보자.
>>> minute = 59
>>> minute / 60
0
minute의 값은 59이고 이 값을 60으로 나눴다. 제대로 계산을 하자면 0.98333이 나와야 할 텐데, 0이 나왔다. 파이선은 두 개의 피연산자(오퍼랜드)가 정수라면 그 결과도 정수로 계산하기 때문이다. 파이선은 부동소수점 결과를 정수형으로 변환하는데, 이때 소수점 이하를 round(버림)연산을 한다. 이런 이유로 0이 나온다.

파이선3는 "//"이라는 부동소수점 계산을 위한 연산자를 제공한다. 이 연산자를 이용하면 부동소수점 결과를 얻을 수 있다. 만약 피연산자중 하나가 부동소수점 숫자라면, 부동소수점 값을 반환한다.

>>> minute/60.0
0.9833333333333333

표현식과 문장

표현식은 값, 변수, 연산자 그리고 피연산자로 구성된다.

Interactive mode and script mode

인터프리터 언어의 큰 장점 중 하나는 완전한 코드를 담은 스크립트를 실행하는 것 외에도, 코드를 한줄 한줄 입력하고 그 결과를 보면서 실행할 수 있다는 거다.

예를 들어 당신은 파이선을 계산기로 사용 할 수 있다.
>>> miles = 26.2
>>> miles * 1.61
42.182
첫번째 줄에서 miles변수에 값을 할당했다. 아직은 출력되는게 없다. 두번째 줄은 표현식이기 때문에 인터프리터는 이를 평가하고 결과를 출력한다.

만약 스크립트로 실행했다면, 아무런 정보를 출력하지 않을 것이다. 스크립트에서는 표현식을 평가하기는 하지만 출력을 지시하지 않으면 값을 표시하지는 않는다. 스크립트에서는 아래와 같이 코드를 만들어야 한다.
miles = 26.2
print miles * 1.61