1. 객체 지향 프로그램에서 객체는 '속성'과 '기능'으로 구성된다.
계산기(calculator)의 경우,
속성 : 숫자(int나 float),
기능 : 덧셈, 뺄셈, ... (add(n1,n2), sub(n1,n2) ...)
결과적으로
계산기(object) = 속성(attribute) + 기능(function)
2. 객체는 클래스에서 생성된다. 클래스를 통해 생성된 객체는 인스턴스라고 한다.
3. 객체는 코드 재사용, 모듈화를 위해 사용된다.
4. 클래스는 class 키워드와 속성(변수) 그리고 기능(함수)를 이용해서 만든다.
5. 인스턴스를 생성할 때, java나 js와 달리 new 키워드 없이 써도 된다.
6. constructor 함수를 사용하는 js와 달리, 파이썬 클래스 내에서 생성자 함수는 __init__으로 정의된다. js에서는 this를 사용하지만, 파이썬에서는 self를 사용한다.
class Car:
# 속성
def __init__(self, color, length):
self.color = color
self.length = length
# 기능
# 클래스 안에 있는 특정한 기능은 매개변수로 self를 받아야 함
def doStop(self):
print('Stop!!')
def doStart(self):
print('Start!!')
def printCarInfo(self):
print(f'color: {self.color}')
print(f'length: {self.length}')
# 클래스로부터 인스턴스 생성
car1 = Car('red', 200)
car2 = Car('blue', 150)
# 인스턴스의 속성 보기
print(car1.color, car1.length) # red 200
# 인스턴스의 기능 보기
car1.doStart() # Start!!
car1.doStop() # Stop!!
car1.printCarInfo()
# color: red
# length: 200
car2.printCarInfo()
# color: blue
# length: 150
7. 인스턴스의 속성을 변경하기 위해서는 (인스턴스).(속성) = ... 의 방식으로 변경하면 된다.
class NewGenerationPC:
def __init__(self, name, cpu, memory, ssd):
self.name = name
self.cpu = cpu
self.memory = memory
self.ssd = ssd
def doExcel(self):
print('EXCEL RUN !!')
def doPhotoShop(self):
print('PhotoShop RUN !!')
def printPCInfo(self):
print(f'self.name: {self.name}')
print(f'self.cpu: {self.cpu}')
print(f'self.memory: {self.memory}')
print(f'self.ssd: {self.ssd}')
pc1 = NewGenerationPC('myPC', 'i5', '16G', '256G')
pc1.printPCInfo()
## 객체의 속성 변경
pc1.cpu = 'i9'
pc1.memory = '64G'
pc1.ssd = '1TB'
pc1.printPCInfo()
pc2 = NewGenerationPC('yourPC', 'i7', '32G', '512G')
pc2.printPCInfo()
8. 변수는 메모리 자체를 저장하는 게 아니라 객체의 메모리 주소를 저장하고 이를 이용해서 객체를 참조한다.
class NewGenerationPC:
def __init__(self, name, cpu, memory, ssd):
self.name = name
self.cpu = cpu
self.memory = memory
self.ssd = ssd
def doExcel(self):
print('EXCEL RUN !!')
def doPhotoShop(self):
print('PhotoShop RUN !!')
def printPCInfo(self):
print(f'self.name: {self.name}')
print(f'self.cpu: {self.cpu}')
print(f'self.memory: {self.memory}')
print(f'self.ssd: {self.ssd}')
pc1 = NewGenerationPC('myPC', 'i5', '16G', '256G')
pc1.printPCInfo()
pc3 = pc1
## 객체의 속성 변경
pc1.cpu = 'i9'
pc1.memory = '64G'
pc1.ssd = '1TB'
pc1.printPCInfo()
pc2 = NewGenerationPC('yourPC', 'i7', '32G', '512G')
pc2.printPCInfo()
pc3.printPCInfo() # 변경된 pc1의 속성과 같은 값 출력
# self.name: myPC
# self.cpu: i9
# self.memory: 64G
# self.ssd: 1TB
9. 메모리 주소를 복사하는 것 말고 메모리 자체를 복사하고 싶으면, copy모듈의 copy.copy() 함수를 사용해야 한다.
10. 그러나 copy.copy()는 '얕은 복사'를 수행하므로, 중첩된 객체(객체 내에 있는 객체들)은 그대로 원본 객체의 메모리를 참조한다.
'얕은 복사'란 객체 주소를 복사하는 것으로, 객체 자체를 복사하지 않는다.
11. 객체 안에 있는 다른 객체까지 복사하는 것을 '깊은 복사'라고 한다. 이는 copy모듈의 copy.deepcopy() 함수를 사용하면 된다.
'깊은 복사'란 객체 자체를 복사하는 것으로, 또 하나의 객체를 만들어 저장한다.
import copy
class NewGenerationPC:
def __init__(self, name, cpu, memory, ssd):
self.name = name
self.cpu = cpu
self.memory = memory
self.ssd = ssd
def doExcel(self):
print('EXCEL RUN !!')
def doPhotoShop(self):
print('PhotoShop RUN !!')
def printPCInfo(self):
print('='*40)
print(f'self.name: {self.name}')
print(f'self.cpu: {self.cpu}')
print(f'self.memory: {self.memory}')
print(f'self.ssd: {self.ssd}')
print('=' * 40)
pc1 = NewGenerationPC('myPC', 'i5', '16G', '256G')
pc1.printPCInfo()
# pc1객체에 대한 깊은 복사 수행
pc3 = copy.deepcopy(pc1)
## 객체의 속성 변경
pc1.name = 'myNewPC'
pc1.cpu = 'i9'
pc1.memory = '64G'
pc1.ssd = '1TB'
pc1.printPCInfo()
pc2 = NewGenerationPC('yourPC', 'i7', '32G', '512G')
pc2.printPCInfo()
pc3.printPCInfo() # 변경되기 전 pc1의 값 출력
# self.name: myPC
# self.cpu: i5
# self.memory: 16G
# self.ssd: 256G
12. 깊은 복사를 하는 방법은 for문을 통한 순회, 리스트의 extend()함수, 리스트의 슬라이싱 기능 활용([:]) 등이 있다.
12. .extends()는 리스트의 값을 변경하지 않고, 리스트의 끝에 복사한 값을 추가하는 함수이다.
original_list = [1, 2, 3]
additional_elements = [4, 5, 6]
original_list.extend(additional_elements)
print(original_list) # 출력: [1, 2, 3, 4, 5, 6]
'파이썬 공부중 > 파이썬 중급' 카테고리의 다른 글
| 파이썬 중급 05. 파일 읽고 쓰기 (1) | 2024.02.10 |
|---|---|
| 파이썬 중급 04. 상속, 오버라이드, 다중 상속, 예외 (1) | 2024.02.10 |
| 파이썬 중급 02. 모듈에 대하여 (1) | 2024.02.10 |
| 파이썬 중급 01. 함수에 대하여 (1) | 2024.02.10 |