<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95</id>
	<title>파이썬 클래스 설계방법 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95&amp;action=history"/>
	<updated>2026-05-17T12:13:13Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95&amp;diff=1507&amp;oldid=prev</id>
		<title>Devcafe: /* 5가지 클래스 설계의 원칙 (S.O.L.I.D) */</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95&amp;diff=1507&amp;oldid=prev"/>
		<updated>2025-05-28T23:42:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;5가지 클래스 설계의 원칙 (S.O.L.I.D)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 5월 29일 (목) 08:42 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot;&gt;5번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;5번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|아이콘이름=laptop_mac&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|아이콘이름=laptop_mac&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|제목 = &amp;quot;  5가지 클래스 설계의 원칙 &amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|제목 = &amp;quot;  5가지 클래스 설계의 원칙 &amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;’‘’S&lt;/del&gt;.O.L.I.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;D‘’‘&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;S&lt;/ins&gt;.O.L.I.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;D&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# S - SRP(Single responsibility principle) 단일 책임 원칙&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# S - SRP(Single responsibility principle) 단일 책임 원칙&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95&amp;diff=1506&amp;oldid=prev</id>
		<title>Devcafe: /* 5가지 클래스 설계의 원칙 (S.O.L.I.D) */</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95&amp;diff=1506&amp;oldid=prev"/>
		<updated>2025-05-28T23:40:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;5가지 클래스 설계의 원칙 (S.O.L.I.D)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025년 5월 29일 (목) 08:40 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;1번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;1번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 클래스 설계 방법론 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 클래스 설계 방법론 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 5가지 클래스 설계의 원칙 (S.O.L.I.D) ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 5가지 클래스 설계의 원칙 (S.O.L.I.D) ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{틀:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;고지상자&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{틀:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;메모&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|아이콘색=red&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|아이콘색=red&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|아이콘이름=laptop_mac&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|아이콘이름=laptop_mac&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|제목 = &amp;quot;  5가지 클래스 설계의 원칙 &amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|제목 = &amp;quot;  5가지 클래스 설계의 원칙 &amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 =# S - SRP(Single responsibility principle) 단일 책임 원칙&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|내용 = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;’‘’S.O.L.I.D‘’‘&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# S - SRP(Single responsibility principle) 단일 책임 원칙&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95&amp;diff=72&amp;oldid=prev</id>
		<title>Devcafe: 새 문서: == 클래스 설계 방법론 == === 5가지 클래스 설계의 원칙 (S.O.L.I.D) === {{틀:고지상자 |아이콘색=red |아이콘이름=laptop_mac |제목 = &quot;  5가지 클래스 설계의 원칙 &quot; |내용 =# S - SRP(Single responsibility principle) 단일 책임 원칙 # O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙 # L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙 # I - ISP(Interface Segregation Principle) 인터페이스 분리 원칙 # D - DIP(...</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=%ED%8C%8C%EC%9D%B4%EC%8D%AC_%ED%81%B4%EB%9E%98%EC%8A%A4_%EC%84%A4%EA%B3%84%EB%B0%A9%EB%B2%95&amp;diff=72&amp;oldid=prev"/>
		<updated>2024-10-04T15:51:20Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == 클래스 설계 방법론 == === 5가지 클래스 설계의 원칙 (S.O.L.I.D) === {{틀:고지상자 |아이콘색=red |아이콘이름=laptop_mac |제목 = &amp;quot;  5가지 클래스 설계의 원칙 &amp;quot; |내용 =# S - SRP(Single responsibility principle) 단일 책임 원칙 # O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙 # L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙 # I - ISP(Interface Segregation Principle) 인터페이스 분리 원칙 # D - DIP(...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 클래스 설계 방법론 ==&lt;br /&gt;
=== 5가지 클래스 설계의 원칙 (S.O.L.I.D) ===&lt;br /&gt;
{{틀:고지상자&lt;br /&gt;
|아이콘색=red&lt;br /&gt;
|아이콘이름=laptop_mac&lt;br /&gt;
|제목 = &amp;quot;  5가지 클래스 설계의 원칙 &amp;quot;&lt;br /&gt;
|내용 =# S - SRP(Single responsibility principle) 단일 책임 원칙&lt;br /&gt;
# O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙&lt;br /&gt;
# L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙&lt;br /&gt;
# I - ISP(Interface Segregation Principle) 인터페이스 분리 원칙&lt;br /&gt;
# D - DIP(Dependency Inversion Principle) 의존성 역전 법칙&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
출처) https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design&lt;br /&gt;
&lt;br /&gt;
==== SRP(Single responsibility principle) 단일 책임 원칙 ====&lt;br /&gt;
# 클래스는 단 한개의 책임을 가져야 함 (클래스를 수정할 이유가 오직 하나)&lt;br /&gt;
#: 예: 계산기 기능 구현시, 계산을 하는 책임과 GUI를 나타낸다는 책임을 서로 분리하여, 각각 클래스로 설계&lt;br /&gt;
# 실제 애매한 부분이 많이 존재함, 가급적 설계시 고려하면 좋음.&lt;br /&gt;
#:&lt;br /&gt;
## 나쁜 예&lt;br /&gt;
### 학생성적과 수강하는 코스를 한개의 class에서 다루는 예&lt;br /&gt;
### 한 클래스에서 두개의 책임을 갖기 때문에, 수정이 용이하지 않다.&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class StudentScoreAndCourseManager(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        scores = {}&lt;br /&gt;
        courses = {}&lt;br /&gt;
        &lt;br /&gt;
    def get_score(self, student_name, course):&lt;br /&gt;
        pass&lt;br /&gt;
    &lt;br /&gt;
    def get_courses(self, student_name):&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;    &lt;br /&gt;
## 변경 예&lt;br /&gt;
### 각각의 책임을 한개로 줄여서, 각각 수정이 다른 것에 영향을 미치지 않도록 함&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class ScoreManager(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        scores = {}&lt;br /&gt;
        &lt;br /&gt;
    def get_score(self, student_name, course):&lt;br /&gt;
        pass&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
class CourseManager(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        courses = {}&lt;br /&gt;
    &lt;br /&gt;
    def get_courses(self, student_name):&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OCP(Open Closed Principle) 개방-폐쇄 원칙 ====&lt;br /&gt;
&lt;br /&gt;
# 확장에는 열려있어야 하고, 변경에는 닫혀있어야 함&lt;br /&gt;
#: 예: 캐릭터 클래스를 만들 때, 캐릭터마다 행동이 다르다면, 행동 구현은 캐릭터 클래스의 자식 클래스에서 재정의(Method Override)한다.&lt;br /&gt;
#:이 경우, 캐릭터 클래스는 수정할 필요 없고(변경에 닫혀 있음)&lt;br /&gt;
#:자식 클래스에서 재정의하면 됨(확장에 대해 개방됨)&lt;br /&gt;
#:&lt;br /&gt;
## 나쁜 예&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class Rectangle(object):&lt;br /&gt;
    def __init__(self, width, height):&lt;br /&gt;
        self.width = width&lt;br /&gt;
        self.height = height&lt;br /&gt;
        &lt;br /&gt;
class Circle:&lt;br /&gt;
    def __init__(self, radius):&lt;br /&gt;
        self.radius = radius&lt;br /&gt;
&lt;br /&gt;
class AreaCalculator(object):&lt;br /&gt;
    def __init__(self, shapes):&lt;br /&gt;
        self.shapes = shapes&lt;br /&gt;
&lt;br /&gt;
    def total_area(self):&lt;br /&gt;
        total = 0&lt;br /&gt;
        for shape in self.shapes:&lt;br /&gt;
            total += shape.width * shape.height&lt;br /&gt;
        return total&lt;br /&gt;
&lt;br /&gt;
shapes = [Rectangle(2, 3), Rectangle(1, 6)]&lt;br /&gt;
calculator = AreaCalculator(shapes)&lt;br /&gt;
print(&amp;quot;The total area is: &amp;quot;, calculator.total_area())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
## 좋은 예&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class Rectangle:&lt;br /&gt;
    def __init__(self, width, height):&lt;br /&gt;
        self.width = width&lt;br /&gt;
        self.height = height&lt;br /&gt;
&lt;br /&gt;
    def area(self):&lt;br /&gt;
        return self.width * self.height&lt;br /&gt;
    &lt;br /&gt;
class Circle:&lt;br /&gt;
    def __init__(self, radius):&lt;br /&gt;
        self.radius = radius&lt;br /&gt;
        &lt;br /&gt;
    def area(self):&lt;br /&gt;
        return 3.14 * self.radius ** 2&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;다른 도형에 대해 확장하기 위해서,&lt;br /&gt;
AreaCalculator는 수정이 필요 없음 (변경에 닫혀 있음)&lt;br /&gt;
단지, Shape을 상속받은 다른 class를 정의하기만 하면 됨 (확장에 대해 개방됨)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
class AreaCalculator(object):&lt;br /&gt;
    def __init__(self, shapes):&lt;br /&gt;
        self.shapes = shapes&lt;br /&gt;
&lt;br /&gt;
    def total_area(self):&lt;br /&gt;
        total = 0&lt;br /&gt;
        for shape in self.shapes:&lt;br /&gt;
            total += shape.area()&lt;br /&gt;
        return total&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
shapes = [Rectangle(1, 6), Rectangle(2, 3), Circle(5), Circle(7)]&lt;br /&gt;
calculator = AreaCalculator(shapes)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;The total area is: &amp;quot;, calculator.total_area())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== LSP(Liskov Substitusion Principle) 리스코프 치환 법칙 ====&lt;br /&gt;
# 자식 클래스는 언제나 자신의 부모클래스와 교체할 수 있다는 원칙&lt;br /&gt;
* 갤럭시폰 is a kind of 스마트폰&lt;br /&gt;
** 스마트폰은 다른 사람과 전화와 메시지가 가능하다.&lt;br /&gt;
** 스마트폰은 데이터 또는 와이파이를 이용해 인터넷을 사용할 수 있다.&lt;br /&gt;
** 스마트폰은 앱 마켓을 통해 앱을 다운 받을 수 있다.&lt;br /&gt;
* 위 설명을 갤럭시 폰으로 대체하면 아래와 같다.&lt;br /&gt;
** 갤럭시 폰은 다른 사람과 전화와 메시지가 가능하다.&lt;br /&gt;
** 갤럭시 폰은 데이터 또는 와이파이를 이용해 인터넷을 사용할 수 있다.&lt;br /&gt;
** 스마트폰은 앱 마켓을 통해 앱을 다운 받을 수 있다.&lt;br /&gt;
&lt;br /&gt;
# 연습3&lt;br /&gt;
#: 다음 캐릭터의 메서드를 모두 담은 클래스를 만든다면?&lt;br /&gt;
#: 어떻게 하면 OCP 원칙을 고려할 수 있을까요?&lt;br /&gt;
## Warrior&lt;br /&gt;
##: - attack: 상대방 객체를 입력받아서, &amp;#039;칼로 찌르다&amp;#039; 출력하고, 상대방의 receive 메서드를 호출해서, striking_power만큼 상대방의 health_point를 낮춰준다.&lt;br /&gt;
##:  - receive: 상대방의 striking_point를 입력으로 받아서, 자신의 health_point를 그만큼 낮추기, health_point가 0 이하이면 &amp;#039;죽었음&amp;#039; 출력&lt;br /&gt;
##:  - use_shield: 1번 공격을 막는다.&lt;br /&gt;
## Elf&lt;br /&gt;
##:  - attack: 상대방 객체를 입력받아서, &amp;#039;마법을 쓰다&amp;#039; 출력하고, 상대방의 receive 메서드를 호출해서, striking_power만큼 상대방의 health_point를 낮춰준다.&lt;br /&gt;
##:  - receive: 상대방의 striking_point를 입력으로 받아서, 자신의 health_point를 그만큼 낮추기, health_point가 0 이하이면 &amp;#039;죽었음&amp;#039; 출력 &lt;br /&gt;
##:  - wear_manteau: 1번 공격을 막는다.&lt;br /&gt;
## Wizard&lt;br /&gt;
##: - attack: 상대방 객체를 입력받아서, &amp;#039;마법을 쓰다&amp;#039; 출력하고, 상대방의 receive 메서드를 호출해서, striking_power만큼 상대방의 health_point를 낮춰준다.&lt;br /&gt;
##: - receive: 상대방의 striking_point를 입력으로 받아서, 자신의 health_point를 그만큼 낮추기, health_point가 0 이하이면 &amp;#039;죽었음&amp;#039; 출력 &lt;br /&gt;
##: - use_wizard: 자신의 health_point를 3씩 올려준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# 추상 클래스 선언하기&lt;br /&gt;
from abc import *&lt;br /&gt;
&lt;br /&gt;
class Character(metaclass=ABCMeta):&lt;br /&gt;
    def __init__(self, name=&amp;#039;yourname&amp;#039;, health_point=100, striking_power=3, defensive_power=3):&lt;br /&gt;
        self.name = name&lt;br /&gt;
        self.health_point = health_point&lt;br /&gt;
        self.striking_power = striking_power&lt;br /&gt;
        self.defensive_power = defensive_power        &lt;br /&gt;
    &lt;br /&gt;
    def get_info(self):&lt;br /&gt;
        print (self.name, self.health_point, self.striking_power, self.defensive_power)&lt;br /&gt;
    &lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def attack(self, second):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def receive(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def special(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ISP(Interface Segregation Principle) 인터페이스 분리 원칙 ====&lt;br /&gt;
# 클래스에서 사용하지 않는(상관없는) 메서드는 분리해야 한다.&lt;br /&gt;
&lt;br /&gt;
# 추상 클래스 선언하기&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from abc import *&lt;br /&gt;
&lt;br /&gt;
class Character(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        pass&lt;br /&gt;
    &lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def move(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def eat(self):&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* metaclass 란?&lt;br /&gt;
** 클래스를 만들기 위해 파이썬에서는 기본 metaclass가 사용됨&lt;br /&gt;
*** 즉, 클래스를 만들기 위해서 메타클래스 라는 것이 필요했던 것임&lt;br /&gt;
*** class 생성시, () 아무 것도 넣지 않으면, 기본 파이썬에서 클래스를 만들기 위한 메타클래스가 쓰인다고 보면 됨&lt;br /&gt;
*** 추상 클래스 만들시에는 기본 메타클래스로는 생성이 어려우니, 다음과 같이 작성&lt;br /&gt;
**** class Character(metaclass=ABCMeta)&lt;br /&gt;
*** 싱글톤을 위해 기본 메타클래스를 바꾸는 것임 (싱글톤은 다음에 나오는 디자인 패턴에서 설명)&lt;br /&gt;
**** class PrintObject(metaclass=Singleton)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class MyClass:&lt;br /&gt;
    pass&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from abc import *&lt;br /&gt;
&lt;br /&gt;
class Character(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# 나쁜 예&lt;br /&gt;
#: 추상 클래스 상속하기&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class Elf(Character):&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        print (&amp;quot;practice the black art&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def move(self):&lt;br /&gt;
        print (&amp;quot;fly&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def eat(self):&lt;br /&gt;
        print (&amp;quot;no eat&amp;quot;)  # &amp;lt;--- 요정은 밥을 안먹지 않을까요? 그래도 선언해줘야 함(상관없는 기능)&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
class Human(Character):&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        print (&amp;quot;plunge a knife&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def move(self):&lt;br /&gt;
        print (&amp;quot;run&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def eat(self):&lt;br /&gt;
        print (&amp;quot;eat foods&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 첫 번째 예: 이렇게 작성하는 것이 우선 위 코드보다는 더 좋음1&lt;br /&gt;
#: 추상 클래스 선언하기&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from abc import *&lt;br /&gt;
&lt;br /&gt;
class Character(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        pass&lt;br /&gt;
    &lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def move(self):&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# 추상 클래스 상속하기&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class Elf(Character):&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        print (&amp;quot;practice the black art&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def move(self):&lt;br /&gt;
        print (&amp;quot;fly&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
class Human(Character):&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        print (&amp;quot;plunge a knife&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def move(self):&lt;br /&gt;
        print (&amp;quot;run&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def eat(self):  # &amp;lt;--- 메서드 확장&lt;br /&gt;
        print (&amp;quot;eat foods&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
elf1 = Elf()&lt;br /&gt;
human1 = Human()&lt;br /&gt;
&lt;br /&gt;
elf1.attack()&lt;br /&gt;
elf1.move()&lt;br /&gt;
human1.attack()&lt;br /&gt;
human1.move()&lt;br /&gt;
human1.eat()&lt;br /&gt;
practice the black art&lt;br /&gt;
fly&lt;br /&gt;
plunge a knife&lt;br /&gt;
run&lt;br /&gt;
eat foods&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 두 번째 예: 이렇게 작성하는 것도 처음 코드보다는 더 좋음&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from abc import *&lt;br /&gt;
&lt;br /&gt;
class AttackingWay(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
class MovingWay(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def move(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
class EatingWay(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def eat(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
class AbstractHumanCharacter(AttackingWay, MovingWay, EatingWay):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# 추상 클래스 상속하기&lt;br /&gt;
class Elf(AttackingWay, MovingWay):&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        print (&amp;quot;practice the black art&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def move(self):&lt;br /&gt;
        print (&amp;quot;fly&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
class Human(AttackingWay, MovingWay, EatingWay):&lt;br /&gt;
    def attack(self):&lt;br /&gt;
        print (&amp;quot;plunge a knife&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    def move(self):&lt;br /&gt;
        print (&amp;quot;run&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def eat(self):&lt;br /&gt;
        print (&amp;quot;eat foods&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
elf1 = Elf()&lt;br /&gt;
human1 = Human()&lt;br /&gt;
&lt;br /&gt;
elf1.attack()&lt;br /&gt;
elf1.move()&lt;br /&gt;
human1.attack()&lt;br /&gt;
human1.move()&lt;br /&gt;
human1.eat()&lt;br /&gt;
practice the black art&lt;br /&gt;
fly&lt;br /&gt;
plunge a knife&lt;br /&gt;
run&lt;br /&gt;
eat foods&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# 한발짝 더 나가보기!(심화 문제)&lt;br /&gt;
#: 게임 캐릭터 클래스 설계 예제 상기해봅니다. 다음 세 캐릭터의 다양한 메서드를 위 두번째 방법과 유사하게 작성해볼까요?&lt;br /&gt;
#: 게임 캐릭터는 다음과 같이 3명이 존재하고, 각각의 메서드는 다음과 같음&lt;br /&gt;
* Warrior&lt;br /&gt;
** - 공격하면 칼로 찌른다를 출력&lt;br /&gt;
* Elf&lt;br /&gt;
**  - 공격하면 마법을 쓴다를 출력&lt;br /&gt;
* Wizard&lt;br /&gt;
**  - 공격하면 마법을 쓴다를 출력&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
from abc import *&lt;br /&gt;
&lt;br /&gt;
class UsingKnife(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def use_knife(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
class UsingWizard(metaclass=ABCMeta):&lt;br /&gt;
    @abstractmethod&lt;br /&gt;
    def use_wizard(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
class Warrior(UsingKnife):&lt;br /&gt;
    def use_knife(self):&lt;br /&gt;
        print (&amp;#039;칼로 찌른다&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
class Elf(UsingWizard):&lt;br /&gt;
    def use_wizard(self):&lt;br /&gt;
        print (&amp;#039;마법을 쓰다&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
class Wizard(UsingWizard):&lt;br /&gt;
    def use_wizard(self):&lt;br /&gt;
        print (&amp;#039;마법을 쓰다&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
warrior1 = Warrior()&lt;br /&gt;
elf1 = Elf()&lt;br /&gt;
wizard1 = Wizard()&lt;br /&gt;
&lt;br /&gt;
warrior1.use_knife()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
칼로 찌른다&lt;br /&gt;
&lt;br /&gt;
==== DIP(Dependency Inversion Principle) 의존성 역전 법칙 ====&lt;br /&gt;
# 부모 클래스는 자식 클래스의 구현에 의존해서는 안됨&lt;br /&gt;
# 자식 클래스 코드 변경 또는 자식 클래스 변경시, 부모 클래스 코드를 변경해야 하는 상황을 만들면 안됨&lt;br /&gt;
# 자식 클래스에서 부모 클래스 수준에서 정의한 추상 타입에 의존할 필요가 있음&lt;br /&gt;
## 실습 코드&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class BubbleSort:&lt;br /&gt;
    def bubble_sort(self):&lt;br /&gt;
        # sorting algorithms&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
## 나쁜예 &lt;br /&gt;
&amp;lt;source lang=python&amp;gt;        &lt;br /&gt;
class SortManager:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.sort_method = BubbleSort() # &amp;lt;--- SortManager 는 BubbleSort에 의존적&lt;br /&gt;
        &lt;br /&gt;
    def begin_sort(self):&lt;br /&gt;
        self.sort_method.bubble_sort() # &amp;lt;--- BubbleSort의 bubble_sort 메서드에 의존적&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이렇게 되면 어떤 문제가 생길까요? BubbleSort의 메서드 이름을 바꿔봤습니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;        &lt;br /&gt;
# BubbleSort의 bubble_sort 메서드 변경&lt;br /&gt;
class BubbleSort:&lt;br /&gt;
    def sort(self):&lt;br /&gt;
        print(&amp;#039;bubble sort&amp;#039;)&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;        &lt;br /&gt;
&amp;lt;source lang=python&amp;gt;        &lt;br /&gt;
sortmanager = SortManager()&lt;br /&gt;
sortmanager.begin_sort()&lt;br /&gt;
---------------------------------------------------------------------------&lt;br /&gt;
AttributeError                            Traceback (most recent call last)&lt;br /&gt;
&amp;lt;ipython-input-15-7b6c218e4fe5&amp;gt; in &amp;lt;module&amp;gt;()&lt;br /&gt;
      1 sortmanager = SortManager()&lt;br /&gt;
----&amp;gt; 2 sortmanager.begin_sort()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ipython-input-14-eb257b4cc514&amp;gt; in begin_sort(self)&lt;br /&gt;
      5 &lt;br /&gt;
      6     def begin_sort(self):&lt;br /&gt;
----&amp;gt; 7         self.sort_method.bubble_sort() # &amp;lt;--- BubbleSort의 bubble_sort 메서드에 의존적&lt;br /&gt;
&lt;br /&gt;
AttributeError: &amp;#039;BubbleSort&amp;#039; object has no attribute &amp;#039;bubble_sort&amp;#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
그러면, 위 예에서는 상위 클래스인 SortManager도 코드를 바꿔줘야 한다.&lt;br /&gt;
하부 클래스 코드를 수정하면 상위 클래스 코드도 바꿔줘야 하므로, 어색한 것은 분명함&lt;br /&gt;
이 부분을 의존성 역전 법칙에서 상위 클래스가 하부 클래스에 의존되는 역전현상을 막아야 한다라고 어렵게 써놓은 것임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;        &lt;br /&gt;
sorting1 = SortManager()&lt;br /&gt;
sorting1.begin_sort()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
---------------------------------------------------------------------------&lt;br /&gt;
AttributeError                            Traceback (most recent call last)&lt;br /&gt;
&amp;lt;ipython-input-8-19868312ab3c&amp;gt; in &amp;lt;module&amp;gt;()&lt;br /&gt;
      1 sorting1 = SortManager()&lt;br /&gt;
----&amp;gt; 2 sorting1.begin_sort()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ipython-input-6-eb257b4cc514&amp;gt; in begin_sort(self)&lt;br /&gt;
      5 &lt;br /&gt;
      6     def begin_sort(self):&lt;br /&gt;
----&amp;gt; 7         self.sort_method.bubble_sort() # &amp;lt;--- BubbleSort의 bubble_sort 메서드에 의존적&lt;br /&gt;
&lt;br /&gt;
AttributeError: &amp;#039;BubbleSort&amp;#039; object has no attribute &amp;#039;bubble_sort&amp;#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
의존성을 주입하고, 상위 클래스에서 하위 클래스 활용시 하위 클래스에 따라 변경되지 않도록, 일반화(추상화)된 설계를 하면 됨&lt;br /&gt;
&lt;br /&gt;
# 좋은 예&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class SortManager:&lt;br /&gt;
    def __init__(self, sort_method):    # &amp;lt;--- 의존성을 주입시킨다고 이야기함&lt;br /&gt;
        self.set_sort_method(sort_method)&lt;br /&gt;
        &lt;br /&gt;
    def set_sort_method(self, sort_method):&lt;br /&gt;
        self.sort_method = sort_method&lt;br /&gt;
        &lt;br /&gt;
    def begin_sort(self):&lt;br /&gt;
        self.sort_method.sort()         # &amp;lt;--- 하부 클래스가 바뀌더라도, 동일한 코드 활용 가능토록 인터페이스화&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
# 실습 코드&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class BubbleSort:&lt;br /&gt;
    def sort(self):&lt;br /&gt;
        print(&amp;#039;bubble sort&amp;#039;)&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
class QuickSort:&lt;br /&gt;
    def sort(self):&lt;br /&gt;
        print(&amp;#039;quick sort&amp;#039;)&lt;br /&gt;
        pass&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
bubble_sort1 = BubbleSort()&lt;br /&gt;
quick_sort1 = QuickSort()&lt;br /&gt;
&lt;br /&gt;
sorting1 = SortManager(bubble_sort1)&lt;br /&gt;
sorting1.begin_sort()&lt;br /&gt;
&lt;br /&gt;
sorting2 = SortManager(quick_sort1)&lt;br /&gt;
sorting2.begin_sort()&lt;br /&gt;
bubble sort&lt;br /&gt;
quick sort&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
# 초간단 연습2&lt;br /&gt;
* selection sort 를 출력하는 SelectionSort 클래스 만들고, SortManager로 begin_sort() 호출해서 출력해보기&lt;br /&gt;
&lt;br /&gt;
# 좋은 예&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
class SortManager:&lt;br /&gt;
    def __init__(self, sort_method):    # &amp;lt;--- 의존성을 주입시킨다고 이야기함&lt;br /&gt;
        self.set_sort_method(sort_method)&lt;br /&gt;
        &lt;br /&gt;
    def set_sort_method(self, sort_method):&lt;br /&gt;
        self.sort_method = sort_method&lt;br /&gt;
        &lt;br /&gt;
    def begin_sort(self):&lt;br /&gt;
        self.sort_method.sort()         # &amp;lt;--- 하부 클래스가 바뀌더라도, 동일한 코드 활용 가능토록 인터페이스화&lt;br /&gt;
&lt;br /&gt;
class SelectionSort:&lt;br /&gt;
    def sort(self):&lt;br /&gt;
        print(&amp;#039;selection sort&amp;#039;)&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
selection_sort = SelectionSort()&lt;br /&gt;
sorting3 = SortManager(selection_sort)&lt;br /&gt;
sorting3.begin_sort()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
selection sort&lt;br /&gt;
&lt;br /&gt;
=== 상세 페이지 참고 ===&lt;br /&gt;
https://www.fun-coding.org/PL&amp;amp;OOP2-1.html&lt;br /&gt;
&lt;br /&gt;
[[category:python]]&lt;/div&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
</feed>