자바 등의 프로그램 언어는 변수를 정의할 때 변수에 저장될 자료형(Data Type)을 지정하지만, 파이썬의 경우 변수는 단순히 값을 관리한다. 모든 값을 객체로 만들어 사용하는 차별점을 지니기 때문이다. 이는 객체 내부에 객체를 생성한 클래스인 자료형을 항상 가지기 때문에 가능하다.
정수를 실수로 변환하는 형 변환은 정수 객체를 실수 객체로 바꾸는 것이다.
변수에 객체를 바인딩한 후 자료형 결정하기
파이썬의 변수는 실행할 때 값을 보관해서 관리하는 역할만 수행한다. 변수에 값을 할당해서 변수를 정의하면 실제 변수에 객체가 할당되는데, 이를 변수에 객체를 바인딩(binding)한다고 한다. 이는 곧 객체 할당이 자료형을 결정하는 것과 같다. 이런 방식을 동적 자료형(Dynamic typing)이라고 한다.
파이썬의 모든 객체는 해당하는 클래스가 있다. 이는 클래스를 만든 후 객체를 생성해 처리하므로 객체에 대한 자료형이 항상 결정되어 강한 자료형(strong typing) 체계를 유지한다.
동적 자료형 처리
변수 var에 빈 리스트 객체를 할당해 실행하면 변수가 만들어진다. 이 변수에 바인딩된 객체의 자료형을 type으로 확인한다.
다른 방식으로는 객체 내부에 있는 속성 __class__를 조회하면 모든 객체는 자신을 생성한 클래스에 대한 정보를 항상 갖고 있는 것을 알 수 있다.
var = []
print(type(var))
print(var.__class__)
[결과]
<class 'list'>
<class 'list'>
강한 자료형 처리
정수 클래스 int를 사용해 객체를 생성할 수 있다. 인자로 문자열을 전달해 객체를 만들고 이 객체의 클래스를 type 클래스로 확인하면 된다.
var = int("100")
print(var)
print(type(var))
[결과]
100
<class 'int'>
보통 강한 자료형은 같은 클래스로 만들어진 객체일 때만 연산이 실행되고 아니라면 연산이 불가능하다. 이를 확인하기 위해 정수와 문자열을 더하면 클래스가 달라 예외가 발생한다.
print(100 + "100")
[결과]
Traceback (most recent call last):
File "C:\Users\reo91\OneDrive\Coding Practice\P C++, Python\Python2.py", line 1, in <module>
print(100 + "100")
TypeError: unsupported operand type(s) for +: 'int' and 'str'
함수와 메소드는 어떤 객체일까? 예약어 class와 이름 A로 클래스를 정의하고 내부에 예약어 def를 사용해 func 함수를 작성해보자.
클래스 내부에 정의된 함수를 객체가 호출해서 메소드로 사용하려면 항상 첫 번째 매개변수는 self로 정의해야 한다. 클래스 이름에 점 연산을 붙여 함수 이름을 조회하면 함수 객체를 출력한다.
class A(object): # 예약어 + 이름 + 상속 관계 + :로 작성
def func(self):
print("함수 입니다.")
print(A.func) # 클래스 내에 정의된 함수 func 확인
var = A()
print(var.func)
[결과]
<function A.func at 0x00000291F46DEDD0>
<bound method A.func of <__main__.A object at 0x00000291F46CEE90>>
클래스 A 내에 정의된 func는 함수이고, 클래스 A로 객체를 만들어 변수 var에 할당하고 점 연산을 통해 func을 조회하면 메소드라는 것을 알 수 있다. 이처럼 파이썬은 클래스에 정의된 함수와 객체에서 함수를 바인딩할 때 메소드로 변환한다.
객체의 원소에 대한 변경 여부(mutation)
파이썬은 객체의 변경 가능 여부가 아주 중요하다. 원소를 추가하거나 변경할 수 있는 경우를 처리하는 객체와 한 번 생성되면 절대 변경할 수 없는 경우의 클래스 정의에 차이가 있기 때문이다.
변경할 수 없는 자료형
파이썬 문자열 클래스로 만들어진 객체는 여러 문자열을 원소로 가질 수 있지만, 내부 원소를 변경할 수 없다. 아래 예시를 보자.
var = "문자열"
var[0] = "가"
[결과]
Traceback (most recent call last):
File "C:\Users\reo91\OneDrive\Coding Practice\P C++, Python\Python2.py", line 2, in <module>
var[0] = "가"
TypeError: 'str' object does not support item assignment
색인 연산을 활용해 문자열을 변경하려고 했더니 예외가 발생했다. 예외의 내용을 보면 값을 할당할 수 없다고 한다. 내부에 할당하는 메소드가 없다는 뜻이다.
문자열 클래스에는 다양한 메소드가 있다. 메소드가 실행되면 새로운 문자열 객체를 만들어서 반환한다.
예를 들어 특정 문자열을 변경하는 replace 메소드를 사용해 첫 번째 문자열을 변경하면, 기존 문자열을 변경하는 것이 아니라 새로운 문자열을 만들어 반환해준다.
var = "문자열"
var_2 = var.replace("문", "가")
print(var, var_2)
[결과]
문자열 가자열
변경할 수 있는 객체
대표적으로 리스트가 있다.
다른 객체를 생성하는 형 변환 알아보기
파이썬에서 형 변환은 새로운 객체를 만드는 것이다. 다른 클래스의 객체를 만들려면 클래스가 객체를 생성할 때 필요한 매개변수에 인자를 전달해야 한다.
s = "100"
i = int(s)
print(type(i))
f = float(s)
print(type(f))
print(type(s))
[결과]
<class 'int'>
<class 'float'>
<class 'str'>
변경 가능 여부 정보 확인하기
객체를 변경할 수 있다는 것은 변경할 수 있는 함수로 클래스를 정의했다는 뜻이다.
클래스에는 속성과 함수 등을 관리하는 이름공간인 __dict__가 만들어진다. 문자열 클래스 str로 이름공간에 있는 색인 연산 __getitem__을 조회하면 C언어로 작성된 객체라는 것을 알 수 있다.
__setitem__을 조회하면 내부에 구현되지 않았다. 이는 변경할 수 있는 __setitem__이 작성되지 않아 내부의 원소를 변경할 수 없다는 것이다.
print(str.__dict__['__getitem__'])
print(str.__dict__['__setitem__'])
[결과]
<slot wrapper '__getitem__' of 'str' objects>
Traceback (most recent call last):
File "C:\Users\reo91\OneDrive\Coding Practice\P C++, Python\Python2.py", line 2, in <module>
print(str.__dict__['__setitem__'])
KeyError: '__setitem__'
내장 클래스 list는 변경과 삭제가 가능하다. 이는 색인 연산으로 처리하는 3개의 스페셜 메소드 __getitem__, __setitem__, __delitem__이 모두 작성되어 있다는 것을 뜻한다.
참고
- 한권으로 개발자가 원하던 파이썬 심화 A to Z, 문용준/문성혁 저
'◎ Python > 파이썬 심화 (책)' 카테고리의 다른 글
[파이썬 심화] 6. 문서화와 주석으로 꾸미기 (1) | 2022.08.28 |
---|---|
[파이썬 심화] 5. 문장 꾸미기 (0) | 2022.08.27 |
[파이썬 심화] 3. 프로그램은 표현식과 문장을 평가해 실행된다 (0) | 2022.08.23 |
[파이썬 심화] 2. 파이썬의 모든 값은 객체(object)다 (0) | 2022.08.22 |
[파이썬 심화] 1. 변수에 관한 고찰 (0) | 2022.08.21 |
자기계발 블로그