제로베이스 데이터 파트타임 스쿨 학습 일지 [25.03.31]

[강의 요약]

[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일반 강의 자료 일부를 발췌하여 작성되었습니다.”