week 1 hyowon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
Java
1. JVM, JDK, JRE๋ ๋ฌด์์ธ๊ฐ?
JDK
Java Development Kit. Java ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๊ณ ์คํ์ํค๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ ํคํธ์ ๋๋ค.
Java๋ก ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํฉ๋๋ค. JDK ์์๋ ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋๋ฐ,
- Development Tools - java ํ๋ก๊ทธ๋จ ๊ฐ๋ฐํ๊ฒฝ์ ์ ๊ณต
- JRE - Java ํ๋ก๊ทธ๋จ ์คํ
JDK ์์ JRE๊ฐ ์กด์ฌํ๊ณ , JRE ์์ JVM์ด ์กด์ฌํฉ๋๋ค.
JRE
Java Runtime Environment. ๋ด ๊ธฐ๊ธฐ์ Java ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์ธ์คํจ ํจํค์ง์ ๋๋ค. ์ผ๋ฐ์ธ๋ค์ด ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ํฌ ๋ ํ์ํฉ๋๋ค.
JVM
Java Virtual machine. JDK, JRE ์ด๋ค ๊ฑธ ์ฌ์ฉํด ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๋์ง JVM์ ์๋ฐํ๋ก๊ทธ๋จ ๋ฑ์ ์ปดํ์ผํ์ฌ ๋ง๋ค์ด์ง ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํด์ฃผ๋ ๊ฐ์๋จธ์ ์ ๋๋ค. JVM ๋๋ถ์ Java๋ ํ๋ซํผ(OS)์ ์ํฅ์ ๋ฐ์ง ์๋ ์ธ์ด์ผ ์ ์์ต๋๋ค.
Java๋ C์ ๋ฌ๋ฆฌ ์ค๊ฐ๊ณผ์ ์ด ํ๋ ๋ ์กด์ฌํ๋๋ฐ, ํด๋์คํ์ผ(๋ฐ์ดํธ์ฝ๋)๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ณผ์ ์ด ๊ทธ๊ฒ์ ๋๋ค. ๋๋ฌธ์ C๋ณด๋ค ํด์ ์๋๊ฐ ๋๋ฆฌ๋, ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด JIT(Just-In-Time)๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. JIT๋ ์์ฃผ ์ฐ์ด๋ ์๋ฐ ์ฝ๋๋ฅผ ์บ์ฑํ ๋ค ์ด๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ ๋๋ฌธ์ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ธ์ด์ธ Java์ ์คํ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
2. ์๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํด ์ค๋ช ํ์์ค
- Class loader : ๋ฐํ์์ ํด๋์ค๋ฅผ ์ฒ์์ผ๋ก ์ฐธ์กฐํ ๋ ํด๋น ํด๋์ค๋ฅผ Runtime Data Areas๋ก ๋ก๋ํ๊ณ ๋งํฌํ๋ค.
- Execution Engine : Load๋ Class๋ฅผ ์คํํ๋ ์์ง์ด๋ค.
- Garbage Collector : ์ฌ์ฉ ๋์ง์๋ ๊ฐ์ฒด๋ฅผ ํด์ ํ์ฌ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- Runtime Data Areas : JVM์ด ์ด์์ฒด์ ์์์ ์คํ ๋๋ฉด์ ํ ๋น๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค.
- Method : ๋ฉ์๋ ์์ญ์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ผ๋ก JVM์ด ์์๋ ๋ ์์ฑ๋๋ค. JVM์ด ์ฝ์ด ๋ค์ธ ๊ฐ๊ฐ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ํ ๋ฐํ์ ์์ ํ, ํ๋์ ๋ฉ์๋ ์ ๋ณด, Static ๋ณ์, ๋ฉ์๋์ ๋ฐ์ดํธ์ฝ๋ ๋ฑ์ ๋ณด๊ดํ๋ค.
- Heap : ์ธ์คํด์ค ๋๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์์ด๋ค. JVM ์ฑ๋ฅ ๋ฑ์ ์ด์์์ ๊ฐ์ฅ ๋ง์ด ์ธ๊ธ๋๋ค.
- Stact :
- JVM ์คํ์ ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํ๋ฉฐ ์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ค. ์คํ ํ๋ ์(Stack Frame)์ด๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ฅํ๋ ์คํ์ผ๋ก, JVM์ ์ค์ง JVM ์คํ์ ์คํ ํ๋ ์์ ์ถ๊ฐํ๊ณ (push) ์ ๊ฑฐํ๋(pop) ๋์๋ง ์ํํ๋ค. ์์ธ ๋ฐ์ ์ printStackTrace() ๋ฑ์ ๋ฉ์๋๋ก ๋ณด์ฌ์ฃผ๋ Stack Trace์ ๊ฐ ๋ผ์ธ์ ํ๋์ ์คํ ํ๋ ์์ ํํํ๋ค.
- Last In First Out (LIFO)
- ๋ฉ์๋ ํธ์ถ ์๋ง๋ค ๊ฐ๊ฐ์ ์คํํ๋ ์์ด ์์ฑ๋๋ค.
- ํธ์ถ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด ๊ฐ ๋ฐ ์ฐ์ฐ ์ ์ผ์ด๋๋ ๊ฐ๋ค์ ์์๋ก ์ ์ฅํ๋ค.
- PC Register : ๋ ์ง์คํฐ๋ ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํ๋ฉฐ ์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ๋๋ค. PC ๋ ์ง์คํฐ๋ ํ์ฌ ์ํ ์ค์ธ JVM ๋ช ๋ น์ ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
- Native : ์๋ฐ ์ธ์ ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ์คํ์ด๋ค. ์ฆ, JNI(Java Native Interface)๋ฅผ ํตํด ํธ์ถํ๋ C/C++ ๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ์คํ์ผ๋ก, ์ธ์ด์ ๋ง๊ฒ C ์คํ์ด๋ C++ ์คํ์ด ์์ฑ๋๋ค.
3. ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์๋ ์๋ฆฌ๋ฅผ ์ค๋ช ํ์์ค
Spring
1. ์คํ๋ง๋ถํธ ์ ์คํ๋ง์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์์ค
2. ์คํ๋ง์ ํน์ง์ ๋ํด์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋น๋์ด ์ค๋ช ํ์์ค
3. ์คํ๋ง์ ์๋น์ค ์ถ์ํ๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค
์ํคํ ์ฒ
1. ๊ฐ์ฒด์งํฅ๊ณผ ์ ์ฐจ์งํฅ์ ์ฐจ์ด์ ๋ํด ์ค๋ช ํ์์ค
์ ์ฐจ์งํฅ์ ์ด๋ค ๋ชฉ์ ์ ์ฝ๋ ์ํ์ ์์ ๊ธฐ๋ฅ์ ์ ์ฐจ(ํ๋ก์์ ) ์ค์ฌ์ผ๋ก ์ํํ๊ณ ๊ฐ์ฒด์งํฅ์ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ฒด์ ๋ถ๋ดํด์ ์ฒ๋ฆฌํ๋ค.
๊ฐ์ฒด์งํฅ๊ณผ ์ ์ฐจ์งํฅ์๋ ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์๋๋ฐ
๊ฐ๋
์ฑ
๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ฉด ๊ธฐ๋ฅ๋ค์ด ๊ฐ ๋ฉ์๋์ ๋ถ๋ฐฐ๋์ด์์ด ๋ฉ์๋๋ฅผ ํ๋ํ๋ ํ๊ณ ๋ค์ด๊ฐ์ผ ํ์ง๋ง
์ ์ฐจ์งํฅ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ฉด ์ฝ๋๊ฐ ํ ๋์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋
์ฑ์ด ๊ฐ์ ์งํฅ๋ณด๋ค ์ข์ ์ ์๋ค.
์ ์ง๋ณด์
๊ทธ๋ฌ๋ ์ ์ง๋ณด์(๋ณ๊ฒฝ,ํ์ฅ) ์ธก๋ฉด์์
๊ธฐ๋ฅ์ด ๋ณ๊ฒฝ๋์์ ๋ ๊ฐ์ฒด์งํฅ์ ํด๋น ๊ธฐ๋ฅ์ ํ๋ ๋ฉ์๋ ํ๋๋ง ์์ ํด ์ฃผ๋ฉด ๋์ง๋ง,
์ ์ฐจ์งํฅ์ ๊ฐ์ฒด๋ง๋ค ๊ธฐ๋ฅ์ ์์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋น์ทํ ์ญํ ์ ํ๋ ์ฝ๋๊ฐ ์ฌ๋ฌ ๊ณณ์ ์ค๋ณต์ผ๋ก ์์ฑ๋์ด์์ ์ ์์ด ๊ด๋ จ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์์ ํด์ค์ผ ํ๊ณ
ํ๋์ ๊ธฐ๋ฅ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ค ๋ค์ด์์ด ์ฝ๋๋ฅผ ์์ ํ ๋ ์ํฅ๋๊ฐ ๊ฐ์ ์นํฅ๋ณด๋ค ๋์ ํธ์ด๋ค.
๋๋ฌธ์ ๊ฐ์ฒด์งํฅ์ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ์ข์ผ๋ฉฐ ์ ์ฐจ์งํฅ์ ์ฝ๋ ๊ฐ๋
์ฑ ์ธก๋ฉด์์ ์ข์ ์ ์๋ค.
๊ฐ์ฒด์งํฅ๊ณผ ์ ์ฐจ์งํฅ์ ์ด๋ค ๊ฒ์ด ๋ ์ข๊ณ ๋์๋ค๊ณ ํ ์ ์๊ณ , ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ
๋ง์ฝ ์ฝ๋๊ฐ ํ ๋ฒ ์์ฑ๋ ํ๋ก ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ฉด ์ ์ฐจ์งํฅ์ ํ๋ก๊ทธ๋๋ฐ์ด ๋ ์ ํฉํ ์ ์๋ค.
๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ์ํํธ์จ์ด๋ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๊ณ ๊ธฐ๋ฅ์ด ํ์ฅ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋ฉ๋ฆฌํธ๊ฐ ์๋ค.
2. SOLID ์์น์ ๋ํด ์๋๋๋ก ์ค๋ช ํ์์ค
SOLID๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์์ ๋ ๊ฐ๋ ์ฑ ๋๊ณ ๊ด๋ฆฌ๋ฅผ ์ ์ฐํ๋๋ก ํ๋ 5๊ฐ์ง ๊ฐ๋ ์ ์ฝ์ด์ ๋๋ค.
SRP (๋จ์ผ์ฑ ์์ ์์น: Single Responsibility Principle)
ํ๋์ ํด๋์ค
๋ ํ๋์ ์ฑ
์
๋ง์ ๊ฐ์ ธ์ผ ํ๋ค.
์ด๋ค ๋ณํ์ ์ํด ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด, ๊ทธ ์ด์ ๋ ์ค์ง ํ๋๋ฟ์ด์ด์ผ ํ๋ฉฐ,
์ด ์๋ฆฌ๊ฐ ์ ์ฉ๋๋ฉด ์ฑ
์ ์์ญ์ด ํ์คํด์ง๊ธฐ ๋๋ฌธ์ ํ ์ฑ
์์ ๋ฐ๊ฟ ๋ ๋ค๋ฅธ ํด๋์ค๋ ๋ฐ๊ฟ์ผํ๋ ์ฐ์์์ฉ์์ ์์ ๋ก์ธ ์ ์์ต๋๋ค.
SRP๋ ๋์ ์์ง๋, ๋ฎ์ ๊ฒฐํฉ๋ ์์น์ ์ค์ํ๊ฒ ํด์ค๋๋ค.
์์ง๋
- ์ํํธ์จ์ด ์ฝ๋์ ํ ์์๊ฐ ๋ค๋ฅธ ๊ฒ๊ณผ ์ผ๋ง๋ ๊ฐ๋ ฅํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง, ๋ํ ์ผ๋ง๋ ์์กด์ ์ธ์ง ๋ํ๋ด๋ ์ ๋
- ๊ฒฐํฉ๋๊ฐ ๋ฎ๋ค๋ ๊ฒ์ ๊ทธ๊ฒ์ด ๋ค๋ฅธ ์์๋ค๊ณผ ๊ด๊ณ๋ฅผ ๊ทธ๋ค์ง ๋งบ์ง ์์ ์ํ๋ฅผ ์๋ฏธ
๊ฒฐํฉ๋
- ํ๋ก๊ทธ๋จ์ ํ ์์๊ฐ ํด๋น ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด ์ผ๋ง๋งํผ์ ์ฐ๊ด๋ ์ฑ ์๊ณผ ์์ด๋์ด๊ฐ ๋ญ์ณ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ ๋
- ์์ง๋๊ฐ ๋๋ค๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ํ ์์๊ฐ ํน์ ๋ชฉ์ ์ ์ํด ๋ฐ์ ํ๊ฒ ์ฐ๊ด๋ ๊ธฐ๋ฅ๋ค์ด ๋ชจ์ฌ์ ๊ตฌํ๋์ด ์๊ณ , ์ง๋์น๊ฒ ๋ง์ ์ผ์ ํ์ง ์๋ ๊ฒ
๋ํ ์ฑ
์์ ์ ์ ํ ๋ถ๋ฐฐํจ์ผ๋ก์ ๊ฐ๋
์ฑ ํฅ์, ์ ์ง๋ณด์์ ์ฉ์ด์ฑ๋ ๋๋ฆด ์ ์์ผ๋ฉฐ
๊ฐ์ฒด์งํฅ ์๋ฆฌ์ ๋์ ์ ๊ฒฉ์ธ OCP์๋ฆฌ ๋ฟ ์๋๋ผ ๋ค๋ฅธ ์๋ฆฌ๋ฅผ ์ ์ฉํ๋ ๊ธฐ์ด๊ฐ ๋ฉ๋๋ค.
ex) ์ฐํ์ด ์์ , ์ฌ๋ฌ ์์ธ์ ์ํ ๋ณ๊ฒฝ
OCP (๊ฐ๋ฐฉํ์ ์์น: Open Close Principle)
์ํํธ์จ์ด์ ๊ตฌ์ฑ์์๊ฐ ํ์ฅ์๋ ์ด๋ ค์๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.
์๊ตฌ์ฌํญ์ ๋ณ๊ฒฝ์ด๋ ์ถ๊ฐ์ฌํญ์ด ๋ฐ์ํ๋๋ผ๋ ๊ธฐ์กด ๊ตฌ์ฑ์์๋ ์์ ์ด ์ผ์ด๋์ง ์๊ณ , ๊ธฐ์กด ๊ตฌ์ฑ์์๋ฅผ ์ฝ๊ฒ ํ์ฅํด์ ์ฌ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๋ ๋ป์
๋๋ค.
OCP๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๋ง๋๋ ๊ธฐ๋ฐ์ด๋ฉฐ, OCP๋ฅผ ๊ฐ๋ฅ์ผ ํ๋ ์ค์ ๋ฉ์ปค๋์ฆ์ ์ถ์ํ์ ๋คํ์ฑ์
๋๋ค.
LSP (๋ฆฌ์ค์ฝ๋ธ ์นํ ์์น: The Liskov Substitution Principle)
์๋ธ ํ์ ์ ์ธ์ ๋ ๊ธฐ๋ฐ ํ์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ด์ผ ํ๋ค
- ํ์ํด๋์ค is kind of ์์ํด๋์ค
- ๊ตฌํํด๋์ค is able to ์ธํฐํ์ด์ค
์์์ ์กฐ์ง๋๋ ๊ณ์ธต๋๊ฐ ์๋ ๋ถ๋ฅ๋๊ฐ ๋์ด์ผ ํ๋ค.
- class ๋ธ extends ์๋ฒ์ง โ X, ๋ธ์ด ์๋ฒ์ง์ ํ ์ข ๋ฅ?
class ํญ๊ท extends ์กฐ๋ฅโ O. ์์ ์์ฝ์ด๋ถํฐ extend, ์ฆ ๊ณ์ธต์ด ์๋ ํ์ฅ์ ๊ฐ๋
class ํญ๊ท implements ๋ ์์๋ ์กฐ๋ฅ. (์กฐ๋ฅ๋ ๋ถ๋ฅ์ด๋ฏ๋ก ์์์ ์๋๋ฏ)
ISP (์ธํฐํ์ด์ค ๋ถ๋ฆฌ์ ์์น: Interface Segregation Principle)
์์ ์ด ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค๋ ๊ตฌํํ์ง ๋ง์์ผ ํ๋ค ๋ ์๋ฆฌ์ ๋๋ค.
- ์ด๋ค ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ์ข ์๋ ๋์๋ ๊ฐ๋ฅํ ์ต์ํ์ ์ธํฐํ์ด์ค๋ง์ ์ฌ์ฉ
- ํ๋์ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค๋ณด๋ค๋, ์ฌ๋ฌ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ธํฐํ์ด์ค๊ฐ ๋ซ๋ค.
โ (๋น๊ต) SRP๊ฐ ํด๋์ค์ ๋จ์ผ์ฑ
์ ์ ๊ฐ์กฐํ๋ค๋ฉด ISP๋ ์ธํฐํ์ด์ค์ ๋จ์ผ ์ฑ
์ ์ ๊ฐ์กฐํฉ๋๋ค.
๋ณํ์์ ์ ์์ฑ์ด๋ผ๋ ๊ฐ์ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ , SRP๋ ํด๋์ค ๋ถ๋ฆฌ๋ฅผ ํตํด, ISP๋ ์ธํฐํ์ด์ค ๋ถ๋ฆฌ๋ฅผ ํตํด ๋ชฉํ๋ฅผ ์ด๋ฃน๋๋ค.
DIP (์์กด์ฑ์ญ์ ์ ์์น: Dependency Inversion Principle)
์์ ๋ณด๋ค ๋ณํ๊ธฐ ์ฌ์ด ๊ฒ์ ์์กดํ์ง ๋ง๋ผ ๋ ์๋ฆฌ์ ๋๋ค.
- [DIP๊ฐ ์ ์ฉ๋์ง ์์ ์] ์๋์ฐจ โ ์ค๋ ธ์ฐํ์ด์ด
- [DIP๊ฐ ์ ์ฉ๋ ์] (Interface) ํ์ด์ด โ(์์)- ์ค๋ ธ์ฐํ์ด์ด, ์ผ๋ฐํ์ด์ด, ๊ดํญํ์ด์ด
3. ์บก์ํ์ ๋ํด ์ค๋ช ํ์์ค
- ๊ฐ์ฒด์ ํ๋์ ๋ฉ์๋๋ฅผ ํ๋๋ก ๋ฌถ๊ณ
- ์ค์ ๊ตฌํ ๋ด์ฉ ์ผ๋ถ๋ฅผ ์ธ๋ถ์ ๊ฐ์ถ์ด ์๋ํ๋ค
์บก์ํ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํจ์ ์์ด ๊ทธ ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ง์ ์๊ณ ์ฌ์ฉํ ๋ฟ ๋ด๋ถ ์๋์ ์ ํ์๊ฐ ์๊ฒ ํฉ๋๋ค. ์ด๋ฌํ ํน์ฑ์ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํจ์ ์์ด ๊ฑด๋๋ฆด ํ์ ์๋ ๋ถ๋ถ์ ์ ๊ทผ์ ๋ง์(private) ๊ฐ์ฒด์ ์ค์ฉ์ ๋ฐฉ์ง ํด์ค๋๋ค. ๋ฉ์๋์ ๋ด๋ถ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ณณ์ ์ํฅ์ ์ต์ํํ ์ ์์ต๋๋ค.
์บก์ํ์ ๋ ๊ฐ์ง ๊ท์น
-
Tell, Don't Ask
- ๋ฐ์ดํฐ๋ฅผ ๋ฌผ์ด๋ณด์ง ์๊ณ , ๊ธฐ๋ฅ์ ์คํํด ๋ฌ๋ผ๊ณ ๋งํ๋ ๊ท์น
-
๋ฐ๋ฏธํ ๋ฅด์ ๋ฒ์น
- (ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ )๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ง ์๋๋ก ํ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ผ๋ ๊ฒ์ด๋ค.
- ๋ฉ์๋์์ ์์ฑํ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถ
- ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถ
- ํ๋๋ก ์ฐธ์กฐํ๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถ
๋ฐ๋ฏธํ ๋ฅด์ ๋ฒ์น์ ์๋ฐํ ์
customer.getWallet().getMoney();
- ๋ ๋์ค๋ฅผ ๋ค์ด๊ฐ๊ฒ๋๋ฉด ๋ด๋ถ ๋ณ๊ฒฝ์ด ์ฝ์ง ์์. 1๋์ค๋ง ๋ค์ด๊ฐ์ผ ํจ.
- get๋ฉ์๋์ ์ฐ์๋ ํธ์ถ์ด ์ผ์ด๋๋ค๋ฉด ๋ฐ๋ฏธํ ๋ฅด์ ๋ฒ์น์ ์๋ฐํ๋์ง ์์ฌํด ๋ด์ผ ํฉ๋๋ค.
์ณ์ ์
customer.getMoney();
- ๋ฉ์๋ ๋ด๋ถ์ ์ผ๋ก ๊ณ ๊ฐ์ ๋์ ์ฐจ๊ฐ.
์ถ์ํ์ ๋ค๋ฅธ์ ?
์ถ์ํ๋ ์ํ๋ ๊ธฐ๋ฅ๊ตฌํ์ ํ์์๋๊ฒ๋ค์ ์๋ตํ๊ณ ํ์ํ ๋ถ๋ถ๋ง์ ๋ํ๋ด๋ ๊ฒ์ด๊ณ ์บก์ํ๋ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ํ ๊ณณ์ผ๋ก ๋ชจ์ผ๋ ๊ฒ
๊ทธ ์ค ํด๋์ค์ ์์ฑ๋ค์ ๋ฐ์์ ํจ๋ถ๋ก ๊ฑด๋๋ฆด ์ ์๋๋ก private ์์ฝ์ด๋ฅผ ๋ถ์ฌ ํด๋์ค ๋ฐ์์ ํจ๋ถ๋ก ๊ฑด๋๋ฆด ์ ์๋๋ก ํ๋๋ฐ ์ด๋ ๋ฐ์ดํฐ ์๋(data hiding)๊ณผ ์ ์ฌํ ์ง์ ์ด ์์ต๋๋ค.
๋ฐ์ดํฐ ์๋ vs ์บก์ํ
๋ฐ์ดํฐ ์๋(data hiding)์ ๋ณด์์ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ์ธ๊ฐ๋์ง ์์ ์ ๊ทผ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฐ๋ ์ผ๋ก ๋ณด์์ ์ธก๋ฉด์ ๋ ์ค์ ์ ๋๋ค๋ฉด, ์บก์ํ๋ ๋ณต์กํ ๋ก์ง ๋ด๋ถ๋ฅผ ์จ๊ธฐ๋ ๊ฒ์ ๋ ์ค์ ์ ๋๊ฒ ๋ฉ๋๋ค.
์ฐธ์กฐ
SOLID http://www.nextree.co.kr/p6960/
https://techdifferences.com/difference-between-oop-and-pop.html
http://www.nextree.co.kr/p6960/
์คํ๋ง ์ ๋ฌธ์ ์ํ ์๋ฐ ๊ฐ์ฒด์งํฅ์ ์๋ฆฌ์ ์ดํด
https://jjhwqqq.tistory.com/32
๋๋ฏธํฐ์ ๋ฒ์น
https://johngrib.github.io/wiki/law-of-demeter/