Python 타입 확인 완벽 가이드: type()와 isinstance() 사용법부터 응용까지

1. 들어가며

Python의 타입 확인은 왜 중요한가? Python은 동적 타입 언어로, 실행 시에 변수와 객체의 타입이 결정됩니다. 유연한 언어 설계 덕분에 타입을 명시적으로 선언할 필요는 없지만, 이러한 유연성 때문에 예기치 않은 타입 오류나 동작상의 문제가 발생할 수 있습니다. 따라서 Python 프로그램의 신뢰성과 안정성을 유지하려면 타입 확인을 수행하는 것이 중요합니다. 본 글에서는 Python에서의 주요 타입 확인 방법인 type(), isinstance() 및 기타 고급 기법을 설명합니다。

2. Python에서의 데이터 타입 개요

Python에는 숫자형, 문자열형, 리스트형, 딕셔너리형 등 다양한 데이터 타입이 존재합니다. 각각의 데이터 타입에는 고유한 용도가 있으며, 타입 확인을 통해 예기치 않은 오류를 방지할 수 있습니다。

주요 데이터 타입

  • 숫자형 (int, float) 숫자형에는 정수를 다루는 int형과 소수점을 다루는 float형이 있습니다.
  num1 = 10
  num2 = 3.14
  print(type(num1))  # <class 'int'>
  print(type(num2))  # <class 'float'>
  • 문자열형 (str) 텍스트 데이터를 저장하는 타입이며, 작은따옴표 또는 큰따옴표로 감싸서 정의됩니다.
  text = "Hello, World!"
  print(type(text))  # <class 'str'>
  • 리스트형 (list) 리스트는 순서가 있는 컬렉션으로, 여러 요소를 저장할 수 있습니다. 리스트는 []로 정의되며, 다양한 조작이 가능합니다.
  mylist = [1, 2, 3, 4]
  print(type(mylist))  # <class 'list'>
  • 딕셔너리형 (dict) 딕셔너리형은 키-값 쌍으로 데이터를 저장하는 타입이며, {}로 정의됩니다.
  mydict = {"one": 1, "two": 2}
  print(type(mydict))  # <class 'dict'>

3. type() 함수를 사용한 타입 확인

type() 함수는 지정한 객체의 타입을 가져오기 위한 기본적인 내장 함수입니다. 간단하게 타입을 반환하므로 객체의 타입 확인에 매우 유용합니다。

type() 함수의 기본적인 사용법

다음 예에서는、type() 함수를 사용하여 변수의 타입을 확인합니다。
myvar = 1234
print(type(myvar))  # <class 'int'>
다른 타입에 대해서도 동일한 방법으로 확인할 수 있습니다。
mystr = "Hello"
print(type(mystr))  # <class 'str'>

type()의 장점과 주의점

type()는 타입 확인을 간단히 할 수 있는 반면, 서브클래스 판정에는 주의가 필요합니다. type()는 서브클래스를 고려하지 않고, 지정된 타입과의 일치만을 확인합니다。
class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()
print(type(dog) == Animal)  # False
이 경우、DogAnimal을 상속하지만, type()에서는 False가 반환됩니다. 이처럼 서브클래스까지 고려해야 한다면, 다음에 소개할 isinstance()를 사용하는 것이 권장됩니다。

4. isinstance() 함수를 사용한 타입 확인

isinstance() 함수는 객체가 특정 타입 또는 그 하위 클래스인지 확인하는 데 사용됩니다. 상속 관계를 포함한 유연한 타입 확인이 가능합니다。

isinstance()의 기본적인 사용법

다음 예에서는、isinstance()를 사용하여 변수의 타입을 확인합니다。
myvar = 1234
print(isinstance(myvar, int))  # True
이 예에서는、myvarint 타입이므로 True가 반환됩니다。

여러 타입을 판별하기

isinstance()는 여러 타입을 튜플로 전달하면 동시에 여러 타입을 확인할 수 있습니다。
value = 3.14
print(isinstance(value, (int, float)))  # True
여러 타입을 동시에 확인할 때 유용합니다。

하위 클래스 판별

isinstance()는 하위 클래스도 지원하므로, 객체가 상속 관계에 있는 클래스인지도 확인할 수 있습니다。
class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()
print(isinstance(dog, Animal))  # True
이 예에서는、Dog 클래스의 인스턴스가 Animal 클래스를 상속하므로 True가 반환됩니다。

5. 기타 타입 확인 방법

Python에는 type()isinstance() 외에도 타입을 확인하는 방법이 있습니다. 이러한 기법은 특정 용도에 따라 구분하여 사용할 수 있습니다.

issubclass() 함수

issubclass()는 어떤 클래스가 다른 클래스의 서브클래스인지 여부를 확인하는 데 사용됩니다。
class Animal:
    pass

class Dog(Animal):
    pass

print(issubclass(Dog, Animal))  # True

collections.abc 모듈

collections.abc 모듈은 리스트나 딕셔너리 등 컬렉션 타입의 타입 확인에 유용합니다. 아래는 리스트가 Sequence인지 확인하는 예입니다。
import collections.abc

mylist = [1, 2, 3]
print(isinstance(mylist, collections.abc.Sequence))  # True

typing 모듈을 통한 타입 힌트

typing 모듈은 Python 코드에 정적 타입 체크를 도입하기 위한 모듈입니다. 이를 통해 코드의 가독성이 향상되고 디버깅이 쉬워집니다。
from typing import List

def greet(names: List[str]) -> None:
    for name in names:
        print(f"Hello, {name}!")

NoneType의 타입 확인

NoneTypeNone이라는 특수한 객체의 타입입니다. 타입 확인을 통해 예기치 않은 오류를 방지할 수 있습니다。
myvar = None
print(type(myvar))  # <class 'NoneType'>
NoneType의 판별은 함수의 반환값이 None인지 확인하는 경우 등에 유용합니다。