Logo

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

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

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

__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() 함수를 적절히 사용하셔서 효과적으로 데이터 타입을 체크하시는데 도움이 되었으면 좋겠습니다.