4 분 소요

클래스(Class)

1. 클래스(Class)?

클래스는 객체 지향 프로그래밍에서 중요한 개념으로, 데이터와 관련된 동작(메소드)을 하나로 묶어주는 템플릿 또는 설계 도면입니다. 클래스는 객체의 속성(멤버 변수)과 동작(메소드)을 정의하며, 객체는 클래스의 인스턴스로, 클래스를 기반으로 생성됩니다.

2. 기본 구조

2.1 클래스 정의

클래스는 class 키워드를 사용하여 정의됩니다. 클래스의 이름은 대문자로 시작하는 관례를 따릅니다.

class MyClass:
    # 변수나 함수등을 추가

2.2 인스턴스 생성 (객체)

여기에서 ‘obj’라는 변수는 ‘MyClass’라는 클래스에 의해 생성된 ‘인스턴스’, 즉 하나의 ‘개체’라고 합니다.

obj = MyClass()  # MyClass 클래스의 인스턴스 생성

2.3 멤버 변수 (인스턴스 변수)


class MyClass:
    def __init__(self, value):
        self.value = value  # 멤버 변수

obj = MyClass(10)
print(obj.value)  # 10 출력


2.4 self

self는 현재 인스턴스를 나타내는 키워드로, 멤버 변수 및 메소드 내에서 사용됩니다.

class MyClass:
    def my_method(self):  # 여기에서 self는 'obj' 인스턴스를 의미
        print("메소드 호출")

obj = MyClass()  # MyClass 클래스의 인스턴스

2.5 메소드(Method)

메소드는 클래스 내부에 정의된 함수로, 객체의 동작을 정의합니다.

class MyClass:
    def my_method(self):
        print("메소드 호출")

obj = MyClass()
obj.my_method()  # "메소드 호출" 출력

2.6 상속

상속은 객체 지향 프로그래밍에서 중요한 개념으로, 한 클래스(부모 클래스 또는 기본 클래스)가 다른 클래스(자식 클래스 또는 파생 클래스)에 정의된 특성(멤버 변수와 메소드)을 물려주는 것을 말합니다. 이를 통해 코드 재사용성을 증가시키고 클래스 간의 계층 구조를 구축할 수 있습니다.

class Animal: #부모 클래스
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal): #자식 클래스 Dog가 부모클래스 Animal을 상속
    def speak(self):
        return f"{self.name}가 멍멍!"

class Cat(Animal): #자식 클래스 Cat이 부모클래스 Animal을 상속
    def speak(self):
        return f"{self.name}가 야옹!"

dog = Dog("멍멍이")
cat = Cat("야옹이")

print(dog.speak())  # "멍멍이가 멍멍!" 출력
print(cat.speak())  # "야옹이가 야옹!" 출력

위의 예제에서 Animal 클래스는 모든 동물의 공통 특성을 정의합니다.

Dog 클래스와 Cat 클래스는 Animal 클래스를 상속받고, 각각의 speak() 메소드를 재정의하여 개와 고양이의 특성을 나타냅니다.

Dog 클래스와 Cat 클래스의 객체는 각각 speak() 메소드를 호출할 때 고유한 동작을 수행합니다.

이것이 상속의 핵심 아이디어입니다. 부모 클래스에서 기본적인 특성을 정의하고, 자식 클래스에서 이러한 특성을 확장하거나 변경함으로써 코드의 재사용성을 높이고 객체 간의 관계를 나타낼 수 있습니다.

2.7 super

super() 함수는 파이썬에서 부모 클래스의 메소드를 호출할 때 사용되는 함수입니다. 이를 통해 파생 클래스에서 부모 클래스의 메소드를 확장하거나 재사용할 수 있습니다.

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

    def say_hello(self):
        print(f"안녕, 나는 {self.name}이야!")

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)  # 부모 클래스의 생성자 호출
        self.age = age

    def say_hello(self):
        super().say_hello()  # 부모 클래스의 say_hello() 메소드 호출
        print(f"{self.name}{self.age}살이야!")

parent = Parent("부모")
child = Child("자식", 5)

parent.say_hello()  # "안녕, 나는 부모이야!" 출력
child.say_hello()
# "안녕, 나는 자식이야!" 출력 (부모 클래스의 say_hello() 호출)
# "자식은 5살이야!" 출력 (자식 클래스의 추가 내용)

위의 예제에서, Parent 클래스에는 이름을 초기화하고 인사하는 say_hello() 메소드가 있습니다.

Child 클래스는 Parent 클래스를 상속하며, 자신만의 생성자와 say_hello() 메소드를 가집니다.

Child 클래스에서 super()를 사용하여 부모 클래스인 Parent의 생성자와 say_hello() 메소드를 호출하고 확장합니다.

이렇게 하면 부모 클래스의 기능을 그대로 재사용하면서 자식 클래스에서 원하는 내용을 추가할 수 있습니다.

결과적으로, Child 클래스의 say_hello() 메소드는 부모 클래스의 say_hello() 메소드를 호출한 후 자식 클래스만의 내용을 출력합니다.

이를 통해 super() 함수를 사용하여 부모 클래스와 자식 클래스 간의 메소드 호출을 조절할 수 있습니다.

2.8 다중상속

다중 상속은 파이썬에서 여러 부모 클래스로부터 상속을 받는 것을 말합니다. 이를 통해 하나의 클래스가 여러 다른 클래스의 특성을 동시에 상속받을 수 있습니다.

class ClassA:
    def method_a(self):
        print("ClassA 메소드")

class ClassB:
    def method_b(self):
        print("ClassB 메소드")

class MyClass(ClassA, ClassB):  # MyClass는 ClassA와 B로부터 상속을 받음
    pass

obj = MyClass()
obj.method_a()  # "ClassA 메소드" 출력
obj.method_b()  # "ClassB 메소드" 출력

2.9 메소드 오버라이딩(Method Overriding)

메소드 오버라이딩은 파생 클래스(자식 클래스)에서 부모 클래스의 메소드를 재정의하는 개념을 나타냅니다. 이를 통해 파생 클래스에서 부모 클래스의 메소드 동작을 변경하거나 확장할 수 있습니다.

class Shape:
    def area(self):
        return 0

# Shape 클래스에서 area 메소드는 특별히 정의된거 없이 항상 0 값이 나옴

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2  # 원의 넓이 계산

class Square(Shape):
    def __init__(self, side):
        self.side = side

    def area(self):
        return self.side ** 2  # 정사각형의 넓이 계산

# Circle 클래스와 Square 클래스는 각각 Shape 클래스를 상속받음
#하지만 가각 두 클래스는 Shape 클래스로 부터 상속받은 area 메소드를 재정의함
#다시 말해서 Circle과 Square 클래스는 Shape 클래스의 area 메소드를 오버라이딩함

circle = Circle(5)
square = Square(4)

print("원의 넓이:", circle.area())  # "원의 넓이: 78.5" 출력
print("정사각형의 넓이:", square.area())  # "정사각형의 넓이: 16" 출력

2.10 pass

pass는 아무 작업을 하지 않고 클래스나 함수를 정의할 때 사용됩니다.


class MyClass:
    pass     # 나중에 완성시키고 싶을 경우에 사용

3. init 함수

init 함수는 파이썬 클래스에서 특별한 역할을 하는 메소드로, 생성자(constructor)라고도 부릅니다. 이 메소드는 객체(인스턴스)가 생성될 때 자동으로 호출되며, 주로 초기화 작업을 수행하기 위해 사용됩니다.

3.1 init 함수 정의

클래스 내부에 init 함수를 정의할 때, 첫 번째 매개변수로 self 를 반드시 포함해야 합니다. self는 현재 객체를 나타냅니다. 그 후에 필요한 다른 매개변수를 추가할 수 있습니다.

class MyClass:
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

3.2 객체 생성과 init 함수 호출

클래스를 기반으로 객체를 생성할 때, init 함수가 자동으로 호출됩니다. 이 메소드는 객체가 생성될 때 한 번 실행됩니다.

obj = MyClass(value1, value2)  # 객체 생성과 동시에 __init__() 호출

#이때 param1에 value1 값이, param2에 value2 값이 전달됩니다.

4. 연습하기

위에 제시된 코드를 직접 연습해보세요.

댓글남기기