๐จ [Java] ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object Oriented Programming)
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
๊ฐ์ฒด๋ฅผ ์ค์ฌ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ ์ง๋ ๊ฒ. ์ฌ๊ธฐ์ ๊ฐ์ฒด๋ ๊ธฐ๋ฅ์ ํ๋ ๋จ์๋ฅผ ๋งํ๋ค.
์๋ฅผ๋ค๋ฉด ์๋์ฐจ๊ฐ ์๋ค๊ณ ํ์. ์๋์ฐจ์ ๋ค์ด๊ฐ๋ ์ฌ๋ฌ๊ฐ์ง ๋ถํ๋ค์ด ์๋ค. ํธ๋ค, ํ์ด์ด, ์์ง ๋ฑ๋ฑ ์ด๋ฌํ ๋ถํ๋ค์ด ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ค์ด ๋ชจ์ฌ ์๋์ฐจ๋ฅผ ์ด๋ฃจ๊ฒ ๋๋ค. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ ์ฅ์ ์ค ํ๋์ธ ์ ์ง๋ณด์๊ฐ ์ฝ๋ค๋ ์ ์ด ์ด ๋ถ๋ถ์์ ๋๋ฌ๋๊ฒ ๋๋ค.
ํธ๋ค์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ด๋ ํ ์๋์ฐจ์์ ๊ฐ์ ธ๊ฐ ์ธ ์ ์๋ ๊ฒ ์ฒ๋ผ ํ ๋ฒ ๋ง๋ค์ด ๋์ผ๋ฉด ์ฌ์ฌ์ฉ์ด ์ฉ์ดํ๊ณ ์ ์ง๋ณด์ ๋น์ฉ์ด ์ ๊ฒ ๋ค์ด๊ฐ๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง
- ์ถ์ํ
- ๊ฐ์ฒด์์ ๊ณตํต๋ ์์ฑ๊ณผ ํ์๋ฅผ ์ถ์ถํ๋ ๊ฒ
- ์ค์ ์ธ์์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฎ๊ธธ ์ ์๊ฒ, ํ์ํ ๊ธฐ๋ฅ๋ค๋ง ๊ฐ์ ธ์์ ๋จ์ํ ํ๋ ๊ฒ.
- ์ค์ ๋ฅผ ๊ฐ์ฒดํ ํ๋ ๊ฒ์ด ์๋ ํ์ํ ์ ๋ณด๋ค๋ก ๊ฐ์ํ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์งํ์ฒ ์ ๋ ธ์ ๋๊ฐ ๊ทธ ์์ ์ค ํ๋์ด๋ค.
- ์ถ์ํ๊ฐ ํ์ํ ์ด์ ๋ ์ถ์ํ๋ ๋ถํ์ํ ์ ๋ณด๋ ์จ๊ธฐ๊ณ ์ค์ํ ์ ๋ณด๋ง์ ํํํจ์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด ์ค๋ค.
์ถ์ํ๊ฐ ์ ํ์ํ ๊น?
- 'ํ๋'์ ๊ฐ์ ๋ค๋ฅธ ์๋์ฐจ ๋ธ๋๋๊ฐ ์ถ๊ฐ๋ ์๋ ์๋ค. ์ด๋ ์ถ์ํ๋ก '์๋์ฐจ'๋ฅผ ๊ตฌํ ํด๋์ผ๋ฉด ๋ค๋ฅธ ๊ณณ์ ์ฝ๋๋ฅผ ์์ ํ ํ์ ์์ด ์ถ๊ฐ๋ก ๋ง๋ค ๋ถ๋ถ๋ง ์๋ก ์์ฑํด์ฃผ๋ฉด ๋๋ค.
- ์บก์ํ
- ๋ฐ์ดํฐ๋ฅผ ์๋ํ๊ณ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ๊ธฐ๋ฅ์ ๋ ธ์ถ์ํค์ง ์๋๋ค๋ ์๋ฏธ (์ ๊ทผ ์ ์ด์ ํ์ฉ)
์ ๊ทผ ์ ์ด ์ง์์
public : ๋ชจ๋๊ฐ ์ ๊ทผ ๊ฐ๋ฅ
protected : ์์ / ๊ฐ์ ํจํค์ง ๋ด ํด๋์ค์์ ์ ๊ทผ ๊ฐ๋ฅ
private : ๋ณธ์ธ๋ง ์ ๊ทผ ๊ฐ๋ฅ
- ์์์ฑ
- ์์์ด๋ ์์๊ฐ๋ ์ ํน์ง์ ํ์ ๊ฐ๋ ์ด ๋ฌผ๋ ค๋ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค. ํ๋์ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ํน์ง (๋ฐ์ดํฐ์ ๋ฉ์๋)๋ค์ ๋ค๋ฅธ ํด๋์ค๊ฐ ๋ฌผ๋ ค์ฃผ๊ณ ์ ํ ๋ ์์์ ํน์ง์ ์ฌ์ฉํ๋ค.
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ์ฆ๋ ์ํฌ ์ ์๋ค. -> ๊ฐ์ ๊ธฐ๋ฅ์ ๋ ๊ตฌํ ํ ํ์๊ฐ ์๋ค.
- ์ข ๋ ํญ๋๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. -> ์์ ๋ฐ์ ํจ์๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ดํฐ์ ํจ์ ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ฅ์ | ๋จ์ |
- ์ฌ์ฌ์ฉ์ผ๋ก ์ธํ ์ฝ๋๊ฐ ์ค์ด๋ ๋ค. - ๋ฒ์ฉ์ ์ธ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. - ์๋ฃ์ ๋ฉ์๋์ ์์ ๋ก์ด ์ฌ์ฉ ๋ฐ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค. |
- ์์ ํด๋์ค์ ๋ณ๊ฒฝ์ด ์ด๋ ค์ ์ง๋ค. - ๋ถํ์ํ ํด๋์ค๊ฐ ์ฆ๊ฐํ ์ ์๋ค. - ์์์ด ์๋ชป ์ฌ์ฉ๋ ์ ์๋ค. |
- ๋คํ์ฑ
- ๋คํ์ฑ์ ๋ค์ํ ํํ๋ก ํํ์ด ๊ฐ๋ฅํ ๊ฒ์ ์๋ฏธํ๋ค.
์ค๋ฒ๋ผ์ด๋ฉ(Overriding)
- ๊ฐ์ ๋ฉ์๋ ์ด๋ฆ / ๊ฐ์ ์ธ์ ๋ชฉ๋ก / ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ค.
- ์์ ํด๋์ค ํ์ ์ ๊ฐ์ฒด ์ฐธ์กฐ ๋ณ์์์ ์๋์ผ๋ก ํ์ ํด๋์ค๊ฐ ์ค๋ฒ๋ผ์ด๋ฉํ ๋ฉ์๋๋ฅผ ํธ์ถํด ์ค๋ค.
์ค๋ฒ๋ก๋ฉ(Overroding)
- ๊ฐ์ ๋ฉ์๋ ์ด๋ฆ / ๋ค๋ฅธ ์ธ์ ๋ชฉ๋ก / ๋ค์์ ๋ฉ์๋ ์ค๋ณต์ ์ ์
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ๋จ์
- ์ฅ์
- ํด๋์ค ๋จ์๋ก ๋ชจ๋ํ์์ผ์ ๊ฐ๋ฐํ๊ธฐ ๋๋ฌธ์ ์ ๋ฌด ๋ถ๋ด์ด ํธ๋ฆฌํ๊ณ ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ ํฉ
- ํด๋์ค ๋จ์๋ก ์์ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ ์ง ๋ณด์๊ฐ ํธ๋ฆฌ
- ํด๋์ค๋ฅผ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ์์์ ํตํด ํ์ฅํจ์ผ๋ก์จ ์ฝ๋ ์ฌ์ฌ์ฉ์ด ์ฉ์ด
- ๋จ์
- ์ฒ๋ฆฌ์๋๊ฐ ์๋์ ์ผ๋ก ๋๋ฆผ
- ๊ฐ์ฒด์ ์๊ฐ ๋ง์์ง์ ๋ฐ๋ผ ์ฉ๋์ด ์ปค์ง ์ ์์
- ์ค๊ณ์ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ํ์
SOLID (๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น)
๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณํ๊ธฐ ์ํด SOLID ๋ผ ๋ถ๋ฆฌ๋ 5๊ฐ์ง ์์น์ด ์๋ค.
- ๋จ์ผ ์ฑ
์ ์์น (SRP, Single Responsibility Principle)
- ํ๋์ ํด๋์ค๋ ๋จ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
- ๋จ์ผ ์ฑ ์ ์์น์ ์งํค์ง ์์ ๊ฒฝ์ฐ ํ ์ฑ ์ ๋ณ๊ฒฝ์ ์ํด ๋ค๋ฅธ ์ฑ ์๊ณผ ๊ด๋ จ๋ ์ฝ๋์ ์ํฅ์ด ๊ฐ ์ ์๋ค.
- ๊ฐ๋ฐฉ-ํ์ ์์น (OCP, Open/Closed Principle)
- ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฅํ ์ ์์ผ๋ฉด์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ฝ๋๋ ์์ ํ์ง ์๋๋ค.
- ๋ฆฌ์ค์ฝํ ์นํ ์์น (LSP, Liskov Substitution Principle)
- ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ์์ ํ์ ์ ๊ฐ์ฒด๋ฅผ ํ์ ํ์ ์ ๊ฐ์ฒด๋ก ์นํํด๋, ์์ ํ์ ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ผ๋ก ๋์ํด์ผ ํ๋ค.
- ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (ISP, Interface Segregation Principle)
- ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ข๋ค.
- ์ธํฐํ์ด์ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ๋ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค์ ๋ณ๊ฒฝ์ด ์์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
- ์์กด๊ด๊ณ ์ญ์ ์์น (DIP, Dependency Inversion Principle)
- ์ถ์ํ์ ์์กดํด์ผ์ง ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค.
- ๊ณ ์์ค ๋ชจ๋์ ์ ์์ค ๋ชจ๋์ ๊ตฌํ์ ์์กดํด์๋ ์๋๊ณ ์ ์์ค ๋ชจ๋์ ๊ณ ์์ค ๋ชจ๋์์ ์ ์ํ ์ถ์ ํ์ ์ ์์กดํด์ผ ํ๋ค.