๋ฒ์ญ์: ๋ถํํ๊ฒ๋ ์ ๋ ์์ด๋ก ๊ฝค ๋ง์ด ์ฝ์์ง๋ง ์์ด๋ก ๋ฒ์ญํ ๊ฒฝํ์ด ๋ณ๋ก ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋ ๊ฒ๊ณผ ๋ฒ์ญํ๋ ๊ฒ์ ์๋ก ๋ค๋ฅธ ์ผ์ด๋ผ๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. ๋ํ ๋ถํํ๊ฒ๋ ๋๋ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ๋ง์ง ์์ต๋๋ค. (๋๋ ์ต๊ทผ์ Spring MVC์ Hibernate์์ ๊ฐ๋จํ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค์์ต๋๋ค.) ๋ฐ๋ผ์ ๋ฒ์ญ์ ๊ฐ๋ฅํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋๋นด์ต๋๋ค. ๊ธฐ์ฌ์ ์ ๊ณต๋ ์ฝ๋ ์์ ๋ Java์ ๋ช
๋ช
๊ท์น์ ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ ๋กญ๊ฒ ์ฝ๊ฐ ์์ ํ์ต๋๋ค. ์๋ง๋ ์ผ๋ถ ํจํด์ ์ด๋ฆ์ ๋ฒ์ญํ ๊ฐ์น๊ฐ ์์ ์๋ ์์ง๋ง(์ด๋ฌํ ๋ฒ์ญ์ ๋ง์ ์ดํด๋ฅผ ์ ๊ณตํ์ง ์์) ์ด๊ฒ์ด ๋ ์
ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. '๋์ ์์ง๋ ฅ'์ ๋ฒ์ญํ '๋์ ์์ง๋ ฅ'์ ๋ํด์๋ ๋ณ๋๋ก ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋์ํฉ๋๋ค. ์ต๊ณ ์ ๋ฒ์ญ์ ์๋๋๋ค. ๊ทธ๋ฌ๋ "๊ฐํ ์ฐ๊ฒฐ์ฑ"์ "๋์ ๊ฒฐํฉ"(๋ ๋ค๋ฅธ ์ค์ํ ๊ฐ๋
)์ด๋ฉฐ ์ฌ๊ธฐ์ "์ผ๊ด์ฑ"์ ์ ํฉํ์ง ์์ ๊ฒ์
๋๋ค. ๋๋ ๋นํ์ ๊ฐ๋ฐฉ์ ์ด๋ฉฐ ์ด๋ค ํํ๋ก๋ ๊ธฐ์ฌ์ ๋ํ ์๊ฒฌ์ ๊ฐ์ฌํ ๋ฐ์๋ค์
๋๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ด ์ค์ ๊ฐ์ฒด์ ํด๋นํ๋ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋๋ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์
๋๋ค. ๋ชจ๋ ์ค์ ๊ฐ์ฒด์๋ ๋ช ๊ฐ์ง ์์ฑ(์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋์ง ์์ ์ ์์)๊ณผ ๋์(๋ณ๊ฒฝ๋ ์๋ ์๊ณ ๋ณ๊ฒฝ๋์ง ์์ ์๋ ์์)์ด ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋ฐ๋ผ ๋ณ๊ฒฝ).์กฐ๊ฑด). ์๋ฅผ ๋ค์ด, ์ฐํ์ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๊ฐ์ง ์ค์ ๊ฐ์ฒด์
๋๋ค.
- ๋นจ๊ฐ์์ ๋๋ค(์๊ฐ์ด ์ง๋๋ ๋ณํ์ง ์์).
- ์ด์ ๊ธธ์ด๋ 10์ผํฐ๋ฏธํฐ์ ๋๋ค(์ฐํ์ ๊น์ผ๋ฉด ๊ธธ์ด๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค).
- ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ฉด ํ์ ์ด ๋จ์ต๋๋ค.
- ์๋ ฅ์ ๋ฐ๋ผ(์ธ๋ถ ์์ธ์ ๋ฐ๋ผ) ํ์ ์ด ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ๋ ์นด๋กญ๊ฒ ํ๋ฉด ๊ธธ์ด๊ฐ ์งง์์ง๋๋ค(์๊ตฌ์ ๊ฑฐ๋).
์ถ์ถ
์ถ์ํ๋ ์ฌ๊ฑด๋ณด๋ค๋ ์์ด๋์ด์์ ์ํธ์์ฉ ํ์ง , ์ฆ ํํ์ ํ์ง๋ก๋ถํฐ์ ์์ ๋ก ์ ์๋ฉ๋๋ค . ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋๋จธ๋ ์ด๋ป๊ฒ ํ๋ก๊ทธ๋๋ฐํ ์ง ๋ณด๋ค๋ ๋ฌด์ ์ ํ๋ก๊ทธ๋๋ฐํ ์ง ์ ์ง์คํ ์ ์์ต๋๋ค . ์ถ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ณ์ฝ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค. ์ด ๊ฐ๋ ์ ์ฌ์ฉํ ๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด ์จ๊ฒจ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฐ๊ธฐ๋ฅผ ์ํํ๋ ํด๋์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ ํด๋น ํด๋์ค์ "write" ๋ฉ์๋๊ฐ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฌด์์ ํ๋์? ์ฐ๋ฆฌ๋ ์ถ์์ ์ธ ์์ ์์ค ํด๋์ค๋ฅผ ์ค๊ณํ์ต๋๋ค. ์ฆ, ํ์ํ ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง ์๊ณ ์์ง๋ง ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ด ํด๋์ค์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.abstract class writer { write (); }
- ์ฐ๋ฆฌ๋ ์ธ๋ถ ์ฃผ์ฒด์๊ฒ ํ์ํ ์ต์ํ์ ์ ๋ณด๋ฅผ ๊ณต๊ฐํจ์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ ํตํด ์ฌ๊ณ ์ ์ง์คํ ์ ์๊ฒ ํ๊ณ (์ด๋ก ์ธํด ์ง์ค์ ์ธ ์ฌ๊ณ ๊ฐ ๊ฐ๋ฅํด์ง) ํผ๋์ ํผํ๊ณ ์๋ํ์ง ์์ ์ฝ์์ ํ๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค.
- ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด ๊ณต๊ฐ๋๋ฉด ๋ถ๊ฐ๋ฅํ ํฅํ ๊ฐ์ ์ ์ฌ์ง๋ฅผ ๋จ๊ฒจ๋ก๋๋ค.
๊ณ์น
์ผ๋ฐ์ ์ธ ์์ด๋ก "์์"์ "ํ๋ํ๊ณ ์ ๋ฌํ๋ค"๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋จ์ด๋ ์ฐ๋ฆฌ ๋ฌธํ์ ์์ฃผ ์ค๋ซ๋์ ์กด์ฌํด ์์ต๋๋ค. ์กฐ์๋ค์ ์ด์ฌํ ์ผํ์ฌ ๋ ์ ์ป์ด ์์๋ค์๊ฒ ๋ฌผ๋ ค์ฃผ์๊ณ , ์์ฐ๋ ์์์ ์ ํธํฉ๋๋ค. ํค, ํผ๋ถ/๋/๋จธ๋ฆฌ ์๊น ๋ฑ๊ณผ ๊ฐ์ ๋ชจ๋ ์ ์ฒด ์์ฑ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ถ๋ชจ๋ก๋ถํฐ ๋ฌผ๋ ค๋ฐ์ ์ ์ ์์ ์์กดํฉ๋๋ค. ์์์ ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์งํ ์๋๋ฅผ ๋์ ๋๋ค. OOP์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์์ฑ/๋์์ ์ฌ์ฉํ์ฌ ์์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์์ ํด๋์ค์์ ์์๋๋ ๋ชจ๋ ํด๋์ค๋ ํด๋น ์์ ํด๋์ค์ ๋์ผํ ์์ฑ/๋์์ ํฌํจํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์๋ ํด๋์ค๋ ๋ ๋ง์ ์์ฑ/๋์์ ์ป๊ฑฐ๋ ๋์ ๊ตฌํ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.class WritingInstrument { colour; write() { } } class Pen (child of parent) { inkcolour; }
์์ ์์์ ์์ ํด๋์ค(WritingInstrument)์๋ "color" ์์ฑ๊ณผ "write" ๋์์ด ์์ต๋๋ค. ํ์ ํด๋์ค(ํธ๋ค)๊ฐ ์ ์ธ๋๋ฉด "color" ์์ฑ๊ณผ "write" ๋์์ ๋ค์ ์ ์ธํ ํ์๊ฐ ์์ต๋๋ค. ์์์ผ๋ก ์ธํด "handle" ํด๋์ค์ ์กด์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ ํด๋์ค๋ ์์ฒด ์ถ๊ฐ ์์ฑ/๋์์ ์ ์ธํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์์ต๋๊น? ์ฐ๋ฆฌ ๊ฐ๋ฐ์๋ค์ ๋งค์ฐ ๊ฒ์ผ๋ฆ
๋๋ค. ์ฐ๋ฆฌ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๊ณ์ํด์ ์ธ์ํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋ค์ ๊ณ ๋ ค ์ฌํญ์ผ๋ก ์ธํด ๋์ผํ ์ฝ๋์ ๋ณต์ฌ๋ณธ์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
- ์ฝ๋ ๋ณต์ฌ๋ณธ์ด ์ ์์๋ก ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ์ฝ๋ ์ฌ๋ณธ์ด ๋ง์ง ์์ผ๋ฉด ํ ๊ณณ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ชจ๋ ๊ณณ์์ ํ์๋ฉ๋๋ค.
- ์ฝ๋๊ฐ ์ ์์๋ก ์ค๋ฅ๋ ์ค์ด๋ญ๋๋ค.
- ํ๋์ ์ฝ๋๊ฐ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋๋ฉด ์ผ๋ฐํ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
- ์ฐ๋ฆฌ๋ ์ฝ๋ ์์ฑ์ ์ค์ ์ ๋ก๋๋ค.
- ์ฐ๋ฆฌ๋ ํ ์คํธ์ ์ง์คํฉ๋๋ค.
class WritingInstrument { } class Pen extends WritingInstrument { }
๋คํ์ฑ
"๋คํ์ฑ"์ด๋ผ๋ ๋จ์ด๋ "ํด๋ฆฌ" ๋ผ๋ ๋ ๋จ์ด์์ ์ ๋๋์์ต๋๋ค . "๋ค์" / "ํ๋ ์ด์" "๋ชจํ" , ์ฆ "ํํ" ๋ฌธ์ ๊ทธ๋๋ก "๋คํ์ฑ"์ด๋ผ๋ ๋จ์ด๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๋ฅ๋ ฅ์ ๋ํ๋ ๋๋ค. ํ๋ก๊ทธ๋๋ฐ์์ ๋คํ์ฑ์ ์ฌ๋ฌ ์์น์์ ๊ตฌํ๋ ์ ์์ต๋๋ค.- ํด๋์ค
- ํ๋ ์์
- ์ด์์
Class WritingObject { wrire() { // ะฟะธัะตะผ, ะธัะฟะพะปัะทัั ััะฐะฝะดะฐััะฝัะต (ะฟะพ ะดะตัะพะปัั) ัะฒะตัะฐ } } class Pencil extends WritingObject { write() { // ะฟะธัะตะผ, ะธัะฟะพะปัะทัั ัะตััะน ัะฒะตั, ะฝะฐะฟะธัะฐะฝะฝัะน ัะตะบัั ะผะพะถะฝะพ ััะตัะตัั } } class Pen extends WritingObject { write() { // ะฟะธัะตะผ, ะธัะฟะพะปัะทัั ะณะพะปัะฑะพะน ัะฒะตั, ะฝะฐะฟะธัะฐะฝะฝัะน ัะตะบัั ะฝะตะปัะทั ััะตัะตัั } } class Main { main() { WritingObject wr = new WritingObject(); wr.write(); // ะฟะตัะฒัะน ะฒัะทะพะฒ WritingObject wr = new Pen(); wr.write(); // ะฒัะพัะพะน ะฒัะทะพะฒ WritingObject wr2 = new Pencil(); wr2.write(); // ััะตัะธะน ะฒัะทะพะฒ } }
์์ ์์๋ ํ์ ํด๋์ค์ธ pen ๋ฐ pen์ ์ํด ํ์ฅ/์ฌ์ ์๋๋ WritingObject์ ๊ธฐ๋ณธ ๊ตฌํ์ด ์์ต๋๋ค. write() ๋ฉ์๋๋ Main ํด๋์ค์์ ์ธ ๋ฒ ํธ์ถ๋ฉ๋๋ค. ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฐ์ฒด์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ตฌํ์ด ํธ์ถ๋ ๋๋ง๋ค. ์ด ๊ฒฝ์ฐ write() ๋ฉ์๋๋ ๋คํ์ฑ์ด๋ฏ๋ก ๋ค์ํ ์ ํ์ ๋์์ ๊ฐ์ต๋๋ค.
์บก์ํ
์บก์ํ๋ ๊ด๋ จ ๋ฐ์ดํฐ/๊ธฐ๋ฅ์ ํ๋์ ๋จ์๋ก ์์งํ๋ ๊ฒ์ผ๋ก ์ ์๋ฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ก์ธ์ค/์์ ์ ์ฉ์ดํ๊ฒ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ํน์ ์ฌ์ฉ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ์์ฑ์ ์ธ์ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ต์ ์ด ์์ต๋๋ค.printUserProperties(userName, userId, firstname, lastname, email, phone, โฆ โฆ โฆ.)
๋ชจ๋ ์์ฑ์ ๊ฐ์ ธ์ ์ฐจ๋ก๋ก ์ธ์ํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ชฉ๋ก์ ์์ ์๊ฐ ์ฆ๊ฐํ๋ฉด ๋ ์ด์ ์ฌ๋ฐ๋ฅธ ํ๋๋ฅผ ์๋ณํ ์ ์์ผ๋ฉฐ ํ๋์ ํ๋๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ๋ฉด ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ต๊ทผ ์ถ๊ฐ๋ ํ๋๊ฐ ํ์ํ์ง ์๋๋ผ๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ๊ต์ฒดํด์ผ ํฉ๋๋ค. ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ ํฅํ ์์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์์ฑ์ ํด๋์ค์ ์บก์ํํ๊ณ ์ด๋ฅผ ์งํฉ ๊ฐ์ฒด๋ก ๋ณํํฉ๋๋ค. class User { userName userId firstname lastname email phone .. .. .. } printUserProperties(user) {}
๊ฐ์ฒด๋ ๋ณ์ ๋ฐ ๊ด๋ จ ๋ฉ์๋์ ์ํํธ์จ์ด ๋ฒ๋ค์
๋๋ค. ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๊ฐ์ฒด๋ฅผ ํํํ ์ ์์ต๋๋ค. ์ ๋๋ฉ์ด์
ํ๋ก๊ทธ๋จ์ ๋์ค๋ ์ค์ ๊ฐ๋ฅผ ์์ํ๊ฑฐ๋ ์ด๋์ฉ ์์ ๊ฑฐ ๋ด๋ถ์ ์ํํธ์จ์ด ๊ฐ์ฒด๋ก ์ค์ ์์ ๊ฑฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค. OOP์์ ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ์ฒด์ ์ด๊ธฐ ์ํ(๋ณ์)๋ฅผ ์ ๊ณตํ๋ฉฐ ๋์(ํจ์, ๋ฉ์๋)์ ๊ตฌํํ๊ธฐ ์ํ ํ์ฅ ๊ฐ๋ฅํ ํ
ํ๋ฆฟ(ํ๋ก๊ทธ๋จ-์ฝ๋-ํ
ํ๋ฆฟ)์
๋๋ค. SOLID๋ผ๋ ์ฝ์ด๋ 2000๋
๋ ์ด Robert C. Martin์ด ๋ช
๋ช
ํ "์ฒ์ 5๊ฐ์ง ์์น"์ ์๋ฏธํ๋ Michael Feather๊ฐ ๋ง๋ ๊ฒ์
๋๋ค. ์์น์ ๋ชฉํ๋ ํจ๊ป ๊ตฌํ๋ ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ์ง ๊ด๋ฆฌ ๋ฐ ํ์ฅ์ด ์ฌ์ด ์์คํ
์ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๊ฒ์
๋๋ค. SOLID ์์น์ ๋ฆฌํฉํ ๋ง์ ํตํด "์ฉ์" ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ํ์ํ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ์ง์นจ์ด๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ ์ฝ๋๋ ์ฝ๊ฒ ์ฝ์ ์ ์๊ณ ํ์ฅ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ์ด๋ ๋ฏผ์ฒฉํ๊ณ ์ ์ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋๋ฐ ์ ๋ต์ ์ผ๋ถ์
๋๋ค.
๋จ์ผ ์ฑ ์ ์์น
OOP์์ ๋จ์ผ ์ฑ ์ ์์น์ ๊ฐ ํด๋์ค๊ฐ ํ๋ก๊ทธ๋จ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ํ ๋ถ๋ถ์ ๋ด๋นํด์ผ ํ๋ฉฐ ํด๋น ์ฑ ์์ ํด๋น ํด๋์ค์ ์ํด ์์ ํ ์บก์ํ๋์ด์ผ ํจ์ ๋ํ๋ ๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด ์ฑ ์๊ณผ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ด์ผ ํฉ๋๋ค.๊ฐ๋ฐฉํ/ํ์ํ ์์น
OOP์์ ๊ฐ๋ฐฉ/ํ์ ์์น์ "์ํํธ์จ์ด ์ํฐํฐ(ํด๋์ค, ๋ชจ๋, ๋ฉ์๋ ๋ฑ)๋ ํ์ฅ์๋ ๊ฐ๋ฐฉ๋์ด์ผ ํ์ง๋ง ๋ณ๊ฒฝ์๋ ํ์๋์ด์ผ ํ๋ค"๊ณ ๋ช ์ํฉ๋๋ค. ์ฆ, ์ํฐํฐ๋ ์์ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ํด๋น ๋์์ ํ์ฅํ ์ ์์ด์ผ ํฉ๋๋ค.Liskov ๋์ฒด ์์น
๋์ฒด์ฑ์ OOP์ ์์น์ ๋๋ค. ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ S๊ฐ T์ ํ์ ์ ํ์ธ ๊ฒฝ์ฐ T ์ ํ์ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ์์ด S ์ ํ์ ๊ฐ์ฒด๋ก ๋์ฒด๋ ์ ์์ด์ผ ํฉ๋๋ค(์ฆ, S ์ ํ์ ๊ฐ์ฒด๋ T ์ ํ์ ๊ฐ์ฒด๋ก ๋์ฒด๋ ์ ์์). ํ์ ์์ฑ ํ๋ก๊ทธ๋จ(์ ํ์ฑ, ์์ ์๋ฃ ๋ฑ).์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
์ธํฐํ์ด์ค ๋ถ๋ฆฌ์ ์์น์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ์ ์์กดํ๋๋ก ๊ฐ์ํด์๋ ์ ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด ์์น์ ๋ฐ๋ฅด๋ฉด, ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ ์๊ฒ ํฅ๋ฏธ๋ก์ด ๋ฐฉ๋ฒ๋ง ์ ์ ์๋๋ก ๋๊ท๋ชจ ์ธํฐํ์ด์ค๋ฅผ ๋ ์๊ณ ๋ ๊ตฌ์ฒด์ ์ธ ์ธํฐํ์ด์ค๋ก ๋๋๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ๋ชฉ์ ์ ์์คํ ์ ๋ถ๋ฆฌ๋ ์ํ๋ก ์ ์งํ์ฌ ๋ฆฌํฉํฐ๋ง, ๋ณ๊ฒฝ ๋ฐ ์ฌ๋ฐฐํฌ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.์ข ์์ฑ ๋ฐ์ ์๋ฆฌ
OOP์์ ์ข ์์ฑ ์ญ์ ์ ์์น์ ํ๋ก๊ทธ๋จ ๋ชจ๋ ๊ฐ์ ํน์ ํํ์ ์ฐ๊ฒฐ ๋๊น์ ์๋ฏธํฉ๋๋ค. ์ด ์์น์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ฑํ๋ ์์ ๋ชจ๋(์ ์ฑ ์ค์ )์์ ์ข ์ ํ์ ๋ชจ๋๋ก ์ค์ ๋ ํ์ค ์ข ์ ๊ด๊ณ๊ฐ ๋ฐ์ (์ญ์ )๋์ด ์์ ๋ ์์ ๋ชจ๋์ด ๊ตฌํ ์ธ๋ถ ์ฌํญ๊ณผ ๋ ๋ฆฝ๋ฉ๋๋ค. ์ ์์ค ๋ชจ๋. ์ด ์์น์ ๋ค์๊ณผ ๊ฐ์ด ๋ช ์ํฉ๋๋ค.- ๋์ ์์ค์ ๋ชจ๋์ ๋ฎ์ ์์ค์ ๋ชจ๋์ ์์กดํด์๋ ์ ๋ฉ๋๋ค. ๋ ๊ฐ์ง ์ ํ์ ๋ชจ๋ ๋ชจ๋ ์ถ์ํ์ ์์กดํด์ผ ํฉ๋๋ค.
- ์ถ์ํ๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์์กดํด์๋ ์ ๋ฉ๋๋ค. ์ธ๋ถ ์ฌํญ์ ์ถ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ ธ์ผ ํฉ๋๋ค.
GRASP ์์น
GRASP(์ผ๋ฐ ์ฑ ์ ํ ๋น ์ํํธ์จ์ด ํจํด)๋ ๊ฐ์ฒด ์งํฅ ๋์์ธ์์ ํด๋์ค์ ๊ฐ์ฒด์ ์ฑ ์์ ํ ๋นํ๊ธฐ ์ํ ์ง์นจ์ ์ ๊ณตํฉ๋๋ค.์ ์ด ์ฅ์น
์ปจํธ๋กค๋ฌ ํจํด์ ์ ์ฒด ์์คํ ๋๋ ์ฌ์ฉ ์ฌ๋ก ์๋๋ฆฌ์ค๋ฅผ ๋ํ๋ด๋ ๋น GUI ํด๋์ค์ ์์คํ ์ด๋ฒคํธ์์ ์ํธ ์์ฉ ์ฑ ์์ ํ ๋นํฉ๋๋ค. ์ ์ด ์ฅ์น:- ์ด๋ ์ฌ์ฉ์์ ์ง์ ์ํธ์์ฉํ์ง ์์ผ๋ฉฐ ์์คํ ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ ์๋ตํ๋ ์ญํ ์ ๋ด๋นํ๋ ๊ฐ์ฒด์ ๋๋ค.
- ํ๋(๋๋ ์ฌ๋ฌ ์ํธ ๊ด๋ จ๋) ์ฌ์ฉ ์ฌ๋ก์ ๋ชจ๋ ์์คํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์์คํ ์๋์ ์ ์ดํ๋ โโGUI ๋ค์ ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด์ ๋๋ค.
- ๊ทธ๋ ์ค์ค๋ก ์์ ์ ์ํํ ํ์๊ฐ ์์ผ๋ฉฐ ๊ทธ์ ์๋ฌด๋ ์ด๋ฒคํธ์ ํ๋ฆ์ ์ ์ดํ๋ โโ๊ฒ์ ๋๋ค.
์ฐฝ์กฐ์
์์ฑ์ ํด๋์ค์ ์๋ฌด๋ ํ์ ์ฌ์ฉ์ ์ํด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์์ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ธฐํ ๋งค๊ฐ๋ณ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์๊ณ ์์ต๋๋ค. ๋๋๋ก ์์ฑ์ ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์ ๊ทน์ ์ผ๋ก ์์ฑํ์ฌ ์บ์์ ์ ์ฅํ๊ณ ํ์ํ ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.๋์ ์์ง๋ ฅ
๋์ ์์ง๋ ฅ์ ํ๋์ ๋ช ํํ ์์ ์ ์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์ฝ๊ฒ ์ ์ดํ๊ณ ์ดํดํ ์ ์๋ ์ํ๋ก ๊ฐ์ฒด๋ฅผ ๋ณด์กดํ๋ ๊ฒ์ด ๋ชฉ์ ์ธ ํ๊ฐ ํจํด์ ๋๋ค. High Coupling์ ์ผ๋ฐ์ ์ผ๋ก Low Coupling์ ์ง์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋์ ์ผ๊ด์ฑ์ด๋ ํน์ ์์์ ์ฑ ์์ด ๋ช ํํ๊ฒ ์ ์๋์ด ์์(๊ฐํ๊ฒ ๊ด๋ จ๋์ด ์๊ณ ๊ณ ๋๋ก ์ง์ค๋์ด ์์)์ ์๋ฏธํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ํด๋์ค์ ํ์ ์์คํ ์ผ๋ก ๋๋๋ ๊ฒ์ ์์คํ ์์ฑ์ ์์ง๋ ฅ์ ๋์ด๋ ์์ ์ ์์ ๋๋ค. ๋ฐ๋ฉด์ ๋์จํ ๊ฒฐํฉ์ ์์์ ๊ด๋ จ๋์ง ์์ ์์ ์ด ๋๋ฌด ๋ง์ ์ํฉ์ ๋๋ค. ๋์จํ๊ฒ ๊ฒฐํฉ๋ ์์๋ ์ดํดํ๊ธฐ ์ด๋ ต๊ณ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ ์ ์ง ๊ด๋ฆฌ ๋ฐ ๋ณ๊ฒฝ์ด ์ด๋ ค์ด ๊ฒฝํฅ์ด ์์ต๋๋ค.์ฐํ
Roundabout ํจํด์ ๋ ์์ ๊ฐ์ ์ํธ ์์ฉ์ ๋ํ ์ฑ ์์ ์ค๊ฐ ๊ฐ์ฒด์ ํ ๋นํ์ฌ ๋ ์์ ๊ฐ์ ๋์จํ ๊ฒฐํฉ(๋ฐ ์ฌ์ฌ์ฉ์ฑ)์ ์ ์งํฉ๋๋ค. MVC(Model-View-Controller) ํจํด์์ ๋ฐ์ดํฐ(๋ชจ๋ธ)์ ํด๋น ๋์คํ๋ ์ด(๋ทฐ) ์ฌ์ด๋ฅผ ์ค์ฌํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์ ํ๋ ๊ฒ์ด ๊ทธ ์์ ๋๋ค.์ ๋ณด์ ๋ฌธ๊ฐ
์ ๋ณด ์ ๋ฌธ๊ฐ(์ ๋ฌธ๊ฐ ๋๋ ์ ๋ฌธ๊ฐ ์์น์ด๋ผ๊ณ ๋ ํจ)๋ ๋๊ตฌ์๊ฒ ์ฑ ์์ ์์ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์น์ ๋๋ค. ์ฑ ์์๋ ๋ฉ์๋, ๊ณ์ฐ ํ๋ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค. ์ฑ ์์ ํ ๋นํ ๋ ์ด ์์น์ ์ฌ์ฉํ ๋ ์ฃผ์ ์ ๊ทผ ๋ฐฉ์์ ์ฑ ์ ๋ถ์, ์ฑ ์ ์ดํ์ ํ์ํ ์ ๋ณด ์๋ณ, ์ต์ข ์ ์ผ๋ก ์ด ์ ๋ณด์ ์์น ์ค์ ๋ฑ ์ผ๋ จ์ ์์ ์ ๋๋ค. ์ ๋ณด ์ ๋ฌธ๊ฐ ์์น์ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ์คํํ ์ ๋ณด๊ฐ ๊ฐ์ฅ ๋ง์ ํด๋์ค์ ์ฑ ์์ด ํ ๋น๋ฉ๋๋ค.๋ฎ์ ๊ฒฐํฉ
๋์จํ ๊ฒฐํฉ์ ์ฑ ์ ํ ๋น ๋ฐฉ๋ฒ์ ์ง์ ํ๋ ํ๊ฐ ํจํด์ ๋๋ค. ํด๋์ค ๊ฐ์ ๋์จํ ๊ฒฐํฉ, ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ํด๋์ค์ ์ต์ํ์ ์ํฅ์ ๋ฏธ์น๊ณ ์ฌ์ฌ์ฉ์ฑ์ ์ต๋ํํด์ผ ํฉ๋๋ค.๋คํ์ฑ
๋คํ์ฑ์ ๋ฐ๋ฅด๋ฉด ์ ํ์ ๋ฐ๋ฅธ ๋์์ ๋ณํ๋ ์ด๋ฌํ ๋ณํ๊ฐ ๋ฐ์ํ๋ ์ ํ์ ํ ๋น๋ฉ๋๋ค. ์ด๋ ๋คํ์ฑ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค.๋ณดํธ๋ ๋ณํ
๋ณดํธ๋ ๋ณ๊ฒฝ ํจํด์ ์ธํฐํ์ด์ค์ ๋ถ์์ ์ฑ์ ์ด์ ์ ๋ง์ถ๊ณ ๋คํ์ฑ์ ์ฌ์ฉํ์ฌ ํด๋น ์ธํฐํ์ด์ค์ ๋ค์ํ ๊ตฌํ์ ์์ฑํจ์ผ๋ก์จ ๋ค๋ฅธ ์์(๊ฐ์ฒด, ์์คํ , ํ์ ์์คํ )๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์์๋ฅผ ๋ณดํธํฉ๋๋ค.์์ ์ ์
์์ ๊ตฌ์ฑ์๋ ๋ฌธ์ ์์ญ์ ๊ฐ๋ ์ ๋ํ๋ด์ง ์๋ ํด๋์ค๊ฐ ํฌํจ๋๋ฉฐ, ํนํ ๋์จํ ๊ฒฐํฉ, ๋์ ์์ง๋ ฅ ๋ฐ ์ต๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ ๋ฌ์ฑํ๋๋ก ์ค๊ณ๋์์ต๋๋ค(์ ๋ณด ์ ๋ฌธ๊ฐ ํจํด์์ ์ ๊ณตํ๋ ์๋ฃจ์ ์ ์ด๋ฅผ ๋ฌ์ฑํ์ง ๋ชปํฉ๋๋ค). ์ด๋ฌํ ํด๋์ค๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ๋๋ฉ์ธ ์ค์ฌ ์ค๊ณ์์๋ "์๋น์ค"๋ผ๊ณ ํฉ๋๋ค.๋นํ
Potok ๋ฑ์ ์ฐ๊ตฌ์์๋ OOP์ ์ ์ฐจ์ ์ ๊ทผ ๋ฐฉ์ ์ฌ์ด์ ํฐ ์ฐจ์ด๊ฐ ์์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค.OOP๋ฅผ ๋ค๋ฅธ ๊ธฐ์ , ํนํ ๊ด๊ณํ ๊ธฐ์ ๊ณผ ๋นํ์ ์ผ๋ก ๋น๊ตํ๋ ๊ฒ์ ์๊ฒฉํ๊ณ ๋๋ฆฌ ๋ฐ์๋ค์ฌ์ง๋ OOP ์ ์๊ฐ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ต๋๋ค(Christopher J. Date).
๋ค๋ฅธ ์ธ์ด(LISP ๋ฐฉ์ธ, ๊ธฐ๋ฅ์ ์ธ์ด ๋ฑ)์ ๋นํด OOP ์ธ์ด๋ ๊ณ ์ ํ ์ฅ์ ์ด ์์ผ๋ฉฐ ๋ถํ์ํ ๋ณต์ก์ฑ์ ๋ถ๊ณผํฉ๋๋ค. (๋ก๋ ์ค ํฌ๋ฃจ๋ธ๋)
๋๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๊ธฐ์ ์ ์ผ๋ก ํ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋จ์ผ ์ ํ ๋ด์์ ๋ค์ํ ์ธํฐํ์ด์ค ์ธก๋ฉด์์ ์ธ๊ณ๋ฅผ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋ถํดํ๋ ค๊ณ ํฉ๋๋ค. ์ค์ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ค์ํ ์ ํ์ผ๋ก ํ์ฅ๋๋ ์ธํฐํ์ด์ค ์ ํ๊ตฐ์ธ ๋ค์ค ์ ๋ ฌ ๋์๊ฐ ํ์ํฉ๋๋ค. ๋๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ์ฒ ํ์ ์ผ๋ก ๊ฑด๊ฐํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ผ๊ณ ๋งํฉ๋๋ค. ์ด๊ฒ์ด ์ฌ์ค์ด๋ผ ํ ์ง๋ผ๋ ๋ณ๋ก ํฅ๋ฏธ๋กญ์ง ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋์์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์ ํ ์๋ฌด ๋ง๋ ํ์ง ์๋ ๊ฒ์ ๋๋ค. (์๋ ์ฐ๋ ์คํ ํ๋ ธํ)
๋๊ธฐ์ ์ฌ์ด์์ OOP์ ์ธ๊ธฐ๋ "๋๊ท๋ชจ(๊ทธ๋ฆฌ๊ณ ์์ฃผ ๋ณํํ๋) ํ๋ฒํ ํ๋ก๊ทธ๋๋จธ ๊ทธ๋ฃน"์ ๊ธฐ์ธํฉ๋๋ค. OOP๊ฐ ๋ถ๊ณผํ๋ ๊ท์จ์ ํ๋ก๊ทธ๋๋จธ๊ฐ "๋๋ฌด ๋ง์ ํด๋ฅผ ๋ผ์น๋" ํ์๋ฅผ ๋ฐฉ์งํฉ๋๋ค. (ํด ๊ทธ๋ ์ด์)
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ช ์ฌ๋ฅผ ์ต์ฐ์ ์ผ๋ก ์๊ฐํฉ๋๋ค. ์ ๊ทธ๋ ๊ฒ ๊ทน๋จ์ ์ธ ์กฐ์น๋ฅผ ์ทจํ๊ณ ์ฐ์ค์ ํ ๋ถ๋ถ์ ๋ฐ์นจ๋์ ์ฌ๋ ค ๋์ต๋๊น? ํ ๊ฐ๋ ์ด ๋ค๋ฅธ ๊ฐ๋ ๋ณด๋ค ์ฐ์ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? OOP๊ฐ ๊ฐ์๊ธฐ ๋์ฌ๋ฅผ ์ฐ๋ฆฌ์ ์ฌ๊ณ ์ ๋ ์ค์ํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด์ํ๊ฒ ์๊ณก๋ ๊ด์ ์ด๋ค. (์คํฐ๋ธ ์๊ฒ)Clojure์ ์ฐฝ์์์ธ Rick Hickey๋ ๊ฐ์ฒด ์์คํ ์ ํ์ค ์ธ๊ณ์ ๊ทน๋๋ก ๋จ์ํ๋ ๋ชจ๋ธ๋ก ์ค๋ช ํ์ต๋๋ค. ๊ทธ๋ OOP๊ฐ ์๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ชจ๋ธ๋งํ ์ ์๋ค๋ ์ ์ ๊ฐ์กฐํ๋๋ฐ, ์ด๋ ํ๋ก๊ทธ๋จ์์ ๋ฉํฐ์ค๋ ๋ฉ์ด ์ผ๋ฐํ๋ ๋ ํฐ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. Unix ํ๋ก๊ทธ๋๋จธ์ด์ ์คํ ์์ค ์ํํธ์จ์ด ์นํธ์์ธ Eric S. Raymond๋ OOP๊ฐ "ํ๋์ ์๋ฃจ์ "์ด๋ผ๋ ์ฃผ์ฅ์ ๋นํํด ์์ผ๋ฉฐ OOP๊ฐ ํฌ๋ช ์ฑ์ ๋ฐฉํดํ๋ ๋ค์ค ๊ณ์ธต ํ๋ก๊ทธ๋จ์ ์ฅ๋ คํ๋ค๊ณ ์ผ์ต๋๋ค. ์ด์ ๋ฐ๋๋๋ ์ ๊ทผ ๋ฐฉ์์ผ๋ก Raymond๋ Unix์ C์ ์๋ฅผ ๋ค์์ต๋๋ค.
GO TO FULL VERSION