쒋은 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€? (λ‹€ν˜•μ„±.. SOLID 원칙..)
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 μ–΄μ©Œκ³  μ €μ©Œκ³ )

μ˜μ‘΄κ΄€κ³„λ₯Ό λ§Ίμ„λ•Œ 쒀더 일반적이고 좔상적인것에 μ˜μ‘΄ν•΄μ•Όν•œλ‹€!

즉, ν•˜μœ„ κ°œλ…μ΄ μ•„λ‹ˆκ³  μ’€ 더 μƒμœ„κ°œλ…, μΆ”μƒν™”λœκ²ƒμ„ μ˜μ‘΄ν•˜λŠ”κ²ƒμ΄ μ’‹λ‹€!