Data Types

Python은 동적 타입 언어로, 변수를 선언할 때 명시적으로 타입을 지정할 필요가 없다.
하지만 각 데이터 타입을 이해하는 것은 효율적인 코딩과 디버깅에 필수적이다.

숫자형 (Numeric)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 정수형 (Integer): 양의 정수, 음의 정수, 0을 포함하는 숫자형
age = 25
population = 1000000000000  # Python3는 정수 크기 제한이 없습니다
print(type(age)) # <class 'int'>
print(type(population)) # <class 'int'>

# 부동소수점 (Float): 소수점을 포함하는 숫자형
height = 175.5
pi = 3.14159
print(type(height)) # <class 'float'>
print(type(pi)) # <class 'float'>

# 복소수 (Complex): 실수부와 허수부로 구성된 숫자형
complex_number = 3 + 4j
print(complex_number.real)  # 실수부: 3.0
print(complex_number.imag)  # 허수부: 4.0
print(type(complex_number)) # <class 'complex'>

문자열 (str)

문자들의 집합으로, 작은따옴표(’’)나 큰따옴표("")로 감싸서 표현한다.

1
2
3
g = 'Hello, Python!'
h = "안녕하세요"
print(type(g))  # <class 'str'>

문자열은 순서가 있는 시퀀스 자료형으로, 인덱싱과 슬라이싱이 가능하다.

1
2
print(g[0])    # 'H'
print(g[7:13])  # 'Python'

불리언 (bool)

참(True) 또는 거짓(False)을 나타내는 자료형

1
2
3
4
5
6
7
# 불리언 (Boolean)
i = True
j = False
print(type(i))  # <class 'bool'>

# 비교 연산 결과
is_adult = age >= 18  # True 또는 False 반환

시퀀스 타입

리스트 (list)

여러 값을 순서대로 저장하는 자료형으로, 대괄호([])로 표현하며, 값의 변경이 가능하다.

1
2
3
4
k = [1, 2, 3, 'a', 'b', 'c']
print(type(k))  # <class 'list'>
k[0] = 100      # 값 변경
print(k)        # [100, 2, 3, 'a', 'b', 'c']

튜플 (tuple)

리스트와 유사하지만, 한 번 생성하면 값을 변경할 수 없는 불변(immutable) 자료형. 소괄호(())로 표현한다.

1
2
3
l = (1, 2, 3, 'a', 'b', 'c')
print(type(l))  # <class 'tuple'>
# l[0] = 100    # 오류 발생: 튜플은 값을 변경할 수 없음

범위 (range)

연속된 정수를 생성하는 자료형으로, 주로 반복문에서 사용

1
2
m = range(5)   # 0부터 4까지의 정수 생성
print(list(m))  # [0, 1, 2, 3, 4]

매핑 타입

딕셔너리 (dict)

키(key)와 값(value)의 쌍으로 이루어진 자료형으로, 중괄호({})로 표현.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
p = {'name': 'Alice', 'age': 25}
print(type(p))  # <class 'dict'>
print(p['name'])  # 'Alice'
# 딕셔너리 (Dictionary)
user = {
    "name": "김철수",
    "age": 30,
    "city": "서울"
}

# 중첩 딕셔너리
student = {
    "info": {
        "name": "박영희",
        "grade": 3
    },
    "scores": {
        "math": 90,
        "english": 85
    }
}

집합 타입

기능setfrozenset
값 변경 가능 여부✅ 가능 (add, remove 가능)❌ 불가능 (불변)
집합 연산 (`, &, -, ^`)✅ 가능
딕셔너리 키로 사용❌ 불가능✅ 가능
리스트 요소로 사용❌ 불가능✅ 가능

집합 (set)

중복되지 않는 요소들의 모임으로, 순서가 없으며 중괄호({})로 표현한다.

1
2
3
n = {1, 2, 3, 3, 4, 4, 5}
print(type(n))  # <class 'set'>
print(n)        # {1, 2, 3, 4, 5}

집합형은 합집합, 교집합, 차집합 등의 집합 연산에 사용된다.

1
2
3
o = {3, 4, 5, 6, 7}
print(n.union(o))    # 합집합: {1, 2, 3, 4, 5, 6, 7}
print(n.intersection(o))  # 교집합: {3, 4, 5}

프로즌셋 (frozenset)

frozenset불변(immutable) 집합으로, set과 거의 동일한 기능을 제공하지만, 한 번 생성된 후에는 수정할 수 없다.
즉, 요소를 추가(add)하거나 제거(remove)할 수 없지만, set과 동일한 **집합 연산(합집합, 교집합, 차집합 등)**을 수행할 수 있다.

1
2
3
4
5
6
7
8
# 일반적인 set
normal_set = {1, 2, 3}

# 불변 set (frozenset)
frozen = frozenset([3, 4, 5])

print(type(frozen))  # <class 'frozenset'>
print(frozen)        # frozenset({3, 4, 5})

frozenset불변 자료형이므로, 딕셔너리의 키로 사용할 수 있다.
(일반 set은 변경 가능성이 있어서 키로 사용할 수 없음.)

1
2
3
4
5
fs_key = frozenset([1, 2, 3])

# 딕셔너리의 키로 사용 가능
dictionary = {fs_key: "값"}
print(dictionary)  # {frozenset({1, 2, 3}): '값'}

frozenset은 다음과 같은 집합 연산을 수행할 수 있다:

  1. 합집합 (| 또는 .union())

    1
    2
    3
    4
    5
    
    fs1 = frozenset([1, 2, 3])
    fs2 = frozenset([3, 4, 5])
    
    print(fs1 | fs2)               # frozenset({1, 2, 3, 4, 5})
    print(fs1.union(fs2))          # frozenset({1, 2, 3, 4, 5})
    
  2. 교집합 (& 또는 .intersection())

    1
    2
    
    print(fs1 & fs2)               # frozenset({3})
    print(fs1.intersection(fs2))   # frozenset({3})
    
  3. 차집합 (- 또는 .difference())

    1
    2
    
    print(fs1 - fs2)               # frozenset({1, 2})
    print(fs1.difference(fs2))     # frozenset({1, 2})
    
  4. 대칭 차집합 (^ 또는 .symmetric_difference())

    1
    2
    
    print(fs1 ^ fs2)                         # frozenset({1, 2, 4, 5})
    print(fs1.symmetric_difference(fs2))     # frozenset({1, 2, 4, 5})
    

바이너리 타입

모두 1바이트(8비트) 단위의 값을 연속적으로 저장하는 시퀀스 자료형이지만, 변경 가능성에 따라 차이가 있다.

활용 예시:

바이트 (bytes)

바이트어레이 (bytearray)

None 타입

NoneType

값이 없음을 나타내는 특별한 자료형으로, None으로 표현

1
2
q = None
print(type(q))  # <class 'NoneType'>

데이터 타입 확인

파이썬에서 데이터 타입을 확인하는 방법은 크게 세 가지가 있다.

  1. type() 함수 사용
    type() 함수는 객체의 데이터 타입을 반환한다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    a = 1
    print(type(a))  # <class 'int'>
    
    b = 1.5
    print(type(b))  # <class 'float'>
    
    c = "Hello"
    print(type(c))  # <class 'str'>
    
  2. class 속성 사용
    모든 파이썬 객체는 __class__ 속성을 가지고 있어, 이를 통해 데이터 타입을 확인할 수 있다.

    1
    2
    3
    
    print(a.__class__)  # <class 'int'>
    print(b.__class__)  # <class 'float'>
    print(c.__class__)  # <class 'str'>
    
  3. isinstance() 함수 사용
    isinstance() 함수는 객체가 특정 타입인지 확인할 때 사용한다.

    1
    2
    3
    
    print(isinstance(a, int))    # True
    print(isinstance(b, float))  # True
    print(isinstance(c, str))    # True
    

참고 및 출처