숫자(number) 타입은 타입 개념의 가장 기본이 되는 자료형이다. 파이썬은 복소수(실수와 허수) 전체에 대해 빌트인 타입이 존재한다. Java와 같이 주류 프로그래밍 언어들 중 빌트인 숫자 타입에 허수부를 지원하지 않는 것들도 있으므로, 특별하다고 느껴질 수도 있다. 파이썬의 숫자 타입은 정수, 소수, 복소수 타입으로 나눌 수 있다.

정수(int)

수학에서 말하는 것처럼, 양의 정수, 음의 정수, 0을 다룬다. 별도의 최대값은 없다.

정수 리터럴

먼저, 음의 0(-0)은 없다. 당연한 논리지만, JavaScript에는 실제로 양의 0과 음의 0이 나뉘어 있기 때문에 언급하게 됐다.

파이썬의 정수 리터럴은 2진수, 8진수, 10진수, 16진수 표현이 가능하다. 10진수가 아닌 정수 리터럴을 정의하는 경우, 0 뒤진법에 해당하는 영어 명칭의 첫 글자(b(binary), o(oct), x(hex))를 명시한 후 값을 정의하면 된다. 그 예는 다음과 같다 : 0b110, 0o15, 0xF1F

가독성을 높이기 위해 리터럴에 언더스코어를 사용할 수 있다. 5000050,000으로 표기하는 것과 같은 맥락이다. leading, tailing, doubly 형태를 제외하고는 자유롭게 사용 가능하다. 예를 들어, _123, 123_, 12__3은 불가능하고, 12_3_456_7은 가능하다. 표기 상의 sugar일 뿐이므로, 실제로는 언더스코어가 제거된 상태로 다뤄진다.

소수(float)

소수부가 있는 수이다. 이전 글에서도 말했듯, 파이썬은 소수를 위한 타입으로 float만을 사용한다. 파이썬 버전마다 다르긴 하겠지만, 내가 사용하고 있는 Python 3.6.5에서는 소수 리터럴이 소수점 아래 15자리까지 표현할 수 있다.

소수 리터럴

e 표기법(지수 표현)을 사용할 수 있다. 그러나 음의 0이 없는 것과는 다르게 음의 0.0이 존재한다. 부동소수점을 사용하기 때문이다. 0이나 0.0의 지수 표현 결과는 0.0, -0이나 -0.0의 지수 표현 결과는 -0.0이 된다.

복소수(complex)

수학 기준으로는 복소수가 실수와 허수를 모두 포함하므로 complex 타입이 int나 float이나 모두 표현할 수 있다고 생각할 수 있으나, 여기서는 단지 허수부가 들어 있는 숫자를 다루기 위한 타입 수준으로만 생각하면 된다. 통계나 데이터 과학에 관련된 니즈가 많은 언어라 그런지는 몰라도, 빌트인으로 복소수 타입을 지원한다. 객체의 property로 실수부/허수부를, 절대값을 반환하는 빌트인 함수인 abs()에 넘기면 복소수의 크기를, conjugate 메소드를 통해 켤레복소수를 알아낼 수 있다.

복소수 리터럴

소수부+허수부 또는 허수부만으로 이루어지며, imaginary number의 약자 i 대신 j를 사용한다. 4번 라인부터는 파이썬의 복소수 타입 지원에 대한 추가적인 예제일 뿐이므로 프로퍼티, 함수, 메소드 개념을 이해하기 어렵다면 1, 2번 라인만 봐도 무방하다.

'프로그래밍 > Python' 카테고리의 다른 글

산술 연산자  (0) 2019.01.28
파이썬의 타입 시스템과 빌트인 타입, 변수 선언  (0) 2019.01.23
주석  (0) 2019.01.07
Hello World, 세미콜론은 optional하다?  (0) 2019.01.03
개요와 설치  (0) 2019.01.01

변수(variable)는 데이터의 실제 위치와 매핑되어 있는 상징적인 이름이다. 어떠한 값에 대한 참조를 가지고 있기 때문에, 특정 값을 계속해서 유지시키기 위해 사용할 수 있어 매우 중요하다. 파이썬은,

  • 런타임에 자료형을 검사하는 동적 검사
  • 이미 특정 자료형으로 정의된 변수에 다른 자료형의 값을 할당할 수 있는 동적 타이핑
  • 인터프리터가 자료형을 추론하여 알맞는 타입을 알아서 준비하는 타입 추론 또는 암시적 타입 선언(implicit type declaration)
  • 암시적 형변환(implicit type conversion)이 지원되지 않아 런타임에 타입 오류를 만나면 에러가 발생하는 강타입 언어다.
  • 이 정도가 파이썬 타입 시스템의 큰 틀이다. 이것저것 어려운 말들 많지만, 아래와 같은 코드를 작성할 수 있다는 것이다.

    인터프리터가 타입을 추론해 주기에 타입을 명시하지 않아도 되고, 동적 타이핑이 지원되기에 정수 타입의 값이 할당되어 있던 변수에 다른 타입의 값을 재할당할 수 있게 된다. 같은 동적 타이핑 언어들과 다르게, 변수 선언에 별도의 키워드(var, let 등)도 필요하지 않다. 타입 시스템 이야기는 짧게 여기서 마무리하자.

    타입과 파이썬 빌트인 타입

    컴퓨터는 전기로 작동한다. 이러한 전기 신호의 on을 1에, off를 0에 대응하고 이들을 조합한 일련의 신호는 10110110...처럼 표현할 수 있다. 이러한 숫자 체계를 수학에서는 이진수라고 하고, 이를 간단한 공식에 대입하여 우리가 흔히 이해하는 10진수로 바꿔서 표시(1101 -> 13)할 수 있다. 0과 1로 만들어지는 값은 결국 수(number)일 뿐이지만, 우리가 현실에서 마주칠 수 있는 데이터들은 수 개념에서 한정되지 않는다. 따라서 컴퓨터 과학에서는 이진수의 조합에 기술적인 기준 몇 가지를 더해 정수와 실수, 문자열 등을 구분하도록 하고 있으며, 일반적인 프로그래밍 언어들도 이러한 체계를 따르고 있다. 이들을 자료형(type)이라고 부른다.

    파이썬에서 제공하고 있는(built-in) 자료형은 크게 기본 자료형컨테이너 자료형으로 나뉜다. 기본 자료형은 아래와 같다.

    • 정수(int) : -1, 0, 1 등
    • 소수(float)복소수(complex) : 1.2, -0.8, 9i+1 등
    • 문자열(string) : 'a', 'hello', '' 등
    • boolean : True, False
    • None : 값이 없음을 의미

    다른 프로그래밍 언어들에서도 사용되는 기초적인 타입들이다. 조금 특별한 점은, 다른 언어처럼 소수 타입이 float와 double의 두가지로 분류되어 있지 않다는 것과, 문자(character)와 문자열(string)을 문자열 타입 하나로 표현하고 있다는 것이다. 그리고 이러한 타입의 데이터들을 조합하여 하나의 단위로 묶어서 다루는 컨테이너 타입들이 있다.

    • 리스트(List) : [1, 2, 3, 4]
    • 튜플(Tuple) : (1, 2, 3, 4)
    • 사전(Dictionary) : {'a': 1, 'b': 2}
    • 집합(Set) : {1, 2, 3, 4}

    이들은 논리적으로 데이터 타입인 동시에 자료 구조 ADT의 구현체기도 하다.(list는 append와 pop으로 스택의 push/pop을 구현하고 있는 등..)

    변수

    a라는 변수를 선언하며, 숫자 리터럴을 a에 할당(assign)했다. 어떤 값을 '직접 써서 표현하는 것'리터럴이라고 한다. 수학에서의 등호는 '같음'을 의미하나, 컴퓨터 과학에서의 등호는 '할당'을 의미한다. 그리고 이 할당의 방향은 오른쪽에서 왼쪽이다. 따라서, 등호를 기준으로 우변이 평가되고, 평가된 값이 좌변에 할당된다. 따라서 변수 a는 타입이 추론되어 정수 타입이 되고, 값으로 1을 가지고 있게 된다. 아래의 할당문을 보면 우변 평가, 좌변 할당이라는 순서를 조금 더 쉽게 이해할 수 있다.

    연산자 개념이 등장했지만, 수학적으로 이해하면 된다. 우변인 3 * 5 + 2가 평가되어 17이 되고, 좌변인 a에 할당되어 결론적으로는 a에 17이 할당된다. 우변에 들어간, 값들과 연산자를 함께 사용하여 수식을 표현한 것을 표현식(expression)이라고 한다. 그 자체로 평가되어 하나의 결과값으로 축약되므로, 이를 평가식이라고도 한다. 리터럴로 값을 표현해놓은 것 그 자체도 expression이 될 수 있다. 아무튼 표현식은 쉽게 보면 '간단한 수식'이지만, 언어 구조의 근간을 이루는 매우 중요한 개념이므로 숙지하고 있는 것이 좋다.

    파이썬은 아래처럼 변수에 대해 몇가지 트릭을 사용할 수 있다.

    1번 라인은 동일한 값을 가진 여러 개의 변수를 선언하는 것, 2번 라인은 서로 다른 값을 가진 변수 여러 개를 인라인으로 선언하는 것이다. 2번 라인은 사실 tuple 표현식과 unpack을 응용한 건데, 이건 나중에 알아보도록 하자. 아무튼, 이런 게 가능하다.

    파이썬의 타입 시스템부터, 빌트인 타입과 변수 개념을 알아봤다. 다음 글부터는 자료형 위주의 이야기들을 채울 예정이다.

    '프로그래밍 > Python' 카테고리의 다른 글

    산술 연산자  (0) 2019.01.28
    숫자 자료형과 리터럴  (0) 2019.01.25
    주석  (0) 2019.01.07
    Hello World, 세미콜론은 optional하다?  (0) 2019.01.03
    개요와 설치  (0) 2019.01.01

    Tree도 ADT기에, 여러 방식의 표현법이 존재한다. 트리의 차수나 노드의 수 등에 영향을 끼치지 않는, 모든 경우의 트리를 표현할 수 있는 표현 방식들을 알아보자.

    Linked list 표현

    선형 자료구조인 linked list를 응용하는 방식이다. 단방향/양방향에 관계 없이 연결 리스트는 오직 연결되어 있는 값과의 link를 위해 사용했는데, 여기서는 child node와의 연결을 표현하기 위해 사용한다.

    노드의 삽입과 삭제가 용이하나, 각 노드의 차수만큼 가변적인 포인터 필드를 가져야 한다는 문제가 있다.

    Left-Child Right-Sibling(LCRS) 표현

    Sibling동일한 parent node를 가지고 있는 노드를 의미하며, right sibling바로 오른쪽에 있는 sibling을 의미한다. 따라서 LCRS 표현에서는 각 노드가 데이터|가장 왼쪽 child의 주소|바로 오른쪽 sibling의 주소로 이루어진다. 아래 그림은 tree를 LCRS로 표현하는 예다.

    '컴퓨터 기초 > 자료구조' 카테고리의 다른 글

    Binary Tree의 순회  (0) 2019.02.01
    n-ary Tree와 Complete, Perfect, Balanced, Skewed Tree  (0) 2019.01.30
    Tree  (0) 2019.01.18
    Stack과 Queue  (0) 2019.01.16
    Array와 Dynamic Array, Linked List  (0) 2019.01.11

    + Recent posts