[Python] 데이터 타입 -2

이번 포스트에서는

1. 파이썬의 Reference Type(참조 타입)인 리스트, 듀플, 딕셔너리, 집합의 특징과 주요 메서드를 다뤄보고

2. 파이썬 자료형의 핵심 개념인 Iterable, Sequence, Mutable/Immutable을 설명하고

3. Primitive 타입과 Reference 타입의 차이를 비교해 보겠습니다.

 

자료형 개념

- Iterable(반복 가능 객체)

: for문처럼 하나씩 꺼내서 쓸 수 있는 반복 작업에 사용될 수 있는 객체.

- Sequence(순서가 있는 자료형)

: 요소들이 정해진 순서를 가지며 인덱스로 접근할 수 있는 자료형. (예: 리스트, 튜플, 문자열)

- Mutable(가변형)

: 객체 생성 후 내부의 값을 변경할 수 있는 자료형. (예: 리스트, 딕셔너리, 집합)

- Immutable(불변형)

: 객체 생성 후 내부의 값을 변경할 수 없는 자료형. (예: 정수, 실수, 문자열, 튜플)

 

리스트 List

파이썬에서 가장 자주 사용되는 자료형으로, 순서가 있으며 변경 가능(Mutable) 합니다. 

대괄호 [] 로 표현 합니다.

 

인덱스 Index

리스트 안에서 요소의 위치를 나타내는 번호.

- 0부터 시작합니다.

- 음수 인덱스도 가능하며, 뒤에서부터 세는 번호입니다. (-1은 마지막 요소, -2는 뒤에서 두 번째)

 

슬라이싱 Slicing

인덱스 범위를 지정하여 리스트의 일부를 잘라내는 기능.

- 리스트[start : stop : step] 형태로 사용

(start: 포함하는 시작 인덱스(생략시 처음부터), stop: 포함하지 않는 끝 인덱스(생략시 끝까지), step: 건너뛰는 간격(생략시 1))

 

리스트의 주요 메서드

- append(x) : 리스트 맨 뒤에 x 추가

- remove(x) : 리스트에서 처음 나오는 x와 일치하는 값을 삭제

- sort() : 리스트 요소를 오름차순으로 정렬 (reverse=True 옵션으로 내림차순 정렬도 가능)

- reverse() : 리스트의 순서를 뒤집음

- insert(i, x) : i번째 위치에 x를 삽입

- pop(i) : i 번째 위치 요소를 꺼내고 리스트에서 제거. 인덱스 i를 생략시 맨 마지막 요소를 꺼냄

- clear() : 리스트의 모든 요소를 삭제

- extend(iterable) : 다른 iterable(리스트, 튜플 등)의 모든 요소를 현재 리스트의 뒤에 추가

 

 

튜플 Tuple

순서가 있고 변경 불가능(immutable)한 자료형

소괄호 ()를 사용하여 표현

 

한 번 생성되면 내부 요소를 바꿀 수 없습니다.

리스트보다 메모리 효율이 좋고, 변경되지 않아야 하는 데이터를 안전하게 보관할 때 사용 됩니다.

(예를 들어 웹사이트의 설정 값이나 좌표값(x, y) 같은 것)

 

튜플의 주요 메서드

리스트와 달리 변경이 불가능 하기 때문에 리스트처럼 append 나 remove 같은 메서드는 없습니다.

주로 정보를 조회하는 메서드만 제공 됩니다.

 

- count(x) : 튜플 안에 x가 몇 번 등장하는지 개수를 반환합니다.

- index(x) : 튜플 안에 x가 처음으로 나타나는 인덱스를 반환합니다. 

 

 

딕셔너리 Dictionary

key : value 쌍으로 데이터를 저장하는 자료형

순서가 없고, 가변형으로 중괄호 {} 를 사용하여 표현

 

key는 고유해야 하며, 불변형(문자열, 숫자, 튜플) 이어야 합니다.

value 에는 어떤 자료형이든 올 수 있습니다.

 

딕셔너리의 주요 메서드

- get (key, default_value) : key에 해당하는 value를 반환.

(만약 key가 없으면 에러 대신 None을 반환하거나, default_value로 지정된 값을 반환)

- keys() : 딕셔너리의 모든 키(key)들을 반환

- values() : 딕셔너리의 모든 값(value)들을 반환

- items() : 딕셔너리의 모든 (key, value) 쌍을 튜플 형태로 반환

- pop(key) : key에 해당하는 value를 꺼내면서 해당 key : value 쌍을 딕셔너리에서 삭제

- update({...}) : 전달된 딕셔너리의 키-값 쌍들을 현재 딕셔너리에 추가하거나 기존 값을 변경

- clear() : 딕셔너리의 모든 요소를 삭제

 

 

집합 Set

중복을 허용하지 않고, 순서가 없는 자료형

수학적 집합 연산(합집합, 교집합, 차집합)이 가능하며 중괄호 {} 를 사용하여 표현

 

요소의 순서가 없으므로 인덱스로 접근할 수 없습니다.

중복된 값은 자동으로 제거됩니다.

 

집합의 주요 메서드

- add(x) : 집합에 x 원소 추가. 이미 있는 원소는 중복으로 추가되지 않음

- remove(x) : 집합에서 x 원소를 삭제. 만약 x가 집합에 없으면 KeyError가 발생

- union(b) / | : 두 집합의 합집합

- intersection(b) / & : 두 집합의 교집합

- difference / - : 두 집합의 차집합

- discard(x) : 집합에서 x 원소 삭제. remove와 달리 x가 집합에 없어도 에러를 발생시키지 않음

(더 안전하게 삭제하고 싶을 때 유용!)

- clear() : 집합의 모든 원소를 삭제

 

자료형 변환 Casting

서로 다른 자료형 간에 값을 변환하는 기능으로,

데이터를 원하는 형태로 가공해서 효율적으로 사용하기 위한 중요한 도구 입니다.

 

- list() : iterable을 리스트로 변환

- tuple() : iterable을 튜플로 변환

- set() : iterable을 집합으로 변환. 중복된 요소를 제거됨

- dict() : 키-값 쌍을 담은 iterable을 딕셔너리로 변환

 

이런 자료형 변환은 언제 필요할까요?

1. 데이터 중복 제거

리스트를 set로 변환하여 중복을 쉽게 제거할 수 있습니다. 혹은 엄청 긴 리스트가 있다고 가정할 경우, 그 안에 중복된 요소들이 많아 딱 한개씩만 남기고 싶다면 set()로 변환했다가 다시 list()로 바꾸면 됩니다.

2. 순서 유지/변경

어떤 데이터가 튜플로 되어 있어 수정이 불가할 때, 갑자기 수정해야할 필요가 생기면 list()로 변한하여 수정하고 다시 tuple()로 돌려놓을 수 있습니다.

3. 키-값 구조가 필요할 때

리스트에서 특정 값이 있는지 찾는 것보다 딕셔너리의 key나 집합의 원소를 찾는 것이 훨씬 빠를때가 있습니다.

 

 

is 연산자

두 변수가 같은 객체(동일한 메모리 주소)를 가리키는지 확인합니다.

 

값이 같더라도(==) 서로 다른 객체일 수 있으므로 is==는 다릅니다.

== 연산자는 두 변수가 같은 값을 가지고 있는지를 물어보는 것이고, 만약 내용물이 같으면 True를 반환합니다.

is 연산자는 두 변수가 메모리 상에서 완전히 같은 객체를 가지고 있는지를 물어보는 겁니다.

 

예를 들어, 두 사람이 각각 '우리 집 주소는 031번지야" 라고 말한다고 가정할 경우

== 연산자로는

두 사람은 둘 다 031 번지에 사는 것을 확인할 수 있고

is 연산자로는

두 사람이 정말 같은 집에 살고 있는지를 확인하는 것이기 때문에 031번지의 다른 집에 살고 있는 걸 확인할 수 있습니다.

 

* 파이썬에서는 리스트나 딕셔너리 같은 참조 타입은 is 와 ==의 결과가 다를 수 있는 점을 알아야 합니다.

Primitive 타입(정수, 문자열 등)은 보통 값이 같으면 같은 객체로 처리되는 경우가 많아서 is와 == 결과가 같을 때가 많지만

Reference 타입은 거의 다르다는 걸 기억해야 합니다!

 

in 연산자

어떤 값이 자료형 안에 포함되어 있는지 확인합니다.

 

리스트/튜플/문자열: 요소 존재 여부 확인 (있으면 True, 없으면 False)

딕셔너리: key의 존재 여부를 확인. value의 존재 여부를 확인하려면 .values()메서드를 사용.

 

* in 연산자는 특정 요소의 포함 여부를 빠르고 쉽게 확인할 수 있기 때문에

이후에 포스팅 할 조건문이나 반복문에서 유용하게 사용됩니다!

 

 

파이썬 자료형을 메모리 관리 방식에 따라 크게 두 가지로 나눌 수 있습니다.

Primitive (원시 타입) vs Reference (참조 타입)

 

Primitive (원시 타입)

- int(정수), float(실수), bool(불리언), str(문자열), tuple(튜플) 등이 해당 됩니다.

- 불변형(Immutable) 입니다.

- 값을 변경하려고 하면 새로운 객체가 생성됩니다. 기존 객체는 변경되지 않고, 변수가 새 객체를 가리킵니다.

* 파이썬은 작은 정수(-5 ~ 256)나 짧은 문자열 같은 특정 Primitive 값들을 미리 생성해두고 재활용하는

최적화가 있어, id 값이 같게 나올 수 있습니다. 하지만 개념적으로는 변경 시 새로운 객체가 생성되는 것이 맞습니다.

예를 들어 볼펜으로 "안녕하세요." 라고 썼다가 "안녕히가세요." 라고 바꾸려면,

볼펜으로 썼기 때문에 기존 글씨를 지울 수 없으니 아예 새로운 종이에 "안녕히가세요." 라고 다시 쓰는 것과 같습니다.

 

 

Reference (참조 타입)

- list(리스트), dict(딕셔너리), set(집합) 등이 해당됩니다.

- 가변형(Mutable) 입니다.

- 변수가 객체 자체를 직접 저장하는 것이 아닌, 객체가 저장된 메모리 주소를 참조합니다.

- 여러 변수가 같은 객체를 참조할 수 있으며, 이 경우 한 변수를 통해 객체를 변경하면 해당 객체를 참조하는 다른

모든 변수에게도 변경 사항이 반영 됩니다.

* Reference 타입은 여러 변수가 같은 객체를 공유할 수 있습니다. 한 변수로 내용을 바꾸면 다른 변수로 그 객체를

볼 때도 바뀐 내용을 보게 된다는 점을 주의해야 합니다. 

예를 들어 연필로 "안녕하세요." 라고 썼다가 "안녕히가세요." 라고 바꾸고 싶으면 기존 글씨를 지우개로 지우고

그 위에 "안녕히가세요." 라고 쓸 수 있는 것과 같습니다.

 

이 둘의 핵심은

Primitive는 변경 시 새 객체로, Reference는 공유 참조 수정이라는 것을 주의해야 합니다.