๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/Tech Basics

21์ผ์ฐจ. IT ๊ฐœ๋… ์ •๋ฆฌ

by GreenJin_S2 2025. 11. 6.


**๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)**์—์„œ **“has-a”**์™€ **“is-a”**๋Š” ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ์ž์ฃผ ์“ฐ์ด๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
๋‘ ๊ฐœ๋…์€ ๊ฐ๊ฐ **๊ตฌ์„ฑ(Composition)**๊ณผ **์ƒ์†(Inheritance)**์˜ ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น has-a ๊ด€๊ณ„ (๊ตฌ์„ฑ, Composition)

โœ… ๊ฐœ๋…

  • ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, “A๋Š” B๋ฅผ ๊ฐ€์ง„๋‹ค(has a)” ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ๊ฐ„์˜ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ƒ์†๋ณด๋‹ค ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ

โžก๏ธ ์—ฌ๊ธฐ์„œ Car ํด๋ž˜์Šค๋Š” Engine ๊ฐ์ฒด๋ฅผ ์†์„ฑ์œผ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, **“์ž๋™์ฐจ๋Š” ์—”์ง„์„ ๊ฐ€์ง„๋‹ค(Car has an Engine)”**๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”น is-a ๊ด€๊ณ„ (์ƒ์†, Inheritance)

โœ… ๊ฐœ๋…

  • ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, “A๋Š” B์ด๋‹ค(is a)” ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์† ๊ด€๊ณ„๋Š” ์ผ๋ฐ˜ํ™”-ํŠน์ˆ˜ํ™” ๊ด€๊ณ„(Generalization-Specialization)๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ

 

โžก๏ธ Dog ํด๋ž˜์Šค๋Š” Animal ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์—,
**“๊ฐœ๋Š” ๋™๋ฌผ์ด๋‹ค(Dog is an Animal)”**๋ผ๋Š” ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ” ์ฐจ์ด์  ์ •๋ฆฌํ‘œ

๊ตฌ๋ถ„has-a ๊ด€๊ณ„is-a ๊ด€๊ณ„

 

์˜๋ฏธ ํฌํ•จ(Composition) ์ƒ์†(Inheritance)
๊ด€๊ณ„ ํ‘œํ˜„ A has a B A is a B
๊ตฌ์กฐ ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†
์˜ˆ์‹œ ์ž๋™์ฐจ๋Š” ์—”์ง„์„ ๊ฐ€์ง„๋‹ค ๊ฐœ๋Š” ๋™๋ฌผ์ด๋‹ค
์žฅ์  ์œ ์—ฐํ•˜๊ณ  ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์Œ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•จ
๋‹จ์  ์ฝ”๋“œ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๊ณ  ์œ ์—ฐ์„ฑ์ด ๋‚ฎ์Œ

๐Ÿ’ฌ ํ•ต์‹ฌ ์š”์•ฝ

  • has-a → “์†์„ฑ” ๊ด€๊ณ„ (ํฌํ•จ)
  • is-a → “๊ณ„์ธต” ๊ด€๊ณ„ (์ƒ์†)
  • ๊ถŒ์žฅ ๋ฐฉ์‹: ํ˜„๋Œ€ OOP์—์„œ๋Š” ์ƒ์†๋ณด๋‹ค๋Š” ๊ตฌ์„ฑ(Composition)์„ ์šฐ์„ ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์— ๋” ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ‘‰ “์ƒ์†๋ณด๋‹ค๋Š” ๊ตฌ์„ฑ์„ ์„ ํ˜ธํ•˜๋ผ(Prefer composition over inheritance)”๋Š” ์œ ๋ช…ํ•œ ์›์น™์ž…๋‹ˆ๋‹ค.

 


๐Ÿ”น ์˜์กด๊ด€๊ณ„ (Dependency)

โœ… ๊ฐœ๋…

  • ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ž ๊น ์‚ฌ์šฉํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, **์ผ์‹œ์ ์ธ ๊ด€๊ณ„(temporary relationship)**๋กœ, ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ๊ฐ„์˜ **์•ฝํ•œ ๊ฒฐํ•ฉ(weak coupling)**์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ

 

 

โžก๏ธ Report ํด๋ž˜์Šค๋Š” Printer ๊ฐ์ฒด๋ฅผ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์ž ์‹œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, “๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋ฆฐํ„ฐ๊ฐ€ ์ž ์‹œ ํ•„์š”ํ•˜๋‹ค”๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.
์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ณต์œ ๋˜์ง€ ์•Š๊ณ , ์ž ์‹œ ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ์˜ˆ์š”.


๐Ÿ”น ์—ฐ๊ด€๊ด€๊ณ„ (Association)

โœ… ๊ฐœ๋…

  • ํ•œ ๊ฐ์ฒด๊ฐ€ **๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์†์„ฑ(ํ•„๋“œ)**์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, **์ง€์†์ ์ธ ๊ด€๊ณ„(persistent relationship)**๋กœ, ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ์˜ค๋ž˜ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • **has-a ๊ด€๊ณ„(๊ตฌ์„ฑ)**์˜ ์ผ์ข…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  •  

โžก๏ธ Car ํด๋ž˜์Šค๋Š” Engine ๊ฐ์ฒด๋ฅผ ์†์„ฑ์œผ๋กœ ํ•ญ์ƒ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, “์ž๋™์ฐจ๋Š” ์—”์ง„์„ ๊ฐ€์ง„๋‹ค(Car has an Engine)”์ฒ˜๋Ÿผ ์ง€์†์ ์ธ ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ” ์ฐจ์ด์  ์ •๋ฆฌํ‘œ

๊ตฌ๋ถ„์˜์กด๊ด€๊ณ„(Dependency)์—ฐ๊ด€๊ด€๊ณ„(Association)
๊ด€๊ณ„์˜ ์ง€์†์„ฑ ์ผ์‹œ์  (๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ๋งŒ) ์ง€์†์  (๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ ์œ ์ง€)
์‚ฌ์šฉ ์œ„์น˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ํ•„๋“œ(์†์„ฑ)
๊ฒฐํ•ฉ๋„ ๋‚ฎ์Œ (loosely coupled) ๋น„๊ต์  ๋†’์Œ (strongly coupled)
๋ฐฉํ–ฅ ๋‹จ๋ฐฉํ–ฅ ๋‹จ๋ฐฉํ–ฅ ๋˜๋Š” ์–‘๋ฐฉํ–ฅ ๊ฐ€๋Šฅ
์˜ˆ์‹œ ๋ณด๊ณ ์„œ๊ฐ€ ํ”„๋ฆฐํ„ฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ ์ž๋™์ฐจ๊ฐ€ ์—”์ง„์„ ๊ฐ€์ง

๐Ÿ’ฌ ํ•ต์‹ฌ ์š”์•ฝ

  • ์˜์กด๊ด€๊ณ„ → “์ž ๊น ๋นŒ๋ ค ์“ฐ๋Š” ๊ด€๊ณ„” (๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์‚ฌ์šฉ)
  • ์—ฐ๊ด€๊ด€๊ณ„ → “ํ•ญ์ƒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ด€๊ณ„” (ํ•„๋“œ๋กœ ๋ณด์œ )

๐Ÿ‘‰ ์ฆ‰, ์˜์กด์€ ์ˆœ๊ฐ„์ , ์—ฐ๊ด€์€ ์ง€์†์ ์ž…๋‹ˆ๋‹ค.

 

 


**IoC(Inversion of Control)**์™€ **DI(Dependency Injection)**๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ํŠนํžˆ ์Šคํ”„๋ง(Spring) ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๊ฐœ๋…์ด์ฃ .
๋‘ ์šฉ์–ด๋Š” ๋น„์Šทํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ, ํฌ๊ด„ ๊ด€๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, DI๋Š” IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด์—์š”.


๐Ÿ”น IoC (Inversion of Control, ์ œ์–ด์˜ ์—ญ์ „)

โœ… ๊ฐœ๋…

  • **๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ œ์–ด ๊ถŒํ•œ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€(ํ”„๋ ˆ์ž„์›Œํฌ)**๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
  • ์›๋ž˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ, IoC์—์„œ๋Š” **์ปจํ…Œ์ด๋„ˆ(Spring Container)**๊ฐ€ ๋Œ€์‹  ์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, “๊ฐ์ฒด์˜ ์ œ์–ด ํ๋ฆ„์ด ๋’ค์ง‘ํžŒ๋‹ค”๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ๋น„์œ 

๐Ÿ‘‰ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์š”๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ , ๋ ˆ์‹œํ”ผ๋งŒ ์ „๋‹ฌํ•˜๋ฉด ์ฃผ๋ฐฉ์žฅ์ด ๋Œ€์‹  ์š”๋ฆฌํ•ด์ฃผ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ (IoC ์—†์ด ์ง์ ‘ ์ œ์–ด)

 
class Chef { void cook() { System.out.println("์š”๋ฆฌ ์ค‘..."); } } class Restaurant { Chef chef = new Chef(); // ์ง์ ‘ ์ƒ์„ฑ (์ œ์–ด ์ฃผ์ฒด: Restaurant) void order() { chef.cook(); } }

โžก๏ธ Restaurant์ด Chef ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ์ œ์–ด์˜ ์ฃผ์ฒด๊ฐ€ Restaurant์ž…๋‹ˆ๋‹ค.


๐Ÿ’ป ์˜ˆ์‹œ (IoC ์ ์šฉ)

 
class Chef { void cook() { System.out.println("์š”๋ฆฌ ์ค‘..."); } } class Restaurant { private Chef chef; // ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์Œ Restaurant(Chef chef) { this.chef = chef; } void order() { chef.cook(); } }

โžก๏ธ ์ด์ œ Restaurant์€ Chef๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ๋ฐ›๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ Chef ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ์—ญํ• ์„ **IoC ์ปจํ…Œ์ด๋„ˆ(Spring)**๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ œ์–ด๊ถŒ์ด ์—ญ์ „๋œ ๊ฒƒ์ด IoC์ž…๋‹ˆ๋‹ค.


๐Ÿ”น DI (Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)

โœ… ๊ฐœ๋…

  • IoC์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, “A๊ฐ€ B๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด, A๊ฐ€ ์ง์ ‘ B๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ๋„ฃ์–ด์ค€๋‹ค”๋Š” ๊ฐœ๋…์ด์—์š”.

๐Ÿ’ก DI์˜ ์ฃผ์š” ๋ฐฉ์‹

๋ฐฉ์‹์„ค๋ช…์˜ˆ์‹œ
์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection) ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž… Restaurant(Chef chef)
์„ธํ„ฐ ์ฃผ์ž…(Setter Injection) setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž… setChef(Chef chef)
ํ•„๋“œ ์ฃผ์ž…(Field Injection) @Autowired๋กœ ์ง์ ‘ ํ•„๋“œ์— ์ฃผ์ž… @Autowired private Chef chef;

๐Ÿ” ์ฐจ์ด์  ์ •๋ฆฌํ‘œ

๊ตฌ๋ถ„IoC (์ œ์–ด์˜ ์—ญ์ „)DI (์˜์กด์„ฑ ์ฃผ์ž…)
๊ฐœ๋… ๊ฐ์ฒด์˜ ์ œ์–ด๊ถŒ์„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฒƒ ๊ฐ์ฒด์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ
๋ฒ”์œ„ ๋” ๋„“์€ ๊ฐœ๋… (ํฌ๊ด„์ ) IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•œ ๋ฐฉ๋ฒ•
์—ญํ•  ๊ฐ์ฒด ์ƒ๋ช…์ฃผ๊ธฐ ์ „์ฒด ์ œ์–ด ํ•„์š”ํ•œ ์˜์กด ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐ
์ฃผ์ฒด IoC ์ปจํ…Œ์ด๋„ˆ IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ์ฒด์  ๋™์ž‘
์˜ˆ์‹œ ์Šคํ”„๋ง์ด Bean์„ ์ƒ์„ฑ, ๊ด€๋ฆฌ @Autowired๋กœ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…

๐Ÿ’ฌ ํ•ต์‹ฌ ์š”์•ฝ

  • IoC๋Š” “๊ฐ์ฒด์˜ ์ œ์–ด๊ถŒ์„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ€์ ธ๊ฐ„๋‹ค”๋Š” ํฐ ๊ฐœ๋…
  • DI๋Š” “์˜์กด ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•œ๋‹ค”๋Š” IoC์˜ ๊ตฌํ˜„ ๋ฐฉ์‹

๐Ÿ‘‰ ํ•œ๋งˆ๋””๋กœ ์ •๋ฆฌํ•˜๋ฉด,

“DI๋Š” IoC๋ฅผ ์‹คํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.”