본문 바로가기

개발공부/python

패스트캠퍼스 환급챌린지 12일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기

반응형

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

 

Ch. 12. 심화 : 파이썬 객체와 클래스를 활용한 프로젝트를 해볼까요? 

 

파이썬, 객체와 클래스: 코드의 효율성과 구조화를 위한 핵심 개념

파이썬 프로그래밍에서 객체(Object)클래스(Class)는 가장 근본적이면서도 중요한 개념입니다. 파이썬의 거의 모든 요소, 즉 숫자, 문자열, 리스트를 포함한 모든 데이터 타입은 사실 객체로 존재합니다. 이 개념들을 명확하게 이해하는 것은 더욱 복잡하고 견고한 프로그램을 작성하기 위해 필수적입니다.

파이썬의 객체와 클래스가 무엇인지, 그리고 이들을 활용하는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 원리와 실용적인 예시를 상세히 설명하고자 합니다.


객체 지향 프로그래밍 (OOP)의 필요성

객체와 클래스는 OOP라는 프로그래밍 패러다임의 핵심 구성 요소입니다. OOP는 현실 세계의 사물을 코드로 모델링하는 방식과 유사합니다.

예를 들어, 현실의 '자동차'는 색상, 모델, 속도와 같은 속성(Property)을 가지고 있으며, '달린다', '멈춘다'와 같은 행동(Action)을 수행합니다. OOP는 이와 같이 속성과 행동을 하나의 논리적 단위인 '객체'로 묶어 프로그램을 설계합니다.

OOP를 활용하면 다음과 같은 장점을 얻을 수 있습니다.

  • 재사용성: 한 번 정의한 클래스는 프로그램의 여러 부분에서 재사용할 수 있습니다.
  • 유지보수성: 코드의 특정 객체에서 문제가 발생했을 경우, 해당 객체만 수정하여 전체 코드에 미치는 영향을 최소화할 수 있습니다.
  • 가독성: 현실 세계의 개념과 유사한 방식으로 코드를 구성하여 프로그램의 구조를 쉽게 파악할 수 있습니다.
  • 확장성: 기존의 클래스를 변경하지 않고도 새로운 기능을 추가하여 기능을 확장하기 용이합니다.

클래스(Class): 객체의 '설계도'

클래스는 특정 종류의 객체가 가져야 할 속성과 행동을 정의하는 '설계도' 또는 '틀'입니다. 클래스를 통해 만들어지는 객체들은 모두 동일한 속성들을 가지지만, 각 객체는 고유한 속성값을 가질 수 있습니다.

클래스 정의 방법

파이썬에서는 class 키워드를 사용하여 클래스를 정의합니다.

class ClassName:
    # 클래스 멤버 (속성)
    # 메서드 (행동)
    pass

예시: Person 클래스 정의

'사람'을 나타내는 Person 클래스를 만들어 보겠습니다. 사람은 '이름'과 '나이'라는 속성을 가지고, '인사하는' 행동을 할 수 있습니다.

class Person:
    # 생성자 (Constructor): 객체가 생성될 때 호출되는 특별한 메서드
    # self는 생성되는 객체 자신을 의미합니다.
    def __init__(self, name, age):
        self.name = name  # name 속성
        self.age = age    # age 속성

    # 메서드 (Method): 객체가 수행할 수 있는 행동
    def greet(self):
        print(f"안녕하세요, 제 이름은 {self.name}이고, {self.age}살입니다.")

    def birthday(self):
        self.age += 1
        print(f"생일 축하합니다! 이제 {self.age}살이 되었습니다.")

여기서 중요한 요소는 다음과 같습니다.

  • class Person:: Person이라는 이름의 클래스를 정의함을 나타냅니다. 클래스 이름은 관례적으로 대문자로 시작하는 파스칼 케이스(PascalCase)를 사용합니다.
  • __init__(self, name, age): 이 메서드는 생성자라고 불리며, Person 클래스로 객체를 생성할 때 가장 먼저 자동으로 호출됩니다.
  • self.name = name: self를 사용하여 정의된 변수는 해당 객체에 속하는 속성(Attribute)이 됩니다. 이 속성값은 객체마다 다르게 할당될 수 있습니다.
  • greet(self): 이 함수를 메서드(Method)라고 하며, 해당 클래스로 생성된 객체가 수행할 수 있는 행동을 정의합니다. 메서드의 첫 번째 매개변수 또한 self여야 합니다.

객체(Object): 클래스로 만들어진 '실체'

객체는 클래스라는 설계도에 따라 만들어진 '실체' 또는 '인스턴스(Instance)'입니다. 하나의 클래스에서 여러 개의 객체를 생성할 수 있으며, 각 객체는 독립적인 속성값을 가집니다.

객체 생성 방법

클래스 이름 뒤에 괄호 ()를 붙여 호출하면 새로운 객체가 생성됩니다. 이때 생성자에 필요한 인수를 전달해야 합니다.

# Person 클래스로 '철수' 객체 생성
chulsu = Person("김철수", 30)

# Person 클래스로 '영희' 객체 생성
younghee = Person("박영희", 25)

print(f"철수 객체의 이름: {chulsu.name}, 나이: {chulsu.age}")
print(f"영희 객체의 이름: {younghee.name}, 나이: {younghee.age}")

# 객체의 메서드 호출
chulsu.greet()
younghee.greet()

chulsu.birthday() # 철수 객체의 나이만 1 증가
chulsu.greet()

위 예시에서 chulsu와 younghee는 Person 클래스의 독립적인 인스턴스입니다. 각 객체는 자신만의 name과 age 속성을 가지며, greet()와 birthday() 메서드를 독립적으로 실행합니다.


속성과 메서드의 종류

객체와 클래스는 속성과 메서드로 구성되며, 이들은 사용 목적에 따라 여러 종류로 나뉩니다.

속성 (Attribute)

객체의 데이터를 의미하며, 크게 두 가지로 분류됩니다.

  • 인스턴스 속성: __init__ 메서드 내에서 self.속성명 형태로 정의하며, 각 객체마다 고유한 값을 가집니다.
  • 클래스 속성: 클래스 내부에 직접 정의하며, 해당 클래스로 만들어진 모든 객체가 공유하는 값입니다.

예시: 클래스 속성

class Car:
    # 클래스 속성: 모든 Car 객체가 공유하는 값
    wheel_count = 4

    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color

    def display_info(self):
        print(f"{self.color}색 {self.brand} {self.model} (바퀴 {self.wheel_count}개)")

my_car = Car("Hyundai", "Sonata", "White")
your_car = Car("Kia", "K5", "Black")

my_car.display_info()
your_car.display_info()

# 클래스 속성은 클래스 이름으로 접근 가능합니다.
print(f"모든 자동차의 바퀴 수: {Car.wheel_count}")

# 클래스 속성 변경 시 모든 인스턴스에 영향을 줍니다.
Car.wheel_count = 6
my_car.display_info()

메서드 (Method)

객체가 수행할 수 있는 행동을 의미하며, 세 가지 주요 종류가 있습니다.

  • 인스턴스 메서드: 가장 일반적인 형태로, self를 첫 번째 인수로 받아 객체 자체의 속성에 접근하거나 수정합니다.
  • 클래스 메서드 (@classmethod): self 대신 클래스 자체를 나타내는 cls를 첫 번째 인수로 받습니다. 클래스 속성에 접근하거나 새로운 인스턴스를 생성하는 데 활용됩니다. @classmethod 데코레이터를 사용합니다.
  • 정적 메서드 (@staticmethod): self나 cls를 받지 않습니다. 객체의 속성이나 클래스 속성과 관련 없이 독립적으로 작동하는 일반 함수와 유사하며, 유틸리티 함수 등으로 활용됩니다. @staticmethod 데코레이터를 사용합니다.

예시: 클래스 메서드와 정적 메서드

class Calculator:
    # 클래스 속성
    operation_count = 0

    def __init__(self, name):
        self.name = name

    # 인스턴스 메서드
    def add(self, a, b):
        Calculator.operation_count += 1
        return a + b

    # 클래스 메서드
    @classmethod
    def get_operation_count(cls):
        # cls는 Calculator 클래스 자체를 가리킵니다.
        return f"총 수행된 연산: {cls.operation_count}회"

    # 정적 메서드
    @staticmethod
    def greet_calculator():
        return "계산기 사용을 환영합니다!"

my_calc = Calculator("내 계산기")
your_calc = Calculator("친구 계산기")

print(my_calc.add(10, 5))
print(your_calc.add(20, 7))
print(my_calc.add(3, 4))

# 클래스 메서드 호출
print(Calculator.get_operation_count()) # 총 수행된 연산: 3회

상속 (Inheritance): 코드의 확장과 재활용

상속은 어떤 클래스(부모 클래스)의 속성과 메서드를 다른 클래스(자식 클래스)가 물려받아 사용할 수 있게 하는 OOP의 핵심 기능입니다. 이는 코드의 재사용성과 확장성을 극대화합니다.

상속의 장점

  • 코드 재사용: 부모 클래스의 기능을 자식 클래스에서 별도로 작성할 필요가 없습니다.
  • 확장성: 기존 클래스의 기능을 유지하면서 새로운 기능만 자식 클래스에 추가할 수 있습니다.
  • 계층 구조: 클래스 간에 논리적인 관계를 구축하여 코드 구조를 명확하게 합니다.

상속 사용 방법

class ParentClass:
    # 부모 클래스의 속성 및 메서드
    pass

class ChildClass(ParentClass): # 괄호 안에 부모 클래스 이름을 명시
    # 자식 클래스만의 추가 속성 및 메서드
    pass

예시: Animal과 Dog 클래스 상속

class Animal:
    def __init__(self, name, sound):
        self.name = name
        self.sound = sound

    def make_sound(self):
        print(f"{self.name}이(가) {self.sound} 소리를 냅니다.")

    def eat(self):
        print(f"{self.name}이(가) 먹습니다.")

# Dog 클래스는 Animal 클래스를 상속받습니다.
class Dog(Animal):
    def __init__(self, name, breed):
        # super() 함수로 부모 클래스의 __init__ 메서드 호출
        super().__init__(name, "멍멍")
        self.breed = breed

    def bark(self): # Dog만의 새로운 메서드
        print(f"{self.name}, 왈왈 짖습니다!")

    def make_sound(self): # 부모의 메서드를 재정의 (오버라이딩)
        print(f"{self.name} (종: {self.breed})이(가) {self.sound} 소리를 냅니다.")

my_animal = Animal("고양이", "야옹")
my_animal.make_sound()
my_animal.eat()

my_dog = Dog("바둑이", "진돗개")
my_dog.make_sound() # 재정의된 메서드가 호출됩니다.
my_dog.bark() # Dog만의 메서드
my_dog.eat() # Animal로부터 상속받은 메서드

 

오늘의 실습

 

 

 

 

https://fastcampus.info/4n8ztzq

 

(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스

초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!

fastcampus.co.kr

 

반응형