코딩/파이썬

[새싹 성동 2기] 객체 지향 프로그래밍 (OOP) 기초

insu90 2024. 12. 11. 21:55

객체 지향 프로그래밍 (OOP) 기초

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍을 객체 단위로 설계하여 코드의 재사용성과 유지보수성을 높이는 방법론입니다. 이번 글에서는 클래스, 인스턴스, 클래스 메서드, 그리고 상속에 대해 알아보겠습니다.

1. 클래스와 인스턴스

클래스는 객체를 생성하기 위한 틀 또는 설계도입니다. 인스턴스는 클래스에서 생성된 실제 객체입니다. 아래 예제에서 Dog 클래스는 모든 강아지 객체를 생성하는 설계도 역할을 합니다.

class Dog:
    species = "Canis familiaris"  # 클래스 변수: 모든 인스턴스가 공유하는 변수

    def __init__(self, name, age):
        self.name = name          # 인스턴스 변수: 각 인스턴스마다 고유한 값
        self.age = age            # 인스턴스 변수: 각 인스턴스마다 고유한 값

    def bark(self):               # 메서드: 객체의 동작 정의
        return f"{self.name} says woof!"

# 객체 생성
dog1 = Dog("Buddy", 3)
dog2 = Dog("Max", 5)

# 메서드 호출
print(dog1.bark())  # Buddy says woof!
print(dog2.bark())  # Max says woof!

위 코드에서:

  • 클래스 변수 species는 모든 인스턴스가 공유합니다.
  • nameage는 인스턴스마다 고유한 값으로 초기화됩니다.

2. 클래스 변수와 클래스 메서드

클래스 변수는 모든 인스턴스가 공유하는 변수입니다. 클래스 메서드는 클래스 변수에 접근하거나 조작할 때 사용됩니다. 아래 예제를 통해 자세히 알아보겠습니다.

class MyClass:
    instance_count = 0  # 클래스 변수: 생성된 인스턴스의 개수를 저장
    class_variable = 0  # 클래스 변수

    def __init__(self):
        MyClass.instance_count += 1  # 인스턴스가 생성될 때마다 증가

    @classmethod
    def get_instance_count(cls):
        return cls.instance_count  # 클래스 변수를 반환

    @classmethod
    def increment_class_variable(cls):
        cls.class_variable += 1  # 클래스 변수 증가

    @classmethod
    def get_class_variable(cls):
        return cls.class_variable  # 클래스 변수 반환

# 객체 생성
obj1 = MyClass()  # 첫 번째 인스턴스 생성 -> instance_count = 1
obj2 = MyClass()  # 두 번째 인스턴스 생성 -> instance_count = 2

# 클래스 메서드 호출
print("인스턴스 개수")
print(MyClass.get_instance_count())  # 2
print(obj1.get_instance_count())     # 2
print(obj2.get_instance_count())     # 2

print("클래스 변수 증가 전")
print(MyClass.get_class_variable())  # 0

# 클래스 변수 증가
MyClass.increment_class_variable()
obj1.increment_class_variable()
obj2.increment_class_variable()

print("클래스 변수 증가 후")
print(MyClass.get_class_variable())  # 3
  • instance_count는 생성된 인스턴스의 수를 저장하는 클래스 변수입니다.
  • 클래스 메서드는 @classmethod 데코레이터로 정의되며, 첫 번째 인자로 클래스를 받습니다.

3. 상속과 다형성

상속은 기존 클래스의 기능을 재사용하면서 새로운 기능을 추가하는 데 사용됩니다. 다형성은 동일한 메서드 이름이 다른 클래스에서 다양한 방식으로 동작하도록 구현하는 것입니다.

class Animal:
    def __init__(self, name):
        self.name = name  # 인스턴스 변수: 이름 저장

    def speak(self):
        raise NotImplementedError("서브 클래스에서 반드시 구현해야 함")

class Dog(Animal):
    def speak(self):
        return f"{self.name} 멍멍"

class Cat(Animal):
    def speak(self):
        return f"{self.name} 야옹"

def hello(animal: Animal):
    print(animal.speak())  # 다형성을 활용한 메서드 호출

# 객체 생성 및 함수 호출
d = Dog("강아지")
hello(d)  # 강아지 멍멍

c = Cat("고양이")
hello(c)  # 고양이 야옹

 

위 코드에서:

  • Animal 클래스는 부모 클래스입니다.
  • DogCat 클래스는 Animal 클래스를 상속받아 각각 speak 메서드를 구현합니다.
  • 다형성을 통해 동일한 함수 hello에서 다양한 객체를 처리할 수 있습니다.

객체 지향 프로그래밍은 코드의 재사용성을 높이고 유지보수를 쉽게 만들어줍니다.

  • 클래스와 인스턴스: 설계도와 실제 객체.
  • 클래스 변수와 메서드: 공유되는 데이터와 이를 조작하는 메서드.
  • 상속과 다형성: 코드 재사용과 다양한 동작 구현.

 

 

 

 

 

*생성형 AI 활용한 클라우드&보안 전문가 양성캠프 과정의 교육내용 정리 자료입니다.