본문 바로가기
python

파이썬 객체

by 브라더빅 2023. 2. 28.

대학생때 컴퓨터공학을 배우면서 C++, C#, JAVA등 여러 프로그래밍 언어를 배우면서 기본적인 프로그래밍 언어에대한 개념들을 익혔다.

최근 몇년간은 주로 Python을 쓰면서 다른 언어에대해 많이 잊었긴 하지만, 그 개념은 어느정도 유사하다고 생각한다.

그러나 파이썬에도 다른언어와는 다른 파이썬만의 문법이 있을것이고, 이러한 특징에대해 새로이 알게된(이미 아시는분들도 많은 기본적인 것일 수 있지만) 파이썬의 특징에대해 정리하고자 한다.

 

  • 순수 객체 지향
Python에는 원시 타입(Primitive Type)이 존재하지 않으며, 모든 것이 객체로 취급된다. 나아가 클래스, 함수 역시 객체로 취급할 수 있다. 상수 역시 상수가 저장된 객체라고 본다. 다음과 같은 상수 할당문이 있을 때,
x = 10

이는 변수 x 자체에 10이 할당된 것이 아니라 x가 10이 저장된 상수 객체를 가리키는 것을 의미한다. 내부적으로는 C의 포인터 연산과 같은 동작이 행해지는 것이다. 이렇게 x에 대입되는 값을 변경할 경우,
x = 10
x = 20

x가 가리키는 대상이 10이 저장된 상수 객체에서 20이 저장된 상수 객체로 바뀐 것이다. x 자체의 값이 10에서 20으로 바뀐 게 아니다.

 
Python 버전 3의 표준 타입 계층 구조에서 주요 자료형은 그림과 같다. 이 중에서도 크게 불변 객체(Immutable Object)와 가변 객체(Mutable Object)로 나눌 수 있다. 불변 객체에는 숫자, 문자열, 바이트, 그리고 튜플이 있다. 이 네 가지를 제외한 나머지 객체는 모두 가변 객체이며, 값을 수정할 수 있다. 불변 객체의 값을 수정할 때는 바뀐 값이 저장된 새로운 객체를 생성하고 참조 대상을 새 객체로 옮기는 식으로 동작한다. 이와 같은 특징 때문에 Python은 순수 객체지향 언어라고 할 수 있고, 이와 같은 순수 객체 지향 언어의 또 다른 예로는 Ruby가 있다.

다만 객체 지향 언어라는 표현은 주의해서 사용할 필요가 있다. 객체 지향은 어디까지나 프로그래밍 패러다임이므로, Python이 객체 지향 언어임은 프로그램 작성이 항상 객체 지향으로 이루어진다는 의미는 아니다. 대부분 처음 Python을 배울 때는 절차 지향적으로 프로그래밍을 하게 되며, 심지어 함수형 프로그래밍도 할 수 있다.

함수의 매개 변수로 불변 객체를 넘겼냐 가변 객체를 넘겼냐에 따라서 함수 바깥에 있는 인자의 값도 수정할 수 있는지 없는지가 달라진다. 불변 객체를 넘겼으면 값의 복사만 일어나고 함수 바깥에는 영향을 주지 못하므로 '값에 의한 호출(Call by Value)'이 될 것이며, 가변 객체를 넘겼으면 함수 바깥에까지 영향을 줄 수 있으므로 '참조에 의한 호출(Call by Reference)'이 될 것이다. Python 공식 문서에서는 Python의 인자 전달 방식을 '할당에 의한 호출(Call by Assignment)', 또는 '객체 참조에 의한 호출(Call by Object Reference)'이라고 명시하고 있다.
-> 여기서 핵심은 '값에 의한 호출'과 '참조에 의한 호출'이다. 기존에 알던 개념은 모든 매개변수는 값에 의한 호출의 개념으로 알고 있었으며, 포인트 개념이 아닌 그 지역(함수)내에서만 적용된다고 생각하였다. 그래서 이러한걸 간과한 오류가 몇번 있었지만, 알수없는 이유라고 생각했다. 하지만, 실질적으로 파이썬에서는 숫자형, 문자형, 튜플, 바이트의 4가지 객체형태(불변 객체)만 '값에 의한 호출'이 일어나고, 나머지 객체들인 가변 객체들은 '참조에 의한 호출'이 일어나 그 값들이 함수내에서 변경될 수 있다(즉, 해당 객체가 함수 바깥에서도 변경된점이 저장되어 있다).

 

'python' 카테고리의 다른 글

(문법) Pandas Grouper  (0) 2021.05.05
(문법) Asterisk - * / **  (0) 2021.04.29