파이썬팁

파이썬 클래스 상속 개념 잡기

팁뚠이 2022. 4. 8. 23:14
728x90

팁뚠이 입니다. C언어는 포인터를 쓰고 부터 새로운 언어가 되듯이 파이썬은 클래스를 쓰면서 새로운 언어가 됩니다. 클래스를 안 써도 함수만으로도 충분히 구현이 가능한데, 왜 사용하는 지에 답은 C언어도 포인터를 사용하지 않고도 함수로 구현가능하다는 점으로 답을 드리고 싶습니다. 이미 많은 문헌과 기술자료에서 파이썬 클래스를 왜 사용하는 지에 대해선 언급했으니, 그 중에서 어려운 개념인 상속에 대해 얘기해보도록 하겠습니다.

 

클래스 상속: 기반 클래스의 기능을 물려받음

 

상속의 정의는 1) 뒤를 이음, 2) 한 사람이 사망한 후에 재산이나 권리, 의무의 일체를 물려받는다. 입니다. 여기서 클래스 상속은 기반이 되는 클래스의 기능을 하위 클래스에서 물려 받는 것입니다. 클래스가 사망을 하지는 않으니, 정의 중에 뒤에 권리, 의무를 물려받는 다 정도로 이해하면 됩니다. 그럼 이걸 왜 사용 할까요?

 

클래스 상속 이유: 코드의 재사용을 높임

 

재사용을 높인다는 게 와닿지 않을 텐데, 공통 되는 것을 상위 클래스로 해두고, 세부적인 것을 하위 클래스로 해두면, 하위 클래스에선 상위 클래스에서 물려 받은 후, 세부적인 내용만 보충하면 됩니다. 가령 '직업' 이란 상위 클래스가 있다면, 하위로 '학생', '경찰관', '의사', '부동산중개인' 등 다양하게 하위 클래스를 만들 수 있습니다. 직업의 상위 클래스에서 공통되는 요소인 '4대 보험', '세금' 등 항목을 만들어 두면 하위 클래스에서 받아서 기능을 동일하게 사용할 수 있습니다. 이런 점 때문에, 클래스를 상속하는 것이고, 인스턴스를 많이 만드는 것과도 비교가 되는 데, 인스턴스를 만드는 것은 하위 클래스의 메서드를 추가하는 게 코드의 간결성에서 부족하기 때문에, 상속이 유리합니다.

 

그럼 파이썬 코드에서 클래스를 상속하는 방법에 대해 알아보겠습니다. 크게 2가지 방법이 있는 데, 주로 사용하는 게, super() 이고, 추상클래스나 다중클래스에서 직관적으로 보이기 위해 명시적으로 접근하는 방법이 있습니다. 

 

Class Person:
	def __init__(self, name):
    		self.name = name
    
    def view_name(self):
    	print("name:", self.name)
        
Class Student(Person):
	def __init__(self, name):
    		super().__init__(name)
        
student = Student("Lebron")
student.view_name()

결과: name: Lebron

 

우선 Super()를 이용해 접근하는 방법에 대해 예시를 보여드립니다. 상위 클래스가 Person이고, 하위 클래스가 Student 입니다. Student(Person)으로 Person에서 물려받는 것을 확인 할 수 있습니다. 다음으로 Student의 def __init__(self, name)에서 상위 클래스 Person에서 name을 물려 받는 것을 확인 할 수 있습니다. super()는 super().__init__(name)과 같이 사용합니다. Person의 name을 기입하고, super()를 통해 상위 클래스의 메서드도 물려받는 것을 표현합니다. 밑에 클래스를 부를 때, student.view_name()과 같이, student가 상위 클래스 Person의 메서드도 사용하는 것을 확인 할 수 있습니다. Super()를 활용하는 것은 많은 곳에서 다루기 때문에 간략히 넘어갑니다.

 

Class Person:
    def __init__(self, name):
    		self.name = name
    
    def view_name(self):
    	print("name:", self.name)
        
Class Student(Person):
    def __init__(self, name):
    		Person.__init__(self, name)
        
student = Student("Lebron")
student.view_name()

결과: name: Lebron

 

다음으로 super 대신 직접 접근하는 케이스 입니다. 생소한 분들도 많을 텐데, 잘 만든 코드들을 가끔 보다보면 이런 식으로 직접 접근을 하다 보니, 저도 처음엔 많이 생소했습니다. 이렇게도 상속이 되는 구나, 하고 알게 되었습니다. 상위클래스는 동일하고, 하위 클래스에서, super() 대신 Person. 으로 바로 상위 클래스를 명시합니다. 이 때, __init__(self, name)으로 super와 달리, init에 self를 첫 번째로 넣습니다. 그 이유는 super는 상속한 첫번째 클래스만 나타내는 데, 직접 명시하는 경우 두 개, 세 개 동시에 여러 클래스에서 상속이 가능하기 때문입니다. 여기서 실수를 많이 하니, self를 넣는 다는 것은 암기하시는 게 낫습니다. 결과는 동일하게 나오고, 두 번째 방법은 다중 상속에서 자주 사용하는 방식입니다. 

 

Super().__init__(인자)
Person.__init__(self, 인자)

 

이렇게 대표되는 방식으로 알고 계시면 혼동할 일이 없습니다. 자주 사용하는 방법이고, 한 번 익혀둬야 처음 봤을 때 혼동되지 않으니, 꼭 숙지 하시길 바랍니다.

728x90