본문 바로가기

Study/CS

[Python OOP] Python에서의 객체(Object)와 타입 힌트

 

본 포스팅은 책 "Python 객체지향 프로그래밍 4판"의 내용을 정리한 글입니다

 

이번 포스팅에서는 Python에서의 객체와 타입 힌트에 대해서 알아보려고 한다.

우선 Python에서는 객체(Object)를 어떻게 정의하고 있을까?

 

한마디로 정의하자면, Python의 모든 것은 객체이다.

 

str_variable_example = "hello world"
print(type(str_variable_example)) # <class "str">

 

str값을 가진 변수를 선언하고 내장 함수인 type()을 이용하여 타입을 출력하는 간단한 코드이다.

첫번째 줄에서 "hello world"라는 문자열을 str_variable_example 변수로 선언하고
출력하면 다음과 같은 결과가 출력된다.

<class "str">

 

즉, str class의 인스턴스로서 "hello world"라는 문자열이 생성된 것이다.

이렇듯 Python의 모든 리터럴, 즉 데이터는 객체로써 존재한다고 할 수 있다.

 

그렇다면, 변수(Variable)는 어떻게 정의할 수 있을까?
위의 코드 예제를 살짝만 수정해보자.

 

str_variable_example = 25
print(type(str_variable_example)) # <class "int">

 

앞서 "hello world"라는 문자열로 선언되어 있던 str_variable_example 변수에
새로 25라는 정수값을 할당해주었다.

여기서 str_variable_example의 type을 출력해보면 어떻게 나올까?

<class "int">

 

위와 같이 int class의 인스턴스로써 존재하고 있는 것을 볼 수 있다.

이 것이 의미하는 내용은 아주 명확하다.

변수(Variable) == 객체(Object)에 대한 참조(reference)라는 것이다.

 

여기서 문제가 발생한다.

다음과 같은 코드를 작성했다고 가정해보자.

def is_odd(n)
	""" 정수 n을 입력받아서 홀수이면 True를, 짝수이면 False를 리턴하는 함수
    """
	return n % 2 != 0

 

여기서, 함수는 argument로 당연히 정수 n이 전달될 것이라고 예상하고 동작한다.

여기서 n에 정수값이 아닌 문자열이 전달된다면 어떻게 될까?

Python은 함수에 인자를 전달할 때, 해당 객체에 대한 참조를 전달하는 Call By Reference이기 때문에
n이 정수가 아니라고 해서 함수에 전달이 되지 않는 것은 아니다.

그 결과, 이런 에러가 출력된다.

 

TypeError: not all arguments converted during string formatting

 

여기서 궁금증이 하나 생긴다.
갑자기 왜 formatting에 관련된 에러가 출력된 것일까?

그 이유는 다음과 같다.

 

Python은 Object 내에 실제 존재하지 않는 method에 접근하는 것을 막지 않는다

 

 Python이라는 언어 자체가 유연성을 목표로 만들어진 언어이기 때문에 이러한 결과가 가능한 것이다.
그렇기 때문에, 문자열 n이 함수에 전달되더라도 Python은 런타임 단계에서 이 것을 막지 않는다.

그렇게 정수값이 아닌 str class의 인스턴스에 대한 참조 n이 함수의 인자로 전달되게 되고,
int class에서 제공하는 %연산자가 아닌, str class에서 제공하는 %연산자가 호출된다.

str class 내의 % 연산자는 %d와 같이 형식 지정이 이루어지지 않으면,
TypeError를 리턴하기 때문에 위와 같은 결과가 나타난 것이다.

 

그렇다면, 이러한 문제를 해결하기 위한 방법은 무엇일까?

사실, 앞서 설명했듯이 Python은 유연성을 목표로 만들어진 언어이기 때문에
런타임 단계에서 이러한 문제를 찾아내는 것은 쉽지 않다.

그대신 해당 코드를 호출하고자 하는 클라이언트 사용자들에게 주석 형태로 힌트를 줄 수는 있다.

이 것이 Python에서의 타입 힌트이다.

 

def is_odd(n: int) -> bool:
	return n % 2 != 0

 

위와 같이, 주석 형태로 함수의 인자 n은 정수값을 보내줘야 하고,
리턴값은 불리언값이라는 것을 명시해주는 것이다.

물론 이러한 타입 힌트는 저장 공간에는 약간의 영향을 주지만 런타임에는 영향을 주지 않는다.

다만, 이 코드를 호출하는 클라이언트 사용자에게 아주 명시적인 힌트를 제공하게 된다.

 

다음 포스팅에서는 유사한 기능을 가진 코드나 객체를 합치는 여러가지 방법 중 하나인
상속에 대해서 알아보고자 한다.

언제나 그렇듯이 오류나 첨언은 환영이라는 말과 함께 이번 포스팅을 마친다!!

'Study > CS' 카테고리의 다른 글

[Python] easydict 사용하기  (0) 2024.01.19