파이썬 클래스 (Class): 개념 및 사용법

클래스(Class) 는 객체 지향 프로그래밍(OOP, Object-Oriented Programming)의 기본 단위로, 데이터와 해당 데이터를 처리하는 메서드(함수)를 함께 정의하는 구조입니다. 클래스를 사용하면 프로그램을 논리적으로 구조화하고 코드 재사용성을 높일 수 있습니다.


1. 클래스의 기본 개념

  1. 클래스(Class): 객체를 생성하기 위한 청사진(템플릿)입니다.
  2. 객체(Object): 클래스에서 생성된 인스턴스(instance)입니다.
  3. 속성(Attribute): 객체의 데이터(변수)입니다.
  4. 메서드(Method): 객체가 수행할 수 있는 동작(함수)입니다.

2. 클래스 정의

  • class 키워드를 사용하여 클래스를 정의합니다.
  • 구문:

    class 클래스이름:
        클래스 변수
        메서드
    

  • 예제:

    class Person:
        def __init__(self, name, age):  # 생성자 메서드
            self.name = name
            self.age = age
    
        def greet(self):  # 메서드
            print(f"안녕하세요, 저는 {self.name}이고, 나이는 {self.age}입니다.")
    


3. 객체 생성 및 사용

객체 생성

  • 클래스를 호출하여 객체를 생성합니다.
  • 예제:
    p1 = Person("철수", 25)
    p2 = Person("영희", 30)
    

객체 속성 접근

  • 객체의 속성에 점(.) 연산자를 사용하여 접근합니다.
  • 예제:
    print(p1.name)  # 철수
    print(p2.age)   # 30
    

객체 메서드 호출

  • 점(.) 연산자로 메서드를 호출합니다.
  • 예제:
    p1.greet()  # 안녕하세요, 저는 철수이고, 나이는 25입니다.
    p2.greet()  # 안녕하세요, 저는 영희이고, 나이는 30입니다.
    

4. 클래스의 구성 요소

(1) 생성자 메서드 (__init__)

  • 객체가 생성될 때 호출되어 초기화 작업을 수행합니다.
  • 예제:
    class Dog:
        def __init__(self, name, breed):
            self.name = name
            self.breed = breed
    
    my_dog = Dog("바둑이", "진돗개")
    print(my_dog.name)  # 바둑이
    print(my_dog.breed)  # 진돗개
    

(2) 인스턴스 변수

  • 객체마다 고유한 값을 가지는 변수.
  • self를 통해 정의합니다.

(3) 클래스 변수

  • 모든 객체가 공유하는 변수. 클래스 이름으로 접근합니다.
  • 예제:
    class Counter:
        count = 0  # 클래스 변수
    
        def __init__(self):
            Counter.count += 1
    
    c1 = Counter()
    c2 = Counter()
    print(Counter.count)  # 2
    

(4) 메서드

  • 객체가 수행할 수 있는 동작을 정의한 함수.
  • self를 첫 번째 매개변수로 사용하여 객체를 참조합니다.

(5) 클래스 메서드 (@classmethod)

  • 클래스 변수를 다루기 위해 사용. 클래스 자체를 첫 번째 매개변수로 받습니다.
  • 예제:
    class MyClass:
        count = 0
    
        @classmethod
        def increment(cls):
            cls.count += 1
    
    MyClass.increment()
    print(MyClass.count)  # 1
    

(6) 정적 메서드 (@staticmethod)

  • 클래스와 객체와 관련 없이 동작하는 메서드.
  • 예제:
    class Math:
        @staticmethod
        def add(a, b):
            return a + b
    
    print(Math.add(3, 5))  # 8
    

5. 상속 (Inheritance)

상속의 개념

  • 기존 클래스를 기반으로 새로운 클래스를 정의.
  • 코드 재사용성을 높이고, 클래스 계층 구조를 형성.

기본 구문

class 부모클래스:
    ...

class 자식클래스(부모클래스):
    ...

예제

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

    def speak(self):
        print("소리를 냅니다.")

class Dog(Animal):
    def speak(self):  # 메서드 오버라이딩
        print(f"{self.name}가 멍멍 소리를 냅니다.")

dog = Dog("바둑이")
dog.speak()  # 바둑이가 멍멍 소리를 냅니다.

6. 다형성 (Polymorphism)

개념

  • 같은 메서드 이름이지만, 클래스에 따라 다르게 동작.
  • 예제:
    class Cat(Animal):
        def speak(self):
            print(f"{self.name}가 야옹 소리를 냅니다.")
    
    animals = [Dog("바둑이"), Cat("나비")]
    
    for animal in animals:
        animal.speak()
    # 바둑이가 멍멍 소리를 냅니다.
    # 나비가 야옹 소리를 냅니다.
    

7. 특수 메서드 (Magic Methods)

주요 특수 메서드

  • __str__: 객체의 문자열 표현 정의.
  • __repr__: 객체의 개발자용 문자열 표현 정의.
  • __add__: 객체 간 덧셈 연산 정의.
  • 예제:
    class Vector:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def __add__(self, other):
            return Vector(self.x + other.x, self.y + other.y)
    
        def __str__(self):
            return f"Vector({self.x}, {self.y})"
    
    v1 = Vector(2, 3)
    v2 = Vector(4, 5)
    v3 = v1 + v2
    print(v3)  # Vector(6, 8)
    

8. 데이터 캡슐화와 접근 제한

캡슐화

  • 객체의 내부 데이터를 보호하고, 외부 접근을 제한.

접근 제한자

  • 공개 (Public): 모든 곳에서 접근 가능. (기본)
  • 비공개 (Private): 클래스 내부에서만 접근 가능. 변수 이름 앞에 __ 사용.
  • 예제:
    class BankAccount:
        def __init__(self, balance):
            self.__balance = balance  # 비공개 변수
    
        def deposit(self, amount):
            self.__balance += amount
    
        def get_balance(self):
            return self.__balance
    
    account = BankAccount(1000)
    account.deposit(500)
    print(account.get_balance())  # 1500
    # print(account.__balance)  # AttributeError
    

9. 클래스 활용 예제

간단한 계산기 클래스

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, value):
        self.result += value

    def subtract(self, value):
        self.result -= value

    def multiply(self, value):
        self.result *= value

    def divide(self, value):
        if value != 0:
            self.result /= value
        else:
            print("0으로 나눌 수 없습니다.")

    def clear(self):
        self.result = 0

calc = Calculator()
calc.add(10)
calc.multiply(2)
print(calc.result)  # 20

요약

  1. **클래스**는 객체를 생성하기 위한 템플릿.
  2. **생성자 메서드 (__init__)**로 객체 초기화.
  3. **속성**은 객체의 데이터, **메서드**는 객체의 동작.
  4. **상속**과 **다형성**으로 객체 간 관계를 형성.
  5. **특수 메서드**로 연산자 동작 커스터마이징 가능.
  6. **캡슐화**로 데이터를 보호하고 관리.

클래스를 잘 활용하면 복잡한 프로그램도 논리적으로 구조화할 수 있습니다! 😊