๋ฐฑ์—”๋“œ(Back-End) ๊ฐœ๋ฐœ/Java

์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€? (๋‹คํ˜•์„ฑ.. SOLID ์›์น™..)

rabo93 2025. 2. 19. 11:16
๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค!

 

* ์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ(Polymorphism)

- ์—ญํ• ๊ณผ ๊ตฌํ˜„์œผ๋กœ ๊ตฌ๋ถ„ํ•ด๋ณด์ž

ex) ์šด์ „์ž - ์ž๋™์ฐจ

์šด์ „์ž๋Š” ์ž๋™์ฐจ์˜ ์ข…๋ฅ˜๊ฐ€ ๋ฐ”๊ปด๋„ ์šด์ „์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋™์ฐจ์˜ ์ž์„ธํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ผ๋˜์ง€.. ์ด๋Ÿฐ๊ฑด ์‹ ๊ฒฝ ์•ˆ์จ๋„ ๋œ๋‹ค!




์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ?

- ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ์˜ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.

- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.

- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 


- ์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉ

   - ์—ญํ•  = ์ธํ„ฐํŽ˜์ด์Šค

   - ๊ตฌํ˜„ = ์ธํ„ฐํŽ˜์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, ๊ตฌํ˜„ ๊ฐ์ฒด

- ๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ

- ๊ฐ์ฒด ์„ค๊ณ„์‹œ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์„ ๋จผ์ € ๋ถ€์—ฌํ•˜๊ณ , ๊ทธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

 


๊ฐ์ฒด์˜ ํ˜‘๋ ฅ์ด๋ผ๋Š” ๊ด€๊ณ„๋ถ€ํ„ฐ ์ƒ๊ฐ

- ํ˜ผ์ž ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์—†๋‹ค.

- ํด๋ผ์ด์–ธํŠธ : ์š”์ฒญ,  ์„œ๋ฒ„ : ์‘๋‹ต

- ์ˆ˜๋งŽ์€ ๊ฐ์ฒด ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ์ฒด ์„œ๋ฒ„๋Š” ์„œ๋กœ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค

 


๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ!!

- ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค

 


** ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ ์ •๋ฆฌ

- ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ด

- ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„

- ํด๋ผ์ด์–ธํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

- ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”!!

 


์Šคํ”„๋ง๊ณผ ๊ฐ์ฒด ์ง€ํ–ฅ

- ๋‹คํ˜•์„ฑ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค!

- ์Šคํ”„๋ง์€ ๋‹คํ˜•์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ด์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค

- ์Šคํ”„๋ง์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์ œ์–ด์˜ ์—ญ์ „(IOC), ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI)์€ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด์„œ ์—ญํ•  ๊ตฌํ˜„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

- ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋Ÿญ ์กฐ๋ฆฝํ•˜๋“ฏ์ด, ๊ณต์—ฐ ๋ฌด๋Œ€์˜ ๋ฐฐ์šฐ๋ฅผ ์„ ํƒํ•˜๋“ฏ์ด, ๊ตฌํ˜„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค

 


์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ (SOLID) ******

 

  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single ์–ด์ฉŒ๊ณ  ์ €์ฉŒ๊ณ ..)

๋ชจ๋“  ํด๋ž˜์Šค ์ฆ‰, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„(๊ธฐ๋Šฅ)๋งŒ ๊ฐ€์ง„๋‹ค!

์˜ˆ) ์ž๋™์ฐจ(ํด๋ž˜์Šค) -----> ์‹œํŠธ, ์—”์ง„,..........๋“ฑ๋“ฑ ์—„์ฒญ๋‚œ ์„ธ๋ถ€ ๊ธฐ๋Šฅ์ด ๋งŽ์€๋ฐ, ์ด๊ฑธ ์ž๋™์ฐจ์˜ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๋‹ค ๋„ฃ์ง€๋ง๊ณ , ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•˜์—ฌ ์˜์กด๊ด€๊ณ„๋กœ ์ •์˜ํ•  ๊ฒƒ! 

 

  • ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(Open/Closed ์–ด์ฉŒ๊ณ  ์ €์ฉŒ๊ณ )

ํด๋ž˜์Šค๊ฐ€ ํ™•์žฅ์—๋Š” ๊ฐœ๋ฐฉ๋˜์–ด์žˆ๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผํ•œ๋‹ค!

์ฆ‰, ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.

ํด๋ž˜์Šค ์ƒ์„ฑํ• ๋•Œ ์ƒ์†์„ ๋ฐ›์•„์„œ ๊ธฐ์กด ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ!

public class Calculator {
	
	//์‚ฌ๊ฐํ˜• ๋„“์ด ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
	public float RectangleArea(Rectangle rectangle) {
		return rectangle.width * rectangle.height;
	}
	
	//์› ๋„“์ด ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
	public float CircleArea(Circle circle) {
		return circle.width * circle.height;
	}
	
	//์˜ค๊ฐํ˜• ๋„“์ด ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜..
	//๋„ํ˜• ์ถ”๊ฐ€๋ ๋•Œ๋งˆ๋‹ค Calculator ํด๋ž˜์Šค๊ฐ€ ์ˆ˜์ •๋˜์–ด Calculator๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค!
	
}

 

๊ฐœ๋ฐฉ ํ์‡„ ์›์น™์„ ๋”ฐ๋ฅธ ์ฝ”๋“œ

public abstract class Shape { // Shape ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ
	public abstract float CalculateArea(); // ๋„“์ด ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ ๋‹ค
}

public class Rectangle extends Shape { // Shape ์ƒ์†๋ฐ›์€ ์‚ฌ๊ฐํ˜• ํด๋ž˜์Šค ๋”ฐ๋กœ ๋นผ๊ธฐ
	public float width;
	public float height;
	
	@Override
	public float CalculateArea() { //๋„“์ด๋Š” ๋”ฐ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ตฌํ˜„ (์ด๋ ‡๊ฒŒ ํ•ด์•ผ ๋„ํ˜•์ด ์ถ”๊ฐ€๋˜์–ด๋„ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค)
		return width * height;
	}
}
public class Circle extends Shape { // Shape ์ƒ์† ๋ฐ›๊ธฐ
	public float radius;
	
	@Override
	public float CalculateArea() { 
		return radius * radius * 3.14;
	}
}

 

  • ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™(Liscope ์–ด์ฉŒ๊ณ  ์ €์ €๊ณ )

์ƒ์œ„ ํƒ€์ž…์„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€, ์ด๊ฑฐ๋ฅผ ์ƒ์†๋ฐ›์€ ํ•˜์œ„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ์„ ํ•ด๋„ ์ •์ƒ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค!

 

  • ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(Interface ์–ด์ฉŒ๊ณ  ์ €์ฉŒ๊ณ )

ํ•˜๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค! 

 

  • ์˜์กด ์—ญ์ „ ์›์น™(Dependency Inversion ์–ด์ฉŒ๊ณ  ์ €์ฉŒ๊ณ )

์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ์„๋•Œ ์ข€๋” ์ผ๋ฐ˜์ ์ด๊ณ  ์ถ”์ƒ์ ์ธ๊ฒƒ์— ์˜์กดํ•ด์•ผํ•œ๋‹ค!

์ฆ‰, ํ•˜์œ„ ๊ฐœ๋…์ด ์•„๋‹ˆ๊ณ  ์ข€ ๋” ์ƒ์œ„๊ฐœ๋…, ์ถ”์ƒํ™”๋œ๊ฒƒ์„ ์˜์กดํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค!