Chloe Jungah Kim
Chloe Jungah Kim
A blogger who writes about everything.

Python에서 class 다루기

Python에서 class 다루기

클래스(class)는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)을 구현하는 데 핵심적인 역할을 하고 있습니다. 클래스는 객체 지향 프로그래밍에서 객체를 생성하기 위한 blueprint입니다. 클래스는 속성(attributes)과 메서드(methods)를 정의하며, 이를 통해 객체의 상태와 동작을 기술합니다. 클래스는 코드의 재사용성을 높이고, 구조화된 코드를 작성하는 데 도움을 줍니다. 이번 포스팅에서는 파이썬에서 클래스를 사용하는 방법에 대해 알아보도록 하겠습니다.

파이썬의 기본 문법에 대해서는 이전에 작성해 둔 Python Tutorial 포스팅을 참고하시기 바랍니다.

class의 정의와 instance 생성

파이썬에서 클래스를 정의하려면 class 키워드를 사용합니다. 클래스명은 보통 대문자로 시작하는 것이 일반적입니다.

1
2
3
4
5
6
7
8
9
10
class Dog :
    def __init__(self, name, age) :
        self.name = name
        self.age = age
    
    def bark(self) :
        return f"{self.name} is barking."

my_dog = Dog("Cookie", 3)
print(my_dog.bark()) # Cookie is barking.

__init__ 메서드

__init__ 메서드는 클래스의 생성자(Constructor)로, 클래스 인스턴스가 생성될 때 자동으로 호출되는 메서드입니다. 이를 통해 객체의 초기 상태를 설정할 수 있습니다.

self 키워드

인스턴스 속성은 self 키워드를 사용하여 정의합니다. self는 인스턴스 자신을 가리키며, 클래스 내에서 메서드와 속성에 접근할 때 사용됩니다.

class의 상속

상속(Inheritance)은 기존 클래스의 속성과 메서드를 물려받아 새로운 클래스를 생성하는 방법입니다. 이를 통해 코드의 재사용성을 높일 수 있습니다. 참고로, 파이썬은 다중 상속을 지원하며, 어떤 부모 클래스의 메서드를 호출할 것인지는 메서드 해결 순서(Method Resolution Order, MRO)를 따르게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal :
    def __init__(self, name) :
        self.name = name
    
    def speak(self) :
        pass

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

class Cat(Animal) :
    def speak(self) :
        return f"{self.name} says Meow!"

dog = Dog("Buddy")
cat = Cat("Kitty")
print(dog.speak())  # Buddy says Woof!
print(cat.speak())  # Kitty says Meow!

메서드 오버라이딩

자식 클래스는 부모 클래스의 메서드를 오버라이딩(재정의) 할 수 있습니다. 이를 통해 자식 클래스는 부모 클래스와 다른 동작을 정의할 수 있습니다. 위 예제에서 DogCat 클래스는 각각 speak 메서드를 오버라이딩하여 다른 동작을 하도록 만들었습니다.

super 키워드

super 키워드는 자식 클래스에서 부모 클래스의 메서드를 호출할 때 사용됩니다. 이를 통해 자식 클래스는 부모 클래스의 메서드를 재사용하거나 확장할 수 있습니다.

class의 캡슐화

캡슐화(Encapsulation)은 객체의 속성과 메서드를 보호하여 객체의 내부 상태를 숨기고, 외부에서는 객체의 속성과 메서드에 직접 접근하지 못하도록 하는 개념입니다. 이를 통해 데이터의 무결성을 지키고, 객체 간의 결합도를 낮출 수 있습니다.

접근 제한자

파이썬에서는 접근 제한자를 통해 속성과 메서드의 접근 범위를 제어할 수 있습니다.

  • 공개(Public) : 모든 곳에서 접근 가능. 이름 앞에 아무것도 붙이지 않는 경우입니다.
  • 비공개(Private) : 클래스 내부에서만 접근 가능. 이름 앞에 밑줄 두 개(__)를 붙이는 경우입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person :
    def __init__(self, name, age) :
        self.name = name # public
        self.__age = age # private
    
    def get_age(self) :
        return self.__age
    
    def set_age(self, age) :
        if age > 0 :
            self.__age = age

p = Person("Alice", 30)
print(p.name) # Alice
print(p.get_age()) # 30

위 예제에서는 age 속성을 private으로 설정하여 클래스 외부에서는 메서드를 통해서만 접근할 수 있도록 하였습니다. 이러한 방식으로 캡슐화를 구현할 수 있습니다.

class의 다형성

다형성(Polymorphism)은 동일한 인터페이스를 통해 서로 다른 데이터 타입의 객체를 다룰 수 있게 하는 개념입니다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Shape :
    def area(self) :
        pass

class Rectangle(Shape) :
    def __init__(self, width, height) :
        self.width = width
        self.height = height
    
    def area(self) :
        return self.width * self.height

class Circle(Shape) :
    def __init__(self, radius):
        self.radius = radius
    
    def area(self) :
        return 3.14 * self.radius ** 2

shapes = [Rectangle(3, 4), Circle(5)]

for shape in shapes :
    print(shape.area())

위 예제에서 Shape 클래스는 공통 인터페이스를 제공하며, RectangeCircle 클래스는 이를 구현하여 각각의 면적을 계산합니다. 이러한 방식을 통해 다양한 형태의 객체를 동일한 방식으로 처리할 수 있습니다.

class의 Metaclass

파이썬에서는 메타클래스(Metaclass)를 사용하여 클래스의 동작을 제어할 수 있습니다. 메타클래스는 클래스의 클래스이며, 클래스를 생성하고 조작하는 역할을 합니다.

1
2
3
4
5
6
7
class MyMeta(type) :
    def __new__(cls, name, bases, dct) :
        print(f"Creating class {name}")
        return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=MyMeta) :
    pass

위 코드를 실행하면 Creating class MyClass 문구가 출력됩니다. 메타클래스를 사용하면 클래스 생성 시점에서 추가적인 로직을 실행하거나, 클래스 속성과 메서드를 동적으로 변경할 수 있습니다.

파이썬의 클래스는 객체 지향 프로그래밍의 핵심 개념으로, 더욱 효율적이고 구조화된 코드를 작성할 수 있도록 해 주는 강력한 도구입니다. 이번 포스팅이 파이썬의 클래스에 대해 이해하는 데 도움이 되셨기를 바랍니다.