파이썬에서 데이터 타입 확인하기

파이썬에서 데이터 타입 확인하기

객체 지향 프로그래밍 언어인 파이썬에서 모든 데이터는 결국 객체라고 볼 수 있습니다. 우리가 작성한 클래스의 인스턴스 뿐만 아니라, 심지어 함수, 문자열, 정수, 실수도 결국 타입을 가집니다.

이번 포스팅에서는 파이썬에서 데이터 타입을 확인할 수 있는 몇 가지 방법을 알아보도록 하겠습니다.

__class__ 속성

파이썬에서 모든 객체는 __class__라는 특별한 속성을 가지는데요. 여기에는 해당 객체의 데이터 타입이 저장이 되어 있습니다.

예를 들어, 변수 a에 정수 1을 저장하고, a.__class__를 출력해보겠습니다.

a = 1
print(a.__class__)

정수의 데이터 타입은 int이네요.

<class 'int'>

이번에는 변수 b에 실수 1.5을 저장하고, a.__class__를 출력해보겠습니다.

b = 1.5
print(b.__class__)

실수의 데이터 타입은 float이네요.

<class 'float'>

이번에는 함수를 하나 정의하고 __class__ 속성을 출력해볼까요?

def do():
    pass
print(do.__class__)

함수의 데이터 타입은 function인 것을 알 수 있습니다.

<class 'function'>

이번에는 클래스를 하나 정의하고, __class__ 속성을 출력볼까요?

class Thing():
    pass
print(Thing.__class__)

클래스의 데이터 타입은 type인 것을 알 수 있습니다. 객체를 만들기위해서 사용되는 클래스 자체도 데이터 타입이 있다니 흥미롭지 않나요? 😁

<class 'type'>

이 클래스로 부터 객체를 하나 만들어서 마찬가지로 __class__ 속성을 출력해보겠습니다.

thing = Thing()
print(thing.__class__)

이 객체는 데이터 타입은 예상했던데로 Thing이네요.

<class '__main__.Thing'>

보통 __class__ 속성은 터미널이나 콘솔 상에서 데이터 타입을 1회성으로 빠르게 확인해보는 용도로 간편하게 사용할 수 있습니다.

type() 함수

파이썬으로 프로그램을 짤 때는 __class__ 속성보다 type() 내장 함수가 더 보편적으로 사용될 것입니다. type()은 객체를 인자로 받아 해당 객체의 데이터 타입을 반환해주는 함수입니다.

예를 들어, 위에서 사용한 모든 변수의 데이터 타입을 출력해보겠습니다.

print(type(a))
print(type(b))
print(type(do))
print(type(Thing))
print(type(thing))
<class 'int'>
<class 'float'>
<class 'function'>
<class 'type'>
<class '__main__.Thing'>

그 밖에 파이썬에서 흔하게 볼 수 있는 다른 객체들의 타입도 한 번 출력해보았습니다.

print(type([1, 2, 3]))
print(type((1, 2, 3)))
print(type({1, 2, 3}))
print(type({"a": 1}))
print(type(True))
print(type(None))
<class 'list'>
<class 'tuple'>
<class 'set'>
<class 'dict'>
<class 'bool'>
<class 'NoneType'>

타입 비교를 할 때는 type() 함수와 is 키워드를 함께 사용하면 됩니다.

print(type(a) is int)
print(type(a) is float)

실전에서는 type() 함수는 입력값 유효성 검증에 활용할 수 있습니다. 예를 들어 정수나 실수만 입력으로 받아서 제곱을 해주는 함수를 작성해보겠습니다.

def square(num):
    if type(num) is not int and type(num) is not float:
        raise ValueError("num must be of type int or float")
    return num * num

isinstance() 함수

사실 매번 type() 함수와 is 키워드를 함께 쓰는 게 좀 번거로울 수가 있는데요. 다행히도 파이썬에서는 isinstance() 함수도 제공해주는데 이 내장 함수를 사용하면 좀 더 쉽게 타입 체크를 할 수 있습니다.

isinstance() 함수는 첫번째로 인자로 넘어온 객체의 데이터 타입이 두번째 인자로 넘어온 타입과 일치하는지 여부를 반환합니다.

print(isinstance(1, int))
print(isinstance(1, float))
True
False

isinstance() 함수를 사용할 때 편리한 점은 두번째 인자로 여러 데이터 타입을 한 번에 튜플(tuple)로 넘길 수 있다는 것입니다.

print(isinstance(1, (int, float)))
print(isinstance(1.5, (int, float)))
print(isinstance("1.5", (int, float)))
True
True
False

따라서, 위에서 작성했던 함수 내 입력값 유효성 검증을 다음과 같이 단순화시킬 수 있습니다.

def square(num):
    if not isinstance(num, (int, float)):
        raise ValueError("num must be of type int or float")
    return num * num

isinstance() 함수를 사용할 때 한 가지 주의할 부분은 바로 타입 간 상속 관계도 고려해준다는 것입니다. 즉, 첫번째 인자로 넘어온 객체가 두번째 인자로 넘어온 타입이 아닌 하위 클래스로 부터 생성된 인스턴스라고 해도 True를 반환합니다.

class Thing():
    pass

class SubThing(Thing):
    pass

sub_thing = SubThing()

print(type(sub_thing))
print(isinstance(sub_thing, SubThing))
print(isinstance(sub_thing, Thing))
<class '__main__.SubThing'>
True
True

전체 코드

본 포스팅에서 제가 작성한 전체 코드는 아래에서 직접 확인하고 실행해보실 수 있습니다.

https://deepnote.com/project/Blog-Yd3-DsV_QeGqo4AUZ7FyHg/%2Fpython-class-type-isinstance.ipynb

마치며

이떤 프로그래밍 언어로 코딩을 하든 현재 다루고 있는 데이터의 타입을 확인해야 할 때가 자주 있는 것 같습니다. 파이썬에서 제공하는 __class__ 속성, type() 함수, isinstance() 함수를 적절히 사용하셔서 효과적으로 데이터 타입을 체크하시는데 도움이 되었으면 좋겠습니다.

This work is licensed under CC BY 4.0 CC BY

개발자를 위한 뉴스레터

달레가 정리한 AI 개발 트렌드와 직접 만든 콘텐츠를 전해드립니다.

Discord