Inner 클래스
다른 클래스 내부의 클래스 선언을 내부 클래스라고 합니다.
부모 객체가 없으면 자식 객체도 존재할 수 없습니다.
내부 클래스 객체가 존재하려면 외부 클래스 객체가 존재해야 합니다. 따라서 내부 클래스 객체는 외부 클래스 객체와 연결되어야 합니다.
다음 스크립트는 내부 클래스를 작성한 예제입니다.
class Scientist:
def __init__(self):
self.name = 'Dr. Kim'
self.info = self.Info() # 내부 객체 생성
def method(self):
print('Name:', self.name)
class Info: # 내부 클래스 선언
def __init__(self):
self.height = 182
self.weight = 70
self.color = "Dark"
def method(self):
print('Height:{} Weight:{} Color:{}'.format(self.height, self.weight, self.color))
# 객체 생성
s = Scientist() # 외부 객체 생성
s.method()
x = s.info # 내부 객체 생성
x.method()
Output:
Name: Dr. Kim
Height:182 Weight:70 Color:Dark
상속
상속은 이미 정의된 클래스에서 새 클래스를 생성하는 방법입니다.
이미 정의된 클래스를 기본 클래스, 수퍼 클래스 또는 상위 클래스라고 하며 상속 받을 새 클래스를 하위 클래스, 파생 클래스 또는 자식 클래스라고 합니다.
has-a 관계
클래스에서 다른 클래스의 객체를 생성하여 다른 클래스에 있는 멤버에 액세스하는 관계입니다.
다음 스크립트는 has-a관계를 나타내는 예제입니다.
class P:
x = 15
def __init__(self):
self.y = 25
def method1(self):
print('P class data')
class Q:
def __init__(self):
self.p = P() # P 클래스 객체 생성
def method2(self):
print(self.p.x) # p 객체로 P 클래스의 속성에 접근
print(self.p.y) # p 객체로 P 클래스의 인스턴스 멤버에 접근
self.p.method1() # p 객체로 P 클래스의 인스턴스 메서드에 접근
q = Q()
q.method2()
Output:
15
25
P class data
is-a 관계
상속의 주요 이점은 코드 재사용성 또는 기존 기능을 새로운 기능으로 확장하는 것입니다. 상위 클래스의 기능을 확장하려는 경우 상위 클래스의 메서드, 변수 및 생성자를 하위 클래스에 다시 작성할 필요가 없습니다.
다음 스크립트는 is-a관계를 나타내는 예제입니다.
class Side:
def method1(self):
print("Parent method-1")
class Guide(Side): # Side 클래스 상속 받음
def method2(self):
print("Child method-2")
g = Guide()
g.method1()
g.method2()
Output:
Parent method-1
Child method-2
is-a vs has-a 관계
IS-A 관계를 사용하면 새 기능을 추가하여 기능을 확장할 수 있지만 HAS-A 관계에서는 새 기능으로 기능을 확장할 수 없습니다. 기존 기능만 사용할 수 있습니다.
다음 그림은 직원 클래스는 person 클래스의 기능을 확장하는 반면 직원 클래스는 확장하지 않고 회사의 기능만 사용하고 있습니다.
상속의 유형
1. 단일 상속(Single Inheritance)
단일 상속은 한 클래스의 속성을 다른 클래스로 상속할 수 있습니다. 다음 그림은 클래스 S의 속성은 클래스 P에 상속될 수 있습니다.
def method1(self):class Parent:
print("Parent Method")
class Child(Parent):
def method2(self):
print("Child Method")
c = Child()
c.method1()
c.method2()
Output:
Parent Method
Child Method
2. 다중 수준 상속(Multilevel Inheritance)
하나 이상의 부모 클래스를 포함하지만 다른 수준에 있는 상속을 다중 수준 상속이라고 합니다. 다음 그림은 클래스 V의 속성은 클래스 S에 상속되고 클래스 S의 속성은 클래스 P에 상속될 수 있습니다.
class Parent:
def method1(self):
print("Parent Method")
class Child(Parent):
def method2(self):
print("Child Method")
class SubChild(Child):
def method3(self):
print("Sub Child Method")
c = SubChild()
c.method1()
c.method2()
c.method3()
Output:
Parent Method
Child Method
Sub Child Method
3. 계층적 상속(Hierarchical Inheritance)
계층적 상속은 한 클래스의 속성은 같은 수준의 여러 클래스에 상속될 수 있습니다. 다음 그림은 클래스 P의 속성은 클래스 S와 클래스 V에 상속될 수 있습니다.
class Parent:
def method1(self):
print("Parent Method")
class Child1(Parent):
def method2(self):
print("Child-1 Method")
class Child2(Parent):
def method3(self):
print("Child-2 Method")
c1 = Child1()
c1.method1()
c1.method2()
c2 = Child2()
c2.method1()
c2.method3()
Output:
Parent Method
Child-1 Method
Parent Method
Child-2 Method
4. 다중 상속(Multiple Inheritance)
다중 상속은 하나 이상의 부모 클래스로부터 상속이 가능합니다. 이 경우 부모 클래스의 모든 메서드와 속성은 상속 후 자식 클래스에 표시됩니다. 다음 그림은 클래스 S와 클래스 V의 속성은 클래스 P에 상속됩니다.
class A:
def method1(self):
print("A class")
class B:
def method2(self):
print("B class")
class C(A, B):
def method3(self):
print("C class")
c = C()
c.method1()
c.method2()
c.method3()
Output:
A class
B class
C class
5. 하이브리드 상속(Hybrid Inheritance)
단일 상속, 다중 수준 상속, 다중 상속 및 계층적 상속을 결합한 것을 하이브리드 상속이라고 합니다. 다음 그림6은 하이브리드 상속의 예입니다.
6. 순환 상속(Cyclic Inheritance)
순환 상속은 한 클래스의 속성을 다른 클래스에 순환적으로 상속할 수 있습니다.
'프로그래밍 언어 > 파이썬 (Python)' 카테고리의 다른 글
[파이썬 학습] 예외처리 (0) | 2022.02.15 |
---|---|
[파이썬 학습] 오버로딩과 오버라이딩 (0) | 2022.02.14 |
[파이썬 학습] 클래스 다형성 (0) | 2022.02.12 |
[파이썬 학습] 클래스 상속 (0) | 2022.02.11 |
[파이썬 학습] 객체 지향 프로그래밍 (0) | 2022.02.10 |