파이썬에서 데이터 타입 확인하기
객체 지향 프로그래밍 언어인 파이썬에서 모든 데이터는 결국 객체라고 볼 수 있습니다. 우리가 작성한 클래스의 인스턴스 뿐만 아니라, 심지어 함수, 문자열, 정수, 실수도 결국 타입을 가집니다.
이번 포스팅에서는 파이썬에서 데이터 타입을 확인할 수 있는 몇 가지 방법을 알아보도록 하겠습니다.
__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()
함수를 적절히 사용하셔서 효과적으로 데이터 타입을 체크하시는데 도움이 되었으면 좋겠습니다.