[강의 요약]
[Ch 03. 파이썬 중급] 강의 수강
17_객체지향 프로그래밍부터 20_객체와 메모리까지 강의 수강하였음
🐢 100일 챌린지 🔥 : [■■■■■■■░ ] 15/100일 (15%)
자격증 시험이 얼마 남지 않아서 04.05까지는 최소한의 강의를 수강할 예정
이번에는 가볍게 글을 작성하는 게 목표
이전 글은 방대하게 작성하느라 시간이 많이 들었는데 가볍게 복습용으로 보기에는 힘들었음 ㅠ
[객체지향 프로그래밍]
한 줄로 요약하자면 "복잡한 세상을 간단하게 코드로 표현하는 방법"
- 객체지향이란?
- 객체(Object) = 속성(데이터) + 기능(동작)
- 프로그래밍에서 실제 사물을 '객체'로 표현하고, 그 객체들이 서로 상호작용하면서 프로그램을 구성하는 방식
의미는 그렇다고 하는데, 예시를 통해 이해해 보자
- 계산기
- 속성 : 숫자
- 기능 : 더하기, 빼기, 곱하기, 나누기
- 자동차
- 속성 : 색상, 길이, 가격
- 기능 : 전진, 후진, 정지
마치 현실 속 사물처럼, 프로그램 안에서도 '객체'가 상태(속성)를 가지고 행동(기능)을 한다!
- 객체는 어떻게 만드는가?
- 클래스(Class) 개념부터 알아야 한다.
- 클래스는 '설계도', 객체는 그 설계도로 만든 '제품'
예를 들어 '자동차'라는 설계도(Class)를 바탕으로 자동차 A, B, C 객체를 만들 수 있다.
클래스: 자동차(Car)
├─ 속성: 색상, 길이, 가격
└─ 기능: 전진, 후진, 정지
➡ 객체 생성:
- 자동차A(CarA)
- 자동차B(CarB)
- 자동차C(CarC)
클래스는 객체를 찍어내는 붕어빵 틀
객체는 각각 만들어진 붕어빵이라고 생각하면 이해가 쉽다.
- 객체를 사용하면 장점이 무엇일까?
코드 재사용이 쉬워진다.
- 한 번 만든 클래스는 다양한 객체에 재사용할 수 있다.
강의에서 자동차를 예시로 설명을 했는데 보도록 하자.
같은 클래스로 만든 자동차지만, 속성을 달리해서 다양하게 사용 가능하다.
모듈화와 유지보수에 강하다.
- 기능별로 객체를 나누니까 구조가 보기 쉽고 수정도 편하다
- 특정 객체만 수정해도 다른 부분에 영향을 주지 않는다
- 실무에서 코드가 커질수록 객체지향은 진가를 발휘한다(그렇다고 한다)
▶ 예시 코드
# 자동차 클래스를 만들고
class Car:
def __init__(self, color, length):
self.color = color
self.length = length
def drive(self):
print("전진합니다.")
# 객체 생성
myCar = Car("red", 4)
print(myCar.color) # 빨간색
myCar.drive() # 전진합니다.
▶ 요약
[클래스와 객체 생성]
- 클래스란?
- 쉽게 말해서 물건을 만들기 위한 틀(설계도)
예를 들어서 자동차 공장에서 자동차를 만들기 전에
"이 자동차는 어떤 색이어야 하고, 얼마나 길어야 하고, 어떤 기능이 있어야 해~!"
이런 걸 정해두는 것이 클래스(class)이다.
class Car:
def __init__(self, color, length):
self.color = color
self.length = length
def doStop(self):
print('STOP!!')
def doStart(self):
print('START!!')
- 객체 생성이란?
클래스를 만들었다면, 진짜 자동차를 만들어보자
car1 = Car('red', 200)
car2 = Car('blue', 300)
car1은 빨간색에 길이 200인 자동차
car2는 파란색에 길이 300인 자동차가 만들어진다~
이걸 뭐라고 부른다? 객체(object)라고 부른다!
클래스로부터 만들어진 실제 물건이라고 생각하면 된다.
- 객체를 사용해 보자
위에서 만든 자동차가 실제로 움직일 수도 있다!
어떻게? 이렇게
car1.doStart() # 출력: START!!
car1.doStop() # 출력: STOP!!
car1이 출발하거나 멈추는 기능을 사용하는 것
마치 자동차 리모컨 버튼을 누르는 느낌
▶ 요약
- 클래스를 만들면 객체를 만들어낼 수 있다.
- 객체는 정보를 가지고 있으며, 행동도 할 수 있다.
[객체 속성 변경]
객체지향 프로그래밍의 큰 장점 중 하나는 객체의 속성(변수)을 필요에 따라 변경할 수 있다는 것
컴 부품을 업그레이드하는 것처럼 프로그램에서도 유연하게 상태를 바꿀 수 있다!
# 객체의 속성은 언제든지 변경 가능!!
class NewGenerationPC:
def __init__(self, name, cpu, memory, ssd):
self.name = name
self.cpu = cpu
self.memory = memory
self.ssd = ssd
def printPCInfo(self):
print(f'name: {self.name}')
print(f'cpu: {self.cpu}')
print(f'memory: {self.memory}')
print(f'ssd: {self.ssd}')
# 객체 생성
myPc = NewGenerationPC('myPC', 'i5', '16G', '256G')
friendPc = NewGenerationPC('friendPC', 'i7', '32G', '512G')
myPc.printPCInfo()
friendPc.printPCInfo()
각각 다른 사양을 가진 두 대의 PC를 만든 것
그러고 나서 myPc의 성능을 업그레이드
myPc.cpu = 'i9'
myPc.memory = '64G'
myPc.ssd = '1T'
이렇게 속성만 바꾸면 클래스 코드를 수정하지 않아도 myPc 객체의 상태가 바로 바뀌는 것을 확인할 수 있음!
▶ 실습 : 계산기 클래스를 만들고 숫자를 변경
class Calculator:
def __init__(self):
self.number1 = 0
self.number2 = 0
self.result = 0
def add(self):
self.result = self.number1 + self.number2
return self.result
def sub(self):
self.result = self.number1 - self.number2
return self.result
def mul(self):
self.result = self.number1 * self.number2
return self.result
def div(self):
self.result = self.number1 / self.number2
return self.result
계산기 객체를 만들고 속성 값을 변경하면서 다양한 연산 가능
calculator = Calculator()
calculator.number1 = 10
calculator.number2 = 20
print(calculator.add()) # 30
print(calculator.sub()) # -10
print(calculator.mul()) # 200
print(calculator.div()) # 0.5
# 값 변경 후 다시 계산
calculator.number1 = 3
calculator.number2 = 5
print(calculator.add()) # 8
print(calculator.sub()) # -2
print(calculator.mul()) # 15
print(calculator.div()) # 0.6
위 코드에서 보이는 것처럼 calculator.number1과 calculator.number2를 코드 중간에
얼마든지 바꿀 수 있고, 그 결과도 바로 적용되는 걸 확인할 수 있다.
▶ 요약
- 객체의 속성은 클래스에서 설정한 초기값과 무관하게 나중에 자유롭게 변경 가능
- 클래스를 한 번만 만들어두면, 다양한 조합과 변형으로 재사용성이 매우 높아짐
- 객체지향 프로그래밍이 실생활과 비슷하게 느껴지는 이유도 이러한 유연성 덕분
[객체와 메모리]
파이썬에서 객체는 우리가 만들거나 사용하는 모든 것들을 뜻함
예를 들면, 숫자, 리스트, 클래스에서 만든 인스턴스 등이 모두 객체!
그런데 이 객체들은 컴퓨터 메모리에 저장되고, 변수는 이 객체가 어디에 있는지를 가리키는 주소(참조)를 저장한다.
- 변수
- 객체를 가리키는 주소표
- 객체
- 진짜 데이터가 저장된 공간
class Robot:
def __init__(self, color, height, weight):
self.color = color
self.height = height
self.weight = weight
def printRobotInfo(self):
print('-' * 20)
print(f'color: {self.color}')
print(f'height: {self.height}')
print(f'weight: {self.weight}')
print('-' * 20)
rb1 = Robot('red', 200, 80)
rb2 = Robot('blue', 300, 120)
rb3 = rb1 # rb1을 복사한 게 아니라, 같은 메모리 주소를 가리킴!
여기서 rb1과 rb3는 같은 객체를 가리키는 것
그래서 rb1을 수정하면 rb3도 같이 바뀐다~!
rb1.color = 'gray'
rb1.height = 250
rb1.weight = 100
rb3.printRobotInfo()
리스트도 마찬가지인데 코드를 보자
list1 = [1, 2, 3]
list3 = list1 # 같은 리스트를 가리킴
list1.append(4) 해주면, list3도 같이 바뀐다.
왜? 둘은 같은 주소를 보고 있으니까.
list3 = list1.copy() # 이건 진짜 복사 (깊은 복사)
이러면 이제 list1을 바꿔도 list3에는 영향이 없다.
▶ 실습 : 계산기 클래스를 만들고 숫자를 변경
scores = [77, 82, 91]
copyScores = scores.copy()
for idx, score in enumerate(copyScores):
result = score * 1.1
copyScores[idx] = 100 if result > 100 else result
print(f'이전 평균: {round(sum(scores) / len(scores), 2)}')
print(f'이후 평균: {round(sum(copyScores) / len(copyScores), 2)}')
이 코드에서 copy()를 사용하지 않았다면
원래 점수 리스트까지 변해서 평균이 이상하게 나왔을 것
그래서 복사할 땐 반드시 .copy() 같은 기능을 써서 진짜 복사해 주는 게 중요함!!
▶ 요약
- 변수는 객체의 메모리 주소를 저장함
- a = b는 복사가 아니라, 같은 객체를 가리키는 것
- .copy()를 쓰면 진짜 복사(새로운 메모리 공간)가 됨
- 클래스, 리스트, 딕셔너리 등 모두 이 개념에 적용됨
[나의 생각 정리]
- 객체는 메모리에 저장되고, 변수는 그 주소를 가리킨다는 개념
- 단순히 변수 = 데이터가 아니라 변수 = 객체의 위치
[적용점]
- 객체를 다룰 때는 주소 공유에 주의
- 진짜 복사가 필요할 땐 .copy()를 꼭 사용
“이 글은 제로베이스 데이터 스쿨 주 3일반 강의 자료 일부를 발췌하여 작성되었습니다.”
'제로베이스 데이터 취업 파트타임 > 100일 챌린지_일일 학습 일지' 카테고리의 다른 글
제로베이스 데이터 파트타임 스쿨 학습 일지 [25.04.02] (1) | 2025.04.02 |
---|---|
제로베이스 데이터 파트타임 스쿨 학습 일지 [25.04.01] (1) | 2025.04.01 |
제로베이스 데이터 파트타임 스쿨 학습 일지 [25.03.30] (0) | 2025.03.30 |
제로베이스 데이터 파트타임 스쿨 학습 일지 [25.03.29] (0) | 2025.03.29 |
제로베이스 데이터 파트타임 스쿨 학습 일지 [25.03.28] (0) | 2025.03.28 |