프로그래밍을 하다 보면 서로 연관된 연속적 데이터를 하나의 변수에 모아 두면 좋은 상황이 생깁니다. Java와 같은 언어에서 List, Map과 같은 Collections API를 지원하는 것처럼, Python에서는 이를 위해 Iterable 자료형을 지원합니다. Iterable 자료형을 보면, '파이썬답다'라는 생각이 가장 먼저 듭니다. Iterable은 반복 가능한이라는 뜻인데, Python은 반복(iteration)이라는 개념을 정말 잘 지원하고 있고, Python의 간결함은 Iterable 자료형에서 오는 경우가 많으므로 잘 알고 있어야 합니다.

Iterator pattern(반복자 패턴)이 떠오를 수 있는데, 이는 사실 이미 디자인 패턴으로 정형화되어 있기 때문입니다. 연속된 데이터를 포함하고 있는 자료의 요소들을 순회할 수 있는 방법을 제공하는 패턴을 Iterator pattern이라고 합니다. 대부분의 언어에서 Iterator pattern을 문법적인 요소들로 제공(Java의 Collections 등)하고 있기는 하지만, Python만큼 언어에 자연스럽게 녹아 있는 경우는 많지 않습니다.

Python의 대표적인 iterable 자료형은 아래처럼 분류됩니다.

  • List : 가장 일반적인 iterable 자료형입니다. 값 접근, 추가, 수정, 삭제가 자유롭습니다.
  • Tuple : List와 유사하지만, Tuple은 한 번 정의하고 나면 값 접근은 가능하지만 추가, 수정, 삭제가 불가능합니다. Read-only List라고 생각할 수 있습니다.
  • Dictionary : key-value 쌍으로 이루어진 자료형입니다.
  • Set : 수학의 집합 개념과 비슷합니다. 중복을 허용하지 않으며, 순서가 보장되지 않습니다.

Python의 모든 iterable 자료형은 각 요소의 데이터 타입이 자유롭습니다. 하나의 List에 정수, 실수, 문자열 등이 함께 들어갈 수 있다는 것입니다.

List

가장 일반적인 iterable 자료형이라고 했습니다. List는 값을 다루는 부분에 있어 매우 자유롭습니다. List를 만들 때는 아래처럼 대괄호([ ])로 감싸 주고 각 요소들은 쉼표로 구분합니다.

인덱싱과 슬라이싱

Python에선 List에 접근하기 위해 타 프로그래밍 언어들의 배열 접근 방식과 비슷한 인덱싱이라는 개념을 지원하고, 추가적으로 슬라이싱이라는 개념도 있습니다. 이 둘을 이용해 각 요소에 접근하고, 특정 집합을 잘라낼 수 있습니다. 대부분의 프로그래밍 언어에서 이와 같은 인덱싱은 보통 zero-based numbering(0부터 시작)한다는 것을 참고하기 바랍니다.

del이라는 키워드를 사용했는데, 제대로 이해하려면 매직 메소드라는 개념을 알아야 하므로 여기서는 'Iterable 객체의 특정 요소를 제거하기 위한 키워드'라고만 이해하고 넘어가도록 합시다.

합과 곱

Python의 List는 서로 합하고, 정수와 곱할 수 있습니다.

값이 모두 n이고 길이가 m인 리스트 만들기

List의 곱을 이용해 값이 모두 n이고 길이가 m인 리스트를 만들 수 있습니다. [n] * m 코드를 사용하면 됩니다.

Tuple

Tuple은 Read-only(불변) List라고 생각할 수 있습니다. List처럼 나열된 값을 다루지만, 한 번 선언되고 나면 값의 생성, 수정, 삭제가 불가능합니다.

인덱싱과 슬라이싱

Tuple도 List와 동일한 형태의 인덱싱과 슬라이싱이 가능합니다.

합과 곱

Tuple도 서로 합하고 정수와 곱할 수 있습니다. 합과 곱은 해당 연산의 결과를 리턴하므로, 실제 튜플에는 변동이 생기지 않기 때문에 Read-only의 룰을 위반하지 않으므로 가능한 것입니다.


프로그래밍의 기본은 변수로부터 시작됩니다. 변수는 을 저장하는 공간이며, 이 값은 변수의 타입에 따라 숫자, 문자열, 리스트 등이 될 수 있습니다. Python은 동적 타이핑을 사용하므로, 변수에 일단 값을 할당해 두고 나면 런타임에 타입 검사를 수행합니다. 변수의 값 할당은 assign(=) 기호를 사용합니다.

변수의 assign은 단순한 바인딩 구문이며, 이는 등호의 우변을 먼저 평가한 후 그 평가값을 좌변에 할당하게 됩니다. 따라서 우변 평가 -> 좌변 할당이라는 순서를 알고 있으면 좋습니다. Python의 변수는 기본 자료형Iterable 자료형으로 나누는 것이 좋고, 여기서는 기본 자료형에 대해서 다뤄 보도록 하겠습니다.

숫자형

Python의 숫자형은 정수, 실수를 포함해 숫자 형태로 이루어진 자료형입니다. Python의 모든 숫자 자료형은 최소값과 최대값에 대한 제한이 없습니다. Python의 숫자형은 아래처럼 나눌 수 있습니다.

  • 정수(int) : 말 그대로 정수 자료형입니다.
  • 실수(float) : 소수점이 포함된 숫자를 말하며, e 표기법도 사용할 수 있습니다. 다른 언어에서 실수를 다루기 위해 float과 double 타입이 따로 있는 것에 비해, Python은 float 타입만 사용합니다.
  • 8진수(int) : 0o로 시작되며 8진법으로 표현되는 정수를 뜻합니다.
  • 16진수(int) : 0x로 시작되며 16진법으로 표현되는 정수를 뜻합니다.

아래는 각 숫자형 데이터 타입들을 변수에 할당하는 예입니다.

사칙연산

다른 프로그래밍 언어들처럼, Python에서도 보편적으로 사용되는 사칙연산들이 당연히 지원됩니다.

  • + : 두 항의 합
  • - : 좌측 항에서 우측 항을 뺀 값
  • * : 두 항의 곱
  • / : 좌측 항에서 우측 항을 나눈 값(Python 2에선 무조건 소수점을 버리고 int를 리턴하지만, Python 3에선 최대 소수점 16번째 자리까지 표현된 float가 리턴됩니다. true div라고 부릅니다.)
  • % : 죄측 항에서 우측 항을 나눈 나머지

아래는 각 연산자의 예입니다.

Python은 사칙연산을 위한 몇 가지의 연산자를 더 지원하고 있습니다.

  • // : 좌측 항에서 우측 항을 나누어 소수점 아랫 자리를 버린 값(floor div라고 부릅니다.)
  • ** : 좌측 항에서 우측 항 만큼 제곱한 값

아래는 floor div와 제곱 연산자의 예입니다.

문자열

문자열(String)은 문자, 단어 등으로 구성된 문자들의 집합을 의미합니다. C, Java에서는 문자(char)문자열(string)을 따로 분류하고 있지만, Python은 문자를 다루는 경우 길이에 상관 없이 문자열로 통일하고 있습니다. 아래는 모두 문자열입니다.

  • PlanB
  • a

마지막은 blank를 뜻합니다. 아무 문자도 들어가 있지 않더라도 문자열로 취급할 수 있다는 것입니다. 다른 언어에서 작은 따옴표(')로 감싸는 형태의 char 자료형이 없는 만큼, 문자열을 감싸는 방식은 여러가지가 있습니다.

문자열 포매팅

문자열 포매팅은 문자열 안에 특정 값을 삽입하는 것을 말합니다. 여기서 특정 값은 대체적으로 변수입니다. 포맷 코드를 이용할 수도 있고, 문자열의 format 메소드를 사용할 수도 있습니다.

보편적으로 인덱스가 제거된 포매팅 문자열과 format 메소드를 사용하는 3번을 사용합니다.

문자열을 서로 더하거나, 정수와 곱하거나, 일부를 자르는 등 수많은 작업들을 할 수 있지만 여기선 자료형에 대해서만 알아보기로 했으므로(이후의 Iterable 객체와 연관되기도 하므로) 다음으로 미루도록 하겠습니다.

bytes

Python은 byte로 이루어진 문자열을 위해 bytes라는 타입을 지원합니다. Python에서는 바이트 문자열을 b'abcd'와 같은 방식으로 표현합니다. 실제로 변수에는 인코딩된 상태로 할당됩니다.

Bool

불린(Boolean)참(True) 또는 거짓(False)만을 값으로 가질 수 있는 자료형입니다. 참고로 다른 언어의 boolean 자료형과 다르게 첫 문자가 대문자로 시작되는 True, False를 사용한다는 점입니다.

None

None'아무 데이터를 가지고 있지 않다'라는 것을 표현하기 위해 사용합니다. Java의 null과 다르게, None이라는 값도 하나의 객체(NoneType)입니다.

타입 캐스팅

문자열 '1'을 숫자 1로 변환하고 싶다면, 타입 캐스팅을 이용할 수 있습니다. 파이썬에서 제공되는 빌트인 함수들을 사용할 수 있습니다.

자료형의 참과 거짓

bool('hello')가 True, bool('')가 False인 이유는 Python의 모든 자료형엔 참과 거짓이 있기 때문입니다.

  • 숫자 : 0, 0.0, 0o0, 0x0은 거짓이며, 나머지는 모두 참입니다.
  • 문자열 : 빈 문자열('')은 거짓이며, 나머지는 모두 참입니다.
  • bool : True는 참이며, False는 거짓입니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Iterable 자료형 - Dictionary, Set  (0) 2018.06.20
[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 주석  (0) 2018.06.17
[Python] Hello World로 Python 둘러보기  (0) 2018.06.16
[Python] 설치  (0) 2018.06.15

프로그래밍에 있어 주석(Comment)은 정말 중요합니다. 굉장히 아이러니하지만, 내 코드를 내가 이해하지 못하는 경우가 생각보다 많습니다. 조건문의 조건식이 복잡해지고, 반복문이 다중으로 구성되는 등, 코드의 복잡도가 늘어날수록 주석 없이는 코드를 이해하기 힘들어집니다. 주석은 컴파일 타임에 제외되는, 가독성을 높이기 위한 한 줄 이상의 설명문입니다.

많은 프로그래밍 언어들은 주석을 //로 시작하여 작성하고, 여러 줄에 걸쳐 주석을 작성하는 경우 /* */ 형태를 사용합니다.

Python은 #으로 시작하는 문장을 주석으로 간주합니다. 여러 줄에 걸쳐 주석을 작성하는 경우 """(큰 따옴표 3개) 사이에 작성하면 됩니다.

사실, '클린 코드(Clean code)'라는 명저에서는 '주석은 설명을 붙여 나쁜 코드를 회피하려는 것'이라고 설명하며 주석에 대해 회의적인 입장을 가지고 있습니다. 실제로 주석 없이도 쉽게 이해 가능한 매우 깔끔한 코드를 작성하는 게 순효과가 더 많기도 합니다. 그러나 우리는 그만큼의 직관성을 가진 코드를 작성하기 위한 경험이 부족하니, 지금은 '클린 코드'가 말했던 대로 주석으로나마 나쁜 코드를 회피할 수밖에 없는 입장입니다. 주석 없이도 이해되는 코드를 작성하는 것은 개발자의 역량이므로, 무조건 주석을 붙이는 것보다 깔끔하고 직관적인 코드를 작성하는 것에 더 집중하는 것이 좋을 것 같다는 게 제 입장입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Iterable 자료형 - List, Tuple  (1) 2018.06.19
[Python] 변수와 기본 자료형  (0) 2018.06.18
[Python] Hello World로 Python 둘러보기  (0) 2018.06.16
[Python] 설치  (0) 2018.06.15
[Python] 개요  (0) 2018.06.14

+ Recent posts