2023-09-27 07:09:41

개발을 하다보면 종종 특정 변수의 타입을 체크해야 하는 상황들이 있습니다. 이런 경우에 사용할 수 있는 방법은 크게 두 가지입니다. type() 함수를 사용하는 방법과 isinstance() 함수를 사용하는 방법입니다.

 

type() 활용

먼저 type() 함수로 타입 체크를 하려면 다음과 같이 코드를 작성해야 합니다. 

 

a = 123
b = 12.34
c = "배고파"

if type(a) is int:
    print("a의 자료형은 int입니다.")  # a의 자료형은 int입니다

if type(b) is float:
    print("b의 자료형은 float입니다.")  # b의 자료형은 float입니다.

if type(c) is str:
    print("c의 자료형은 str입니다.")  # c의 자료형은 str입니다.

 

그런데 VSCODE와 같은 IDE를 사용하면, Pylint가 타입 체크시 type()을 사용하는 대신에 isinstance() 함수를 사용하라고 권장합니다. 

 

 

isinstance() 활용

isinstance() 함수는 엄밀히 말하면 첫번째 인자로 전달된 객체가 두번째 인자로 전달된 클래스의 서브클래스인지 확인하여 true 또는 false를 반환합니다. 즉, 상속까지 고려를 합니다. 

 

a = 123
b = 12.34
c = "배고파"

if isinstance(a, int):
    print("a의 자료형은 int입니다.")  # a의 자료형은 int입니다

if isinstance(b, float):
    print("b의 자료형은 float입니다.")  # b의 자료형은 float입니다.

if isinstance(c, str):
    print("c의 자료형은 str입니다.")  # c의 자료형은 str입니다.

 

 

왜 타입체크시 isinstance()를 type()보다 권장하는가?

1. 우선 type() 함수로 타입체크를 하는 것이 isinstance() 함수에 비해서 속도 측면에서 조금 느립니다. 

 

2. type()으로 타입체크를 하면 완전히 같은 클래스의 객체가 아니면 모두 false를 반환합니다. 하지만 어떤 클래스를 상속받아서 만든 서브 클래스들은 사실상 부모 클래스와 같은 속성을 지닙니다. 따라서, isinstance() 함수로 서브 클래스에 속하면 같은 타입이라고 판명해주는 것이 더 좋은 타입체크일 수 있는 것입니다. 

 

관련 글

- [python] 파이썬스럽게 코딩하는 법, PEP8 정리

 

참고자료

[1] https://www.pylenin.com/blogs/type-vs-isinstance/