1. OOP의 핵심개념

  • 추상화
  • 상속
  • 다형성
  • 캡슐화 ​

    2. 추상화

    ​ 추상화란 세부적인 내용은 감추고 필수적인 부분만 표현하는 것을 뜻합니다.
    여러 클래스가 공통적으로 사용할 attribute 및 method를 추출하여 기본 클래스로 작성하여 활용합니다. ​ 파이썬에서는 추상 베이스 클래스(Abstract Base Class, ABC)를 사용하여 인터페이스와 유사한 구조를 만들 수 있습니다. ​ 파이썬의 abc 모듈을 사용하면 추상 베이스 클래스를 정의하고, 해당 클래스를 상속받아 구현할 메서드를 지정할 수 있습니다. 이를 통해 클래스가 특정 메서드를 구현하지 않으면 에러가 발생하도록 할 수 있습니다. ​ 다음은 추상 베이스 클래스를 사용한 예시입니다 ​

    from abc import ABC, abstractmethod
    ​
    # 인터페이스
    class MyInterface(ABC):
    @abstractmethod
    def my_method(self):
        pass
    ​
    # 상속
    class MyClass(MyInterface):
    def my_method(self):
        print("Implemented method")
    ​
    # MyClass는 MyInterface를 상속받았으므로 my_method를 반드시 구현해야 합니다.
    # 만약 구현하지 않으면 TypeError가 발생합니다.
    ​
    obj = MyClass()
    obj.my_method()
    

    ​ 위의 예시에서 MyInterface는 추상 베이스 클래스로, my_method()라는 추상 메서드를 정의하고 있습니다.
    이 클래스를 상속받은 MyClass는 my_method()를 구현하여 실제 동작을 정의합니다.
    MyClass는 MyInterface의 모든 추상 메서드를 구현해야 하며, 그렇지 않으면 에러가 발생합니다. ​

    2. 상속

    ​ OOP의 가장 큰 특징은 상속이 가능하다는 것입니다. ​ 만약 코드로 학생과 선생님을 클래스를 표현하면, ​

    # 학생(Student)을 표현하기 위한 클래스를 생성합니다.
    ​
    class Student:
    ​
    def __init__(self, name, age, score):
        self.age = age
        self.name = name
        self.score = score
    ​
    def talk(self):
        print(f'안녕하세요, {self.name}입니다.')
    ​
    def study(self):
        self.score += 1
    #####################################################
    # 선생(Teacher)을 표현하기 위한 클래스를 생성합니다.
    ​
    class Teacher:
    ​
    def __init__(self, name, age, money):
        self.age = age
        self.name = name
        self.money = money
    ​
    def talk(self):
        print(f'안녕하세요, {self.name}입니다.')
    ​
    def teach(self):
        self.money += 100
    

    ​ 라고 정의하겠습니다. 이때 nameage 속성이 중복되고 talk()가 공통됩니다. ​ 위의 학생과 선생님 코드에서 공통되는 부분을 상속되게 하면 코드 재사용성이 높아집니다.
    class ChildClass(ParentClass):로 정의하여 사용합니다.
    super()를 사용하면 부모클래스에 접근할 수 있습니다. ​

    class Person:
    def __init__(self, name, age):
        self.age = age
        self.name = name
    ​
    def talk(self):
        print(f'안녕하세요, {self.name}입니다.')
    ​
    class Student(Person):
    def __init__(self, name, age, score):
        super().__init__(name, age)
        self.score = score
    ​
    class Teacher(Person):
    ​
    def __init__(self, name, age, money):
        super().__init__(name, age)
        self.money = money
    ​
    def teach(self):
        self.money += 100
    ​
    p1 = Person('홍교수', 50)
    s1 = Student('학생', 20, 90)
    t1 = Teacher('선생님', 40, 200)
    ​
    s1.talk()
    ​
    issubclass(s1, Person)    # True(두번째 인자의 subclass인 경우 True)
    isinstance(p1, Person)    # True(두번쨰 인자의 인스턴스거나 subclass인 경우 True)
    

    ​ 모든 클래스는 type클래스를 상속받습니다. ​

    2.1. 다중상속

    ​ 두개 이상의 클래스를 상속받는 경우 다중 상속 됩니다.
    중복되는 속성이나 메서드가 있는 경우에는 상속 순서에 의해 결정됩니다.
    class SubClass(ParentClass1,ParentClass2)

    3. 다형성

    ​ 서로 다른 클래스에 속해있는 객체들이 동일한 메세지에 대해 각기 다른 방식으로 응답한다는 의미 입니다.
    파이썬에서는 메서드 오버라이딩을 예로 들 수 있습니다. ​ 메서드 오버라이딩이란 자식클래스에서 부모클래스의 메서드를 재정의 하는 것입니다.
    __init__생성자 메서드에서 이미 한번 본 내용입니다. ​

    class Person:
    ...(생략)
    ​
    def talk():
        pass    # java의 추상화, 다형성 처럼 각 자식클래스에서 talk()를 재정의 한다면
                # 내용을 숨기고 각기 다른 방식으로 구현해낼 수 있다. 예시일 뿐 추상클래스를 사용하자.
    ​
    ############################################
    class Soldier(Person):
    def __init__(self, name, age, army):
        super().__init__(name, age)
        self.army = army
    ​
    # 오버라이딩
    def talk():
        print(f'나는 {self.army}')
    

    4. 캡슐화(getter,setter)

    ​ 캡슐화란 외부로부터 직접적인 엑세스를 차단하는 것을 말합니다. 이 외부는 다른 클래스, 인스턴스, 메서드가 될 수도 있습니다.
    java에서는 접근제어자로 존재하지만 파이썬에서는 언어적으로 존재하진 않습니다.
    암묵적으론 존재하지만 굳이 사용하지 않습니다. ​

    4.1. Public Member

    ​ 언더바 없이 시작하는 모든 메서드나 속성이 해당합니다.
    어디서나 호출 가능한 특징이 있습니다.
    오버라이딩을 허용합니다. ​

    4.2. Protected Member

    ​ 언더바 1개로 시작하는 메서드나 속성이 해당합니다.
    암묵적 규칙에 의해 부모클래스 내부와 자식 클래스에서만 호출 가능합니다.
    오버라이딩을 허용합니다. ​

    4.3. Private Member

    ​ 언더바 2개로 시작하는 메서드나 속성들이 이에 해당합니다.(스페셜 메서드 제외)
    본 클래스 내부에서만 사용이 가능하여 외부 호출이 불가능합니다.
    상속이 불가능합니다.

댓글남기기