개요
- 파이썬에서 모든 것은 객체(object)라는 문구를 보고 궁금하여 작성하게 된 글이다.
- 파이썬에서 "모든 것이 객체"라는 말은 파이썬에서 사용되는 데이터와 함수, 모듈, 클래스 등이 모두 객체로 구현되어 있다는 것을 의미합니다. 이는 각 요소가 데이터와 함수(메서드)를 모두 포함할 수 있다는 뜻이며, 이 객체들이 속성과 메서드를 가질 수 있다는 것을 의미합니다. 객체 지향 프로그래밍의 핵심 개념을 파이썬이 근본적으로 통합하고 있음을 나타냅니다.
- 따라서 아래의 그림처럼 "1.1"이라는 실수 객체에 is_integer()라는 메소드를 통해 바로 결과값을 확인해 볼 수 있다는 뜻입니다.
- 자바(Java): 자바는 객체 지향 프로그래밍 언어이지만, 기본 데이터 유형(int, long, boolean 등)은 객체가 아니라 '프리미티브 타입'으로 분류됩니다. 이들은 객체처럼 메소드를 가질 수 없습니다. 그러나 자바는 프리미티브 타입의 래퍼 클래스를 제공하여 객체로써의 기능을 사용할 수 있게 합니다.
- C++: C++은 객체 지향 프로그래밍을 지원하지만 모든 것이 객체인 것은 아닙니다. 예를 들어, 기본 데이터 타입들은 클래스가 아니며 메서드를 갖지 않습니다.
파이썬의 변수선언 방식
1. 변수는 객체를 가리키는 참조
- 파이썬에서 변수를 선언하고 값을 할당할 때, 변수 a는 실제 데이터 1.1을 직접 저장하지 않습니다. 대신, 1.1 값을 가진 float 객체를 가리키는 주소를 저장합니다.변수는 그저 객체를 가리키는 이름 또는 레이블 역할을 합니다.
Python의 경우에는 일반적으로 실수(float) 리터럴 1.1을 사용하면 근사값을 가진 부동 소수점 숫자(float) 객체를 생성한다고 합니다.
2. 객체의 타입:
- 1.1은 float 클래스의 인스턴스입니다. 이는 1.1이라는 실수 데이터가 float 타입의 객체로 구현되어 있음을 의미합니다. 객체는 메모리에 할당된 후, 해당 객체를 가리키는 참조가 변수에 저장됩니다.
a = 1.1
예시
- 위의 코드와 같이 데이터 값을 변경하더라도 b가 가르키는 데이터가 참조가 달라진거기 때문에 a의 값은 변경되지 않습니다.
- 하지만 리스트형식에서는 다른점을 보입니다. 이는 아래에서 확인해 보겠습니다.
Mutable과 Immutable
- 파이썬에서 변수는 참조하는 값이 뮤터블(mutalbe) 객체인지 이뮤터블(immutable) 객체인지에 따라 값이 변경될 수 있느냐 없느냐로 나뉘어 집니다.
- Mutable Object : list, dict, set 등의 객체 (생성 후 그 상태를 변경할 수 있는 객체)
- Immutable Object : str, int, tuple 등의 객체 (생성 후 그 상태를 변경할 수 없는 객체)
- 따라서, 튜플 형태인 변수에 값을 추가더라도 먼저 선언된 튜플의 값은 변경되지 않습니다.
- 또한, 리스트 형태인 변수에 값을 추가하게 되면 먼저 선언된 리스트의 값도 변경됩니다.
Python의 Call by Assignment
- Python에서 함수에 인자를 전달할 때, 실제로 전달되는 것은 인자가 가리키고 있는 객체에 대한 참조입니다. 즉, 함수 내에서 인자의 이름을 사용하여 그 인자가 참조하는 객체에 접근할 수 있습니다.
- 또한, 변수에 값을 할당하는 것도 사실은 객체에 대한 참조를 변수에 할당하는 것입니다. 따라서 변수에 값을 할당하는 것도 "call by assignment"의 개념에 따라 동작합니다.
- 따라서, 함수의 인자를 호출할 때에도 해당 인자가 뮤터블(mutalbe) 객체인지 이뮤터블(immutable) 객체인지에 따라 값이 변할 수 있음을 알 수 있습니다.
재밌는 요소
작은 정수 범위에서는 캐싱되어 동일한 메모리 위치를 가지는 경우가 있습니다. 이는 성능상의 이유로 작은 정수값들을 메모리에 미리 할당해두고 재사용함으로써 메모리를 절약하기 위한 것입니다. 따라서 a와 b가 같은 값인 경우에는 동일한 메모리 주소를 가질 수 있습니다.
정리
- 파이썬에서 변수는 값이 아닌, 값이 저장된 객체를 가리키는 참조입니다.
- 이는 파이썬의 모든 구성요소가 객체로 이루어지기 때문에 가능한 일입니다.
참조
'Language > Python' 카테고리의 다른 글
[Python]GIL 너는 대체 머냐? (0) | 2024.04.15 |
---|---|
[Python]파이썬의 숨겨진 심장박동, 레퍼런스 카운팅 (0) | 2024.04.15 |
[Python]리스트의 메모리 할당 (0) | 2023.03.27 |
[Python] 함수 인자 전달 방식 - Call by assignment (0) | 2022.08.22 |