week 1 hyowon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

Java

1. JVM, JDK, JRE๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

JDK

Java Development Kit. Java ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹คํ–‰์‹œํ‚ค๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ํ‚คํŠธ์ž…๋‹ˆ๋‹ค.

Java๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JDK ์•ˆ์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ,

  1. Development Tools - java ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์ œ๊ณต
  2. 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์ด ์šด์˜์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰ ๋˜๋ฉด์„œ ํ• ๋‹น๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

  1. Method : ๋ฉ”์„œ๋“œ ์˜์—ญ์€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์œผ๋กœ JVM์ด ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค. JVM์ด ์ฝ์–ด ๋“ค์ธ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€, ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ ์ •๋ณด, Static ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋“ฑ์„ ๋ณด๊ด€ํ•œ๋‹ค.
  2. Heap : ์ธ์Šคํ„ด์Šค ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์ด๋‹ค. JVM ์„ฑ๋Šฅ ๋“ฑ์˜ ์ด์Šˆ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰๋œ๋‹ค.
  3. Stact :
    • JVM ์Šคํƒ์€ ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค. ์Šคํƒ ํ”„๋ ˆ์ž„(Stack Frame)์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ์Šคํƒ์œผ๋กœ, JVM์€ ์˜ค์ง JVM ์Šคํƒ์— ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ถ”๊ฐ€ํ•˜๊ณ (push) ์ œ๊ฑฐํ•˜๋Š”(pop) ๋™์ž‘๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ printStackTrace() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋กœ ๋ณด์—ฌ์ฃผ๋Š” Stack Trace์˜ ๊ฐ ๋ผ์ธ์€ ํ•˜๋‚˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ํ‘œํ˜„ํ•œ๋‹ค.
    • Last In First Out (LIFO)
    • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๊ฐ๊ฐ์˜ ์Šคํƒํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋œ๋‹ค.
    • ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋ฐ ์—ฐ์‚ฐ ์‹œ ์ผ์–ด๋‚˜๋Š” ๊ฐ’๋“ค์„ ์ž„์‹œ๋กœ ์ €์žฅํ•œ๋‹ค.
  4. PC Register : ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค. PC ๋ ˆ์ง€์Šคํ„ฐ๋Š” ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ JVM ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
  5. 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) ๊ฐ์ฒด์˜ ์˜ค์šฉ์„ ๋ฐฉ์ง€ ํ•ด์ค๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์˜ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บก์Šํ™”์˜ ๋‘ ๊ฐ€์ง€ ๊ทœ์น™

  1. Tell, Don't Ask

    • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌผ์–ด๋ณด์ง€ ์•Š๊ณ , ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ด ๋‹ฌ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ทœ์น™
  2. ๋ฐ๋ฏธํ…Œ๋ฅด์˜ ๋ฒ•์น™

    • (ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ )๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š๋„๋ก ํ˜‘๋ ฅ ๊ฒฝ๋กœ๋ฅผ ์ œํ•œํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋ฉ”์„œ๋“œ์—์„œ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœ
    • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœ
    • ํ•„๋“œ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœ

๋ฐ๋ฏธํ…Œ๋ฅด์˜ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•œ ์˜ˆ

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/