한 걸음씩 기록하며
#.10 Object(객체)에 대하여 본문
* 객체의 구성
- Data, Attribute / Behavior, Method
1. Object(객체)와 Variable(변수)에 대해서 (C언어와 Python의 차이)
출처 : foobarnbaz.com
다른 언어들에서는 값이 담겨 있는 공간의 별칭을 "변수(Variable)"이라고 한다. 그러나 파이썬은 변수라는 메모리 공간에 값을 직접 지정하지 않는다. 파이썬에서 사용되는 모든 것(변수, 클래스, 함수 등등)들은 모두 "객체(Object)"이다.
변수에 저장한다고 생각한 객체들은 실제로는 다른 메모리 공간에 저장되어 있고, 변수는 값 객체를 가리키고만 있다.
따라서 숫자나 문자도 모두 객체인 파이썬에서는, 동일한 객체의 값의 경우에는 값은 주소 값을 가진다.
C언어에서 변수는 박스와 같다. a = 2 라는 것은, object 2를 변수 a에 넣은 것이다.
만약 b = 2 라고 선언하면, b라는 변수에 2를 넣는다.
그러나 파이썬은 다르다. 파이썬의 변수는 박스가 아닌 태그와 같다.
파이썬에서 a =2, b=2라고 선언하면, 2라는 객체에 a,b라는 변수가 태그된다.
2. Immutable & mutable (불변 객체와 가변 객체)
파이썬에서 사용되는 모든 것은 객체라고 하였다. 이 객체는 불변, 가변 여부에 따라 구분되고, 파이썬은 이것을 다르게 핸들링한다.
- Immutable : 생성 이후 값을 바꿀 수 없는 객체
- 예시 : 숫자, 논리, 튜플처럼 변경이 불가능한 변수들
a = 100
b = a
a = a + 10
print(a) # result : 110
print(b) # result : 100
#a와 b의 id address는 다르다
#int가 불변객체이기 때문이다.
- mutable : 값이 바뀔 수 있는 객체
- 예시 : 리스트, 집합, 딕셔너리처럼 변경 가능한 변수들
a = [1,2,3]
b = a #id(a) == id(b)
a.pop()
print(a) #result [1,2]
print(b) #result [1,2]
#id(a) == id (b)
- 내장 함수인 id(), type()을 사용해 변수가 어떤 타입의 객체와 연관되어 있고, 바뀔 수 있는 객체인지를 확인할 수 있다.
- type(): 객체의 data type을 반환한다.
- id(a): a가 저장되어 있는 메모리의 주소. 객체의 id를 정수 형태로 반환한다.
- is operator: 두 객체의 id를 비교해준다. x is y #result: True
3. Copy에 관하여
1) 단순 복사
- 위와 같이 단순 복사(a=b)를 하게되면, mutable한 객체가 복사된 객체와 동일한 값을 가리켜, 값이 바뀔 수 있다.
2) 얕은 복사
- 위와 같은 문제를 해결하기 위해, 얕은 복사의 개념이 있다.
- 얕은 복사는 객체 container를 별도 생성하지만, 객체 내부의 객체들은 기존 값과 동일하다. 그래서 수정해도 복사본만 바뀌게 할 수 있다.
- 하지만 얕은 복사는 객체 내부가 mutable 하다면 단순복사와 동일한 현상이 발생한다.
import copy
a = [0, [1, 2]]
b = copy.copy(a) #b는 a와 동일한 값을 가진다.
b[0] = 10 #a는 동일, b = [10, [1, 2]]
c = copy.copy(a)
c[1].append(3) #리스트의 두번째 item(객체 내부)에 3을 추가, a도 변경이 적용된다.
#a = [0, [1, 2, 3]]
#c = [0, [1, 2, 3]]
3) 깊은 복사
- 깊은 복사는 내부에 객체들까지 모두 새롭게 copy되는 것이기 때문에, mutable한 내부 객체를 수정하더라도 복사본만 해당된다.
a = [[1],[2]]
b = copy.deepcopy(a)
b[1].append(3)
# a = [[1],[2]]
# b = [[1],[2,3]]
'Python' 카테고리의 다른 글
#.12 Module, Package (0) | 2021.12.22 |
---|---|
#.11 Class (0) | 2021.12.22 |
#.9 객체지향 프로그래밍 (OOP) (0) | 2021.12.22 |
#.8 Data Structure Method (0) | 2021.12.21 |
#.7 Data Structure : list, tuple, set, dict (0) | 2021.12.20 |
Comments