๐พ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP) ์ด๋?
Java, C++, C# ๋ฑ ํ๋์ ์ธ์ด๋ค์ ๋๋ถ๋ถ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ค. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ค์ธ๊ณ์ ์กด์ฌํ๊ณ ์ธ์งํ๊ณ ์๋ ๊ฐ์ฒด(Object)๋ฅผ ์ํํธ์จ์ด์ ์ธ๊ณ์์ ํํํ๊ธฐ ์ํด ๊ฐ์ฒด์ ํต์ฌ์ ์ธ ๊ฐ๋ ๋๋ ๊ธฐ๋ฅ๋ง์ ์ถ์ถํ๋ ์ถ์ํ(abstraction)๋ฅผ ํตํด ๋ชจ๋ธ๋งํ๋ ค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋งํ๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํจ์๋ค์ ์งํฉ ํน์ ๋จ์ํ ์ปดํจํฐ์ ๋ช ๋ น์ด๋ค์ ๋ชฉ๋ก์ด๋ผ๋ ์ ํต์ ์ธ ์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ๋ค๋ฅธ, ๊ด๊ณ์ฑ์๋ ๊ฐ์ฒด๋ค์ ์งํฉ์ด๋ผ๋ ๊ด์ ์ผ๋ก ์ ๊ทผํ๋ ์ํํธ์จ์ด ๋์์ธ์ผ๋ก ๋ณผ ์ ์๋ค.
→ ๋จ์ํ ๋ณ๊ฐ์ ๋ณ์์ ํจ์๋ก ์์ฐจ์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ ๋์ด, ๋ฐ์ดํฐ์ ์ ๊ทผ๊ณผ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ํ ๋ชจํ์ ๋ง๋ค์ด ๋ด๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ด ๋ณ๊ฐ๋ก ์ทจ๊ธ๋์ง ์๊ณ , ํ ๋ฒ์ ๋ฌถ์ด์ ์ฒ๋ฆฌํ ์ ์๋ค.
๊ฐ ๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์๋ ์๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์๋ ์์ผ๋ฉฐ, ๋๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์๋ ์๋ค. ๊ฐ ๊ฐ์ฒด๋ ๋ณ๋์ ์ญํ ์ด๋ ์ฑ ์์ ๊ฐ๋ ์์ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๊ณ ๋๋ ๋ถํ์ผ๋ก ๋ณผ ์ ์๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ณด๋ค ์ ์ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ํ์ฅ์ฑ ์ธก๋ฉด์์์๋ ์ ๋ฆฌํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋๋ก ์๋๋์๊ณ , ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์๋ค.
โ ๐ ์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฐจ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ์ ํจ์๋ฅผ ๋ชจ๋ํํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ํ์ ์ผ๋ก๋ C, Pascal, Fortran ๋ฑ์ด ์๋ค.
• JavaScript๋ ๋ช ๋ นํ(imperative), ํจ์ํ(functional), ํ๋กํ ํ์ ๊ธฐ๋ฐ(prototype-based)์ ๋ฉํฐ ํจ๋ฌ๋ค์ ์ธ์ด๋ก ์๋ฐํ ๋งํ๋ฉด ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ ์๋์ง๋ง, ๊ฐ์ฒด ์งํฅ ํจํด์ผ๋ก ์ผ๋ก ์์ฑ ๊ฐ๋ฅํ๋ค.
• JavaScript๋ ์ด๋ฏธ ์์ฑ๋ ์ธ์คํด์ค์ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค๋ ํน์ง์ด ์๋ค. ๊ฐ์ฒด ์งํฅ์ ์์, ์บก์ํ(์ ๋ณด ์๋) ๋ฑ์ ๊ฐ๋ ์ ํ๋กํ ํ์ ์ฒด์ธ๊ณผ ํด๋ก์ ๋ฑ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
๐ ์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋น๊ต
์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ | ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ | |
ํน์ง | ์ปดํจํฐ ์ฒ๋ฆฌ๊ตฌ์กฐ์ ์ ์ฌ | ์ฌ๋์ ์ฌ๊ณ ๋ฐฉ์์ ๊ฐ๊น์ |
๋ฉ๋ชจ๋ฆฌ์ฌ์ฉ | ์ ์ | ๋ง์ |
์ฒ๋ฆฌ์๋ | ๋น ๋ฆ | ๋๋ฆผ |
์ฌํ์ฉ์ฑ | ๋ฎ์ | ๋์ |
์ฝ๋์ดํด | ์ด๋ ค์ | ์ฌ์ |
๋๋ฒ๊น | ์ด๋ ค์ | ์ฌ์ |
๐พ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฃผ์ ๊ฐ๋ ๊ณผ ํน์ง (OOP Basic Concepts)
์บก์ํ, ์์, ์ถ์ํ, ๋คํ์ฑ
โ๏ธ Encapsulation(์บก์ํ)
๋ฐ์ดํฐ(์์ฑ)์ ๊ธฐ๋ฅ(๋ฉ์๋)์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ฒ์ผ๋ก ์ฝ๋๊ฐ ๋ณต์กํ์ง ์๊ฒ ๋ง๋ค๊ณ , ์ฌ์ฌ์ฉ์ฑ์ ๋์ธ๋ค.
• ์๋ํ(hiding): ์๋ํ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ ๋ด๋ถ ๊ตฌํ์ด ์ธ๋ถ๋ก ๋ ธ์ถ๋์ง ์๋๋ก ๋ง๋๋ ๊ฒ์ผ๋ก, ๋ํ ์ผํ ๊ตฌํ์ด๋ ๋ฐ์ดํฐ๋ ์จ๊ธฐ๊ณ ๊ฐ์ฒด ์ธ๋ถ์์ ํ์ํ ๋์(๋ฉ์๋)๋ง ๋ ธ์ถ ์ํฌ ์ ์๋ค. ์๋ํ์ ํน์ง์ ์ด๋ ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๊ฐ์ฒด ๋ด ๋ฉ์๋์ ๊ตฌํ๋ง ์์ ํ๊ณ , ๋ ธ์ถ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋ ํ๋ฆ์ ๋ฐ๋์ง ์๋๋ก ๋ง๋ค ์ ์๋ค. (์ ์ฐจ์ ์ฝ๋์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ํํ๊ฐ ๋ฐ๋ ๋์ ์ฝ๋์ ํ๋ฆ์ ํฐ ์ํฅ์ ๋ฏธ์น๊ฒ ๋์ด ์ ์ง ๋ณด์๊ฐ ์ด๋ ต๋ค. ๊ทธ๋์ ๋ ์๊ฒฉํ ํด๋์ค๋ ์์ฑ์ ์ง์ ์ ์ธ ์ ๊ทผ์ ๋ง๊ณ , ์ค์ ํ๋ ํจ์(setter), ๋ถ๋ฌ์ค๋ ํจ์(getter)๋ฅผ ์ฒ ์ ํ๊ฒ ๋๋๊ธฐ๋ ํ๋ค.)
• ๋์จํ ๊ฒฐํฉ(loose coupling): ์บก์ํ๋ฅผ ํตํด ๋ฐ์ดํฐ(์์ฑ)์ ๊ธฐ๋ฅ(๋ฉ์๋)๋ค์ ๋์จํ๊ฒ ๊ฒฐํฉ๋๋ค. ๋์จํ ๊ฒฐํฉ์ ์ฝ๋ ์คํ ์์์ ๋ฐ๋ผ ์ ์ฐจ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ์ด ์๋๋ผ, ์ฝ๋๊ฐ ์์งํ๋ ์ค์ ๋ชจ์ต๊ณผ ๋ฎ๊ฒ ์ฝ๋๋ฅผ ๋ชจ์ ๊ฒฐํฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด๋ ์ธ์ ๋ ๊ตฌํ์ ์์ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
โ๏ธ Inheritance (์์)
๊ธฐ๋ณธ ํด๋์ค(base class)์ ํน์ง์ ํ์ ํด๋์ค(derived class)๊ฐ ๋ฌผ๋ ค๋ฐ๋ ๊ฒ์ผ๋ก, ํ์ ํด๋์ค๋ ๊ธฐ๋ณธ ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ค์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ธ๋ค.
์์์ ํตํด ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์๊ตฌ์ ๋ง๊ฒ ๊ธฐ์กด ํด๋์ค๋ฅผ ์์ ํ์ฌ ์ฌ์ฌ์ฉํ ์๋ ์๊ณ , ํด๋์ค ๊ฐ์ ์ข ์ ๊ด๊ณ๋ฅผ ํ์ฑํจ์ผ๋ก์จ ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ์กฐ์งํํ ์๋ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋กํ ํ์ ์ฒด์ธ์ ์ฌ์ฉํ์ฌ ์์์ ๊ตฌํํ๋ค. ์ด๊ฒ์ ํ๋กํ ํ์ ์ ํตํด ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ง์ ์์๋๋ค๋ ์๋ฏธ์ด๋ค.
โ๏ธ Abstraction (์ถ์ํ)
๋ด๋ถ ๊ตฌํ์ ์์ฃผ ๋ณต์กํ๋ฐ, ์ค์ ๋ก ๋ ธ์ถ๋๋ ๋ถ๋ถ์ ๋จ์ํ๊ฒ ๋ง๋ ๋ค๋ ๊ฐ๋ ์ ์ถ์ํ๋ผ๊ณ ํ๋ค. ๋จ์ํ๋ ์ฌ์ฉ์ผ๋ก ๋ณํ์ ๋ํ ์ํฅ์ ์ต์ํํ๋ค.
์๋ฅผ ๋ค์ด ์ ํ๋ผ๋ ๊ฐ์ฒด์๋ ์คํผ์ปค์ ๋ง์ดํฌ, ์ํท ๋ณด๋ ๋ฑ์ด ์กด์ฌํ๋ ๋ฑ ๋ณต์กํ ๋ด๋ถ ๊ตฌํ์ด ๋์ด ์๊ฒ ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋๋ ์ด๋ฌํ ์กด์ฌ์ ๋ํด ์๊ฐํ์ง ์๊ณ ๋จ์ํ ์ํ๊ธฐ๋ฅผ ๋ค๊ณ ๋ฒํผ์ ๋๋ฌ์ ํด๊ฒฐํ๋ ๊ฒ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋จ์ํํ ์ ์๋ค.
์ถ์ํ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ํ์ํ์ง ์์ ๋ฉ์๋ ๋ฑ์ ๋ ธ์ถ์ํค์ง ์๊ณ , ๋จ์ํ ์ด๋ฆ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ํฌ์ปค์ค๊ฐ ๋ง์ถฐ์ ธ ์๋ค. ํด๋์ค ์ ์์ ๋ฉ์๋์ ์์ฑ๋ง ์ ์ํ ๊ฒ์ ์ธํฐํ์ด์ค๋ผ๊ณ ํ๋ฉฐ, ์ด๊ฒ์ด ์ถ์ํ์ ๋ณธ์ง์ด๋ค.
โ๏ธ Polymorphism (๋คํ์ฑ)
๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ฉ์๋๋ผ๋ ๋ค๋ฅด๊ฒ ์๋ํ ์ ์๋๋ฐ, ์ด๋ฅผ ๋คํ์ฑ์ด๋ผ๊ณ ํ๋ค. ๋คํ์ฑ์ผ๋ก ์ธํด ๋์ผํ ๋ฉ์๋์ ๋ํด์๋ ๊ฐ์ฒด ํน์ฑ์ ๋ง๊ฒ ๋ค๋ฅธ ์๋์ ์์ฑํ ์ ์๋ค.
โ๏ธ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ชป๋ ์ ๋ณด๋ ๋ ๊ณต์ ํ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐