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
라고 정의하겠습니다. 이때
name
과age
속성이 중복되고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개로 시작하는 메서드나 속성들이 이에 해당합니다.(스페셜 메서드 제외)
본 클래스 내부에서만 사용이 가능하여 외부 호출이 불가능합니다.
상속이 불가능합니다.
댓글남기기