Python - Class - 상속, 다양성, 오버라이딩(Overriding), 상속관계확인(issubclass)

반응형

상속

  • 사전적 의미 - 뒤를 이음
  • 컴퓨터에서의 의미 - 클래스의 속성과 메소드를 부모가 자식에게 물려주는 것
  • 부모(슈퍼) 클래스는 자신의 속성, 메소드들을 자식(서브) 클래스에게 전달 할 수 있음
  • 상속을 하게 되면 코드를 재사용 할 수 있는 장점이 있음
  • 메소드의 오버라이딩 가능
  • 상속받을 자식 클래스는 부모 클래스의 속성과 메소드를 사용
    • 자식 클래스의 이름 공간에 부모 클래스의 이름공간이 포함
class 부모 클래스:
	내용
    
	class 자식 클래스(부모 클래스) :
		내용


상속의 이유

  • 코드 재사용
  • 상속받은 자식 클래스는 부모 클래스의 모든 기능을 그대로 사용 가능
  • 자식 클래스는 필요한 기능만 정의하거나 기존의 기능을 변경(Overriding)할 수 있음

 

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

  • 사전적 - 최우선시되는, 기각하다
  • 컴퓨터에서의 의미 - 메소드의 재정의
  • 즉, 자식 클래스에서 부모 클래스에 정의된 메소드를 재정의하여 대치하는 것
class Person:
	# 생성자
	def __init__(self, name):
		self.name = name
        
    # 문자형 오버로딩(Overloading), 문자가 입력되면 <Person 이름>으로 출력되게 기능 재정의
	def __str__(self):
		return '<Person {0}>'.format(self.name)

class Employee(Person):
	# 생성자
	def __init__(self, name, msg):
		Person.__init__(self, name) # 부모 클래스 상속
		self.msg = msg

	# 중요!!! 문자형 오버라이딩(Overriding), 부모 클래스의 메소드 재정의
	def __str__(self):
		return '<Person {0} {1}>'.format(self.name, self.msg)

p1 = Person('홍길동')
print(p1.name)
>>> 홍길동

print(p1)
>>> <Person 홍길동>


m1 = Employee('김철수', "안녕하세요")
print(m1.name, m1.msg)
>>> 김철수 안녕하세요

print(m1)
>>> <Person 김철수 안녕하세요>

# 오버라이딩을 하지 않고 m1 호출 >>> <Person 김철수>
# 오버라이딩을 하고 m1 호출 >>> <Person 김철수 안녕하세요>

상속의 다형성

  • 다른 클래스에 속한 같은 이름의 인스턴스들이 동일한 메소드 이름으로 호출 할 경우, 동적으로 선택되어 수행
  • 다른 클래스에 속한 같은 이름의 다양한 메소드들에게 유사한 작업을 수행시킬 수 있음
  • 추상 클래스를 상속하는 다른 서브 클래스 내에 작성된 같은 이름의 메소드를 다른 목적으로 사용 할 수 있음
class Animal:
    def cry(self):
        return "엉엉"

class Dog(Animal):
    def cry(self, a, b):
        return a * b

class Duck(Animal):
    def cry(self, a ,b):
        return a * b

class Fish(Animal):
    pass

a = Dog()
b = Duck()
c = Fish()

print( a.cry("멍멍", 3) )
>>> 멍멍멍멍멍멍

print( b.cry(4, 3) )
>>> 7

print( c.cry() )
>>> 엉엉

상속 관계 알아내기 (issubclass)

  • issubclass(자식클래스, 부모클래스)
    • 순서가 틀리면 False로 나오므로 주의
  • 클래스가 같거나 자식 클래스면 True , 아니면 False
class Animal:
    def cry(self):
        return "엉엉"

# Fish 클래스의 부모 클래스 Animal
class Fish(Animal):
    pass

# Cat 클래스의 부모 클래스는 없음
class Cat():
    pass

f = Fish()
c = Cat()

print (f.cry()) # >>> 엉엉
print(issubclass(Fish, Animal)) #>>> True

#print (c.cry()) # >>> AttributeError: 'Cat' object has no attribute 'cry'
print(issubclass(Cat, Animal)) #>>> False
반응형