2023년 6월 업데이트
안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, Python 중급 강좌 - 5. 다중상속(Mixins - multiple inheritance)을 진행토록 하겠습니다.
SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록
코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.
예를 들어, 5_mixins.py를 생성하고 코드를 실행합니다.
TL;DR
Python은 다중상속은여러 클래스에서 상속을 허용하는 기능입니다. 다중상속을 통해 여러 기본 클래스의 기능을 결합할 수 있습니다. 그러나, 다중 상속은 코드를 복잡하고 유지 관리하기 어렵게 만들 수 있으니 신중하게 사용해야 합니다.
Python 중급 강좌 - 5. 다중상속(Mixins - multiple inheritance)
지난 시간에는 Python의 클래스 상속 - 개발자 커뮤니티 SQLER.com - Python 중급 강좌 - 4. 상속(Inheritance) - 에 대해서 공부했습니다. Python의 특징으로 여러 클래스로부터 상속(다중상속)을 지원하는데요, 좀 더 자세히 알아보겠습니다.
다중상속(Mixins - multiple inheritance)이란 무엇이고 어디에서 사용되나요?
Python은 여러 클래스로부터 상속을 지원합니다. 정확한 기술 용어는, 다중 상속이지만, 일반적으로 개발자들은 둘 이상의 기본 클래스 조합(mixins)으로 표현합니다. 일반적으로 Django와 같은 프레임 워크에서 사용됩니다.
- 다중상속(Multiple Inheritance)
- super는 상위 클래스의 메서드 및 속성에 대한 접근 권한을 부여하는 데 사용됩니다.
다중상속은 Python의 특징 중 하나입니다. 많은 개발자가 사용하는 Java나 C#과 같은 언어에서는 다중상속을 지원하지 않습니다. 이런 언어들은, 하나의 클래스에서만 상속을 지원합니다. 언어의 디자인 차이에는 여러 이유가 있습니다.(나중에 한번 더 풀어 보도록 하죠)
대표적으로, 다중상속 사용 시, 코드가 복잡해질 수 있기 때문이죠.
한 두 개의 메서드나 속성을 사용하는 클래스가 아니라, 멤버의 개수가 조금만 많아지고 이름이 복잡해지기 시작하면, 이 부모클래스가 어디인지, 어디를 고쳐야 할지 등등 복잡도가 급격히 상승하게 됩니다.
다시 말씀드리지만, 다중상속 사용 시 이러한 코드 유지보수 문제에 대해 주의하셔야 합니다.
그럼, 다중상속 코드를 한번 살펴볼게요.
다중상속 사용 시나리오 - 데이터베이스에 연결하고 로깅 작업을 수행
여러 다른 종류의 데이터베이스에 연결하고, 각 연결에 대해 로깅을 수행하는 경우를 생각해 보시죠. 이때 구조적인 유연성을 위해 "연결" 클래스와 "로깅" 클래스를 분리할 수 있고, 각각의 클래스에서 기능을 상속받아 사용하면 유용할 것입니다.
두 개의 클래스를 생합니다. Loggable과 Connection 클래스를 생성하고, 각각 메서드를 추가합니다.
class Loggable: def __init__(self): self.title = '' def log(self): print('Log message from ' + self.title) class Connection: def __init__(self): self.server = '' def connect(self): print('Connecting to database on ' + self.server) class SqlDatabase(Connection, Loggable): def __init__(self): super().__init__() self.title = 'Sql Connection Demo' self.server = 'Some_Server' # 실행하기 위한 함수를 생성 def framework(item): if isinstance(item, Connection): item.connect() if isinstance(item, Loggable): item.log() sql_connection = SqlDatabase() framework(sql_connection)
이렇게, SqlDatabase 클래스를 생성하면, 두 개의 클래스 - Connection과 Loggable - 로부터. 상속받은 인스턴스가 생성됩니다.
framework라는 함수에서 이 인스턴스를 넘겨 실행하면, 상속을 받았으니 당연히 isinstance가 True로 리턴되어 if 구문이 실행되고, Connection 클래스의 connect() 메서드가 실행되며 이어서 Loggable 클래스의 log() 메서드가 실행됩니다.
이전 SQLER의 강좌인 개발자 커뮤니티 SQLER.com - Python 중급 강좌 - 3. 클래스(Class) 강좌와 개발자 커뮤니티 SQLER.com - Python 중급 강좌 - 4. 상속(Inheritance) 강좌를 보셨다면, 어렵지 않게 코드를 이해하실 수 있을 거에요.
다중상속 사용 시 주의사항
다중상속은 이렇게 여러 클래스로부터 기능을 상속받아 사용할 수 있는 장점이 있지만, 코드의 복잡도를 증가시키고 유지보수를 어렵게 할 수도 있습니다. 사용 시 충분히 염두에 두시고, 주의해서 사용하세요.
감사합니다.
파이썬 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.
책구매 링크: 챗GPT와 함께하는 파이썬 & 머신러닝 코딩 마스터
참고자료
개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝
개발자 커뮤니티 SQLER.com - Python 중급 강좌 - 3. 클래스(Class)
개발자 커뮤니티 SQLER.com - Python 중급 강좌 - 4. 상속(Inheritance)