๐Ÿ“• [์ž๋ฐ” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด] 5์žฅ. ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ 5์›์น™

๋ฐ•์ƒ๋ฏผยท2024๋…„ 2์›” 29์ผ

Book

๋ชฉ๋ก ๋ณด๊ธฐ
4/22
post-thumbnail

โญ๏ธ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ 5์›์น™

๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ฐœ๋…๊ณผ 4๋Œ€ ํŠน์„ฑ
์•ž์˜ 3๊ฐœ์˜ ์žฅ์„ ํ†ตํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ฐœ๋…๊ณผ 4๋Œ€ ํŠน์„ฑ์„ ํ•™์Šตํ–ˆ๋‹ค. ์ด์ œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ํš๋“ํ•œ ๊ฒƒ์ด๋‹ค.
์š”๋ฆฌ๋กœ ๋น„์œ ํ•˜์ž๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ์˜ 4๋Œ€ ํŠน์„ฑ์€ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ถˆ, ๋ฌผ, ์นผ ๋“ฑ ์ฃผ๋ฐฉ ๊ธฐ๊ตฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ (Object Oriented Design) 5์›์น™

  • SOLID (๊ฐ์ฒด ์ง€ํ–ฅ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•)
    • SRP (Single Responsibility Principle) : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™
    • OCP (Open Closed Princinple) : ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™
    • LSP (Liskov Substitution Principle) : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™
    • ISP (Interface Segregation Principle) : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™
    • DIP (Dependency Inversion Principle) : ์˜์กด ์—ญ์ „ ์›์น™

์ด ์›์น™๋“ค์€ ๊ฐ‘์ž๊ธฐ ์ƒ๊ธด ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์‘์ง‘๋„๋Š” ๋†’์ด๊ณ (High Cohesion), ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์ถ”๋ผ๋Š”(Loose Coupling)๋Š” ๊ณ ์ „ ์›์น™์„ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ด€์ ์—์„œ ์žฌ์ •๋ฆฝํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์œผ๋ฉด ๋ชจ๋“ˆ ๊ฐ„์˜ ์ƒํ˜ธ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ค์–ด ๊ฐ์ฒด์˜ ์žฌ์‚ฌ์šฉ์ด๋‚˜ ์ˆ˜์ •, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  • ์‘์ง‘๋„๊ฐ€ ๋†’์€ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ์ฑ…์ž„์— ์ง‘์ค‘ํ•˜๊ณ  ๋…๋ฆฝ์„ฑ์ด ๋†’์•„์ ธ ์žฌ์‚ฌ์šฉ์ด๋‚˜ ๊ธฐ๋Šฅ์˜ ์ˆ˜์ •, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

๐Ÿ“Œ SRP - ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‚จ์ž๋ผ๊ณ  ํ•˜๋Š” ํด๋ž˜์Šค์™€ ๋‚จ์ž ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด์ž.

๋‚จ์ž๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ๊ณผ ์ฑ…์ž„์„ ๊ฐ€์ง„๋‹ค.

๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์„ธ๊ณ„์—์„œ๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‚˜์œ ๋ƒ„์ƒˆ๊ฐ€ ๋‚œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋‚จ์ž์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ž

๋‚จ์ž๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์—ญํ• ๊ณผ ์ฑ…์ž„์— ๋”ฐ๋ผ ๋„ค ๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ์ชผ๊ฐœ์กŒ๋‹ค. ํด๋ž˜์Šค๋ช… ๋˜ํ•œ ์—ญํ• ๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  • ๋‚จ์ž ์นœ๊ตฌ๋Š” ์—ฌ์ž ์นœ๊ตฌ์™€ ์ด๋ณ„ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ณณ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์€ "์†์„ฑ, ๋ฉ”์„œ๋“œ, ํŒจํ‚ค์ง€, ๋ชจ๋“ˆ, ์ปดํฌ๋„ŒํŠธ, ํ”„๋ ˆ์ž„์›Œํฌ" ๋“ฑ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™์€ ์ž˜๋œ ๊ฒฝ์šฐ๋ณด๋‹ค ์ž˜๋ชป๋œ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ดํ•ดํ•˜๋Š” ๋ฐ ์ข‹๋‹ค.
๋จผ์ € ์†์„ฑ์ด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ง€ํ‚ค์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.
๊ฐ์ฒด ์ง€ํ–ฅ ์„ธ๊ณ„์—์„œ ๋‚จ์ž๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฐ๋Œ€๋ฅผ ๊ฐ€๊ณ , ์—ฌ์ž๋Š” ์ ˆ๋Œ€๋กœ ๊ตฐ๋Œ€๋ฅผ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ๋žŒ ํด๋ž˜์Šค์— ๊ตฐ๋ฒˆ ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

โœ”๏ธŽ ์†์„ฑ์˜ SRP ์œ„๋ฐ˜

public class ์‚ฌ๋žŒ {
	String ๊ตฐ๋ฒˆ;

	public static void main(String[] args) {
		์‚ฌ๋žŒ ๋กœ๋ฏธ์˜ค = new ์‚ฌ๋žŒ();
		์‚ฌ๋žŒ ์ค„๋ฆฌ์—ฃ = new ์‚ฌ๋žŒ();

		์ค„๋ฆฌ์—ฃ.๊ตฐ๋ฒˆ = "11-730411994";
	}
}

์ค„๋ฆฌ์—ฃ์€ ์—ฌ์ž์ด๋ฏ€๋กœ '๊ตฐ๋ฒˆ'์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ค„๋ฆฌ์—ฃ์ด ๊ฐ€์ง„ ๊ตฐ๋ฒˆ ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์ฝ์–ด ๋ณด๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์ œํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ์†์„ฑ ๊ฐœ์„ 
์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‚จ์ž ํด๋ž˜์Šค๋งŒ ๊ตฐ๋ฒˆ์„ ๊ฐ–๊ฒŒ ํ•˜๋ฉด๋œ๋‹ค. ์—ฌ์ž์™€ ๋‚จ์ž์˜ ๊ณตํ†ต์ ๋งŒ ๋ชจ์•„ ์‚ฌ๋žŒ ํด๋ž˜์Šค๋ฅผ ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ณ  ๋‘˜์˜ ๊ณตํ†ต์ ์ด ์—†๋‹ค๋ฉด ๋‚จ์ž ํด๋ž˜์Šค์™€ ์—ฌ์ž ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋‚˜์˜ ์†์„ฑ์ด ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ํ•˜๋‚˜์˜ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋˜๋ฉด ์ •๊ทœํ™”๋ฅผ ํ†ตํ•ด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์œ ์ง€ํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

โœ”๏ธŽ ๋ฉ”์„œ๋“œ์˜ SRP ์œ„๋ฐ˜

public class ๊ฐ•์•„์ง€ {
	final static Boolean ์ˆซ์ปท = true;
	final static Boolean ์•”์ปท = false;
	Boolean ์„ฑ๋ณ„;

	void ์†Œ๋ณ€๋ณด๋‹ค() {
		if (this.์„ฑ๋ณ„ == ์ˆซ์ปท) {
			// ํ•œ์ชฝ ๋‹ค๋ฆฌ๋ฅผ ๋“ค๊ณ  ์†Œ๋ณ€์„ ๋ณธ๋‹ค.
		} else {
			// ๋’ค๋‹ค๋ฆฌ ๋‘ ๊ฐœ๋กœ ์•‰์€ ์ž์„ธ๋กœ ์†Œ๋ณ€์„ ๋ณธ๋‹ค.
		}
	}
}

๊ฐ•์•„์ง€๊ฐ€ "์ˆ˜์ปท"์ธ์ง€ "์•”์ปท"์ธ์ง€์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ์—์„œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค.

์ด๋Š” ๊ฐ•์•„์ง€ ํด๋ž˜์Šค์—์„œ "์†Œ๋ณ€๋ณด๋‹ค"์˜ ์•”์ปท๊ณผ ์ˆ˜์ปท ๊ฐ•์•„์ง€์˜ ํ–‰์œ„๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ง€ํ‚ค์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ƒ„์ƒˆ๊ฐ€ ๋ฐ”๋กœ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ if ๋ฌธ์ด๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ด์•ผ ํ•œ๋‹ค.

๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ

package srp.good;

public abstract class ๊ฐ•์•„์ง€ {
	abstract void ์†Œ๋ณ€๋ณด๋‹ค();
}

public class ์ˆซ์ปท๊ฐ•์•„์ง€ extends ๊ฐ•์•„์ง€ {
	void ์†Œ๋ณ€๋ณด๋‹ค() {
		// ํ•œ์ชฝ ๋‹ค๋ฆฌ๋ฅผ ๋“ค๊ณ  ์†Œ๋ณ€์„ ๋ณธ๋‹ค.
	}
}

public class ์•”์ปท๊ฐ•์•„์ง€ extends ๊ฐ•์•„์ง€ {
	void ์†Œ๋ณ€๋ณด๋‹ค() {
		// ๋’ค๋‹ค๋ฆฌ ๋‘ ๊ฐœ๋กœ ์•‰์€ ์ž์„ธ๋กœ ์†Œ๋ณ€์„ ๋ณธ๋‹ค.
	}
}

์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ–‰์œ„๊ฐ€ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์„ ํ•˜์œ„ ํด๋ž˜์Šค์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค.

  • ์•”์ปท๊ณผ ์ˆ˜์ปท ๊ฐ•์•„์ง€์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ–‰์œ„์˜ ๊ตฌํ˜„์„ ํ•˜์œ„ ํด๋ž˜์Šค์— ๋งก๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ƒ์†์€ "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"์„ ์ง€ํ‚คํ‚ค ์œ„ํ•œ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๋ชจ๋ธ๋ง์„ ๋‹ด๋‹นํ•˜๋Š” "์ถ”์ƒํ™”"๋Š” "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"๊ณผ ๊ฐ€์žฅ ๊ด€๊ณ„๊ฐ€ ๊นŠ๋‹ค.

  • "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒฝ๊ณ„(context)"๋ฅผ ์ •ํ•˜๊ณ  ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ๊ณ ๋ คํ•˜์ž

๐Ÿ“Œ OCP - ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™

์–ด๋А ๋‚  ํ•œ ์šด์ „์ž๊ฐ€ ๋งˆํ‹ฐ์ฆˆ๋ฅผ ๊ตฌ์ž…ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ›—๋‚  ๊ทธ ์šด์ „์ž์—๊ฒŒ ์˜๋‚˜ํƒ€๊ฐ€ ์ƒ๊ฒผ๋‹ค.
๊ธฐ์–ด๊ฐ€ ์ˆ˜๋™์ด๋˜ ๋งˆํ‹ฐ์ฆˆ์—์„œ ๊ธฐ์–ด๊ฐ€ ์ž๋™์ธ ์˜๋‚˜ํƒ€๋กœ ์ฐจ์ข…์„ ๋ฐ”๊พธ๋‹ˆ ์šด์ „์ž์˜ ํ–‰๋™ ๋˜ํ•œ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šด์ „์ž๋Š” ์ฐจ๋Ÿ‰์— ๋”ฐ๋ผ ์šด์ „ํ•˜๋Š” ์Šต๊ด€์„ ๋ฐ”๊ฟ”์•ผํ• ๊นŒ?
ํ˜„์‹ค์ด๋ผ๋ฉด ๋‹น์—ฐํžˆ ์–ด๋А ์ •๋„ ๋ณ€ํ™”๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ธ๊ณ„๋Š” ๋‹ค๋ฅธ ํ•ด๋ฒ•์ด ์žˆ๋‹ค.


์ƒ์œ„ ํด๋ž˜์Šค or ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ค‘๊ฐ„์— ๋‘”๋‹ค.

  • ๋‹ค์–‘ํ•œ ์ž๋™์ฐจ๊ฐ€ ์ƒ๊ธด๋‹ค๊ณ  ํ•ด๋„ ๊ฐ์ฒด์ง€ํ–ฅ์„ธ๊ณ„์˜ "์šด์ „์ž"๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

์šด์ „์ž์˜ ์ž…์žฅ์—์„  ์ฃผ๋ณ€์˜ ๋ณ€ํ™”์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
์ž๋™์ฐจ์˜ ์ž…์žฅ์—์„  ์ž์‹ ์˜ ํ™•์žฅ์— ๊ฐœ๋ฐฉ๋˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. (๋งˆํ‹ฐ์ฆˆ - ์†Œ๋‚˜ํƒ€๋กœ ํ™•์žฅ)

๐Ÿ“Œ LSP - ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

์ƒ์†์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ฉด์„œ ๊ฐ์ฒด ์ง€ํ–ฅ์—์„œ์˜ ์ƒ์†์€ ์กฐ์ง๋„๋‚˜ ๊ณ„์ธต๋„๊ฐ€ ์•„๋‹Œ ๋ถ„๋ฅ˜๋„๊ฐ€ ๋ผ์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค.

๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์„ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค

  • ํ•˜์œ„ ํด๋ž˜์Šค is a kind of ์ƒ์œ„ ํด๋ž˜์Šค - ํ•˜์œ„ ๋ถ„๋ฅ˜๋Š” ์ƒ์œ„ ๋ถ„๋ฅ˜์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค.
  • ๊ตฌํ˜„ ํด๋ž˜์Šค is able to ์ธํ„ฐํŽ˜์ด์Šค - ๊ตฌํ˜„ ๋ถ„๋ฅ˜๋Š” ์ธํ„ฐํŽ˜์ด์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ž˜๋ชป๋œ ์ƒ์† ์˜ˆ์‹œ (๊ณ„์ธต๋„)
์•„๋ฒ„์ง€ - ๋”ธ (๊ธฐ๋ฐ˜ ํƒ€์ž… - ์„œ๋ธŒ ํƒ€์ž…)์€ ๊ณ„์ธต๋„ ํ˜•ํƒœ์˜ ์ž˜๋ชป๋œ ์ƒ์†์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ? ํ•œ๋ฒˆ ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ๋ฒ•์น™์„ ์ ์šฉํ•ด๋ณด์ž.

  • ์•„๋ฒ„์ง€ ์ถ˜ํ–ฅ์ด = new ๋”ธ()

๋”ธ์ด ํƒœ์–ด๋‚˜ ์•„๋ฒ„์ง€์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์€ ๋ง์ด ์•ˆ๋œ๋‹ค.

์ถ˜ํ–ฅ์ด๋Š” ์•„๋ฒ„์ง€ํ˜• ๊ฐ์ฒด ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์•„๋ฒ„์ง€ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ถ˜ํ–ฅ์ด์—๊ฒŒ ์•„๋ฒ„์ง€์˜ ์–ด๋–ค ์—ญํ• ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ?

์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ (๋ถ„๋ฅ˜๋„)

  • ๋™๋ฌผ ๋ฝ€๋กœ๋กœ = new ํŽญ๊ท„()
    ํŽญ๊ท„ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ํƒœ์–ด๋‚˜ ๋™๋ฌผ์˜ ํ–‰์œ„๋ฅผ ํ•œ๋‹ค. ๋…ผ๋ฆฌ์ ์ธ ํ ์ด ์—†๋‹ค. ํŽญ๊ท„ ํ•œ ๋งˆ๋””๊ฐ€ ํƒœ์–ด๋‚˜ ๋ฝ€๋กœ๋กœ๋ผ ์ด๋ฆ„์„ ์ง“๊ณ  ๋™๋ฌผ์˜ ํ–‰์œ„(๋ฉ”์„œ๋“œ)๋ฅผ ํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ ์ „ํ˜€ ์ด์ƒํ•จ์ด ์—†๋‹ค.

์ฆ‰, ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์„ ๋งŒ์กฑํ•œ๋‹ค.

ํ•˜์œ„ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋Š” ์ƒ์œ„ํ˜• ๊ฐ์ฒด ์ฐธ์กฐ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•ด ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—ญํ• ์„ ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.


๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์€ ์ƒ์†์ด๋ผ๋Š” ํŠน์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ISP - ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

SRP์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ ์šฉํ•˜๊ธฐ ์ „ ๋‚จ์ž ํด๋ž˜์Šค๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์•˜๋‹ค.

๋‚จ์ž์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์ด ๋ชฐ๋ ธ๊ธฐ์— ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ ์šฉํ–ˆ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™์—์„œ ์ œ์‹œํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‚จ์ž ํด๋ž˜์Šค๋ฅผ ์ชผ๊ฐœ์„œ ํ•˜๋‚˜์˜ ์—ญํ• (์ฑ…์Œ)๋งŒ ํ•˜๋Š” ๋‹ค์ˆ˜์˜ ์ž‘์€ ํด๋ž˜์Šค๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐฉ๋ฒ•๋ฟ์ผ๊นŒ?

์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•: ISP(์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)

์ด ๋ฐฉ๋ฒ•์€ ๋‚จ์ž ํด๋ž˜์Šค๋ฅผ ์ฑ…์ž„๊ณผ ์—ญํ• ์— ๋”ฐ๋ผ ํด๋ž˜์Šค๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํ•„์š”ํ•œ ์—ญํ• ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ฒฐ๋ก ์ ์œผ๋กœ "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"๊ณผ "์ธํ„ฐํŽ˜์ด์Šค ๋ถ„ํ•  ์›์น™"์€ ๊ฐ™์€ ๋ฌธ์ œ(๋‹ค์ค‘ ์ฑ…์ž„)์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋ถ„ํ•  ์›์น™์€ ์ธํ„ฐํŽ˜์ด์Šค ์ตœ์†Œ์ฃผ์˜ ์›์น™์„ ๊ฐ€์ง„๋‹ค.
์ตœ์†Œ์ฃผ์˜๋ž€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์— ๋ฉ”์„œ๋“œ ์ œ๊ณต์‹œ ์ตœ์†Œํ•œ์˜ ๋ฉ”์„œ๋“œ๋งŒ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค.

์ƒ์œ„ ํด๋ž˜์Šค๋Š” ํ’์„ฑํ• ์ˆ˜๋ก ์ข‹๊ณ  "์ธํ„ฐํŽ˜์ด์Šค"๋Š” ์ž‘์„์ˆ˜๋ก ์ข‹๋‹ค

๋นˆ์•ฝํ•œ ์ƒ์œ„ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜์œ„ํด๋ž˜์Šค์—์„œ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ํ’์„ฑํ•œ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์œผ๋กœ ๊ฐ€์งˆ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†ํ•œ๋‹ค.

๐Ÿ“Œ DIP - ์˜์กด ์—ญ์ „ ์›์น™


์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ž๋™์ฐจ์™€ ์Šค๋…ธ์šฐํƒ€์ด์–ด ์‚ฌ์ด์—๋Š” ์˜์กด ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค. ์ž๋™์ฐจ๊ฐ€ ์Šค๋…ธ์šฐํƒ€์ด์–ด์— ์˜์กดํ•˜๋Š” ๊ด€๊ณ„์ด๋‹ค.

์ž๋™์ฐจ๋Š” 10๋…„์ด์ƒ๋„ ํƒˆ ์ˆ˜ ์žˆ์ง€๋งŒ ์Šค๋…ธ์šฐ ํƒ€์ด์–ด๋Š” ๊ณ„์ ˆ์ด ๋ฐ”๋€Œ๋ฉด ์ผ๋ฐ˜ ํƒ€์ด์–ด๋กœ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ์Šค๋…ธ์šฐํƒ€์ด์–ด๊ฐ€ ์ž๋™์ฐจ๋ณด๋‹ค ์ž์ฃผ ๋ณ€๊ฒฝ๋œ๋‹ค. ์Šค๋…ธ์šฐ ํƒ€์ด์–ด๋ฅผ ์ผ๋ฐ˜ ํƒ€์ด์–ด๋กœ ๊ต์ฒดํ•  ๋•Œ ์ž๋™์ฐจ๋Š” ๊ทธ ์˜ํ–ฅ์— ๋…ธ์ถœ๋ผ ์žˆ๋‹ค.

์ž๋™์ฐจ๋Š” ์ž์‹ ๋ณด๋‹ค ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ํด๋ž˜์Šค์— ์˜์กดํ•ด ๋ถ€์„œ์ง€๊ธฐ ์‰ฝ๊ณ  ๋ƒ„์ƒˆ๋ฅผ ํ’๊ธฐ๋Š” ํด๋ž˜์Šค์ด๋‹ค.


๊ฐœ์„ 

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ž๋™์ฐจ๊ฐ€ ํƒ€์ด์–ด ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ฒŒ ํ•ด๋ณด์ž.

์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ž๋™์ฐจ๋Š” ๊ทธ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

์ด ํ•ด๊ฒฐ์ฑ…์€ ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™(OCP)๋„ ๋…น์•„๋“ค์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ํ•ด๊ฒฐ์ฑ…์— ์—ฌ๋Ÿฌ ์„ค๊ณ„๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์™œ '์˜์กด ์—ญ์ „ ์›์น™'์ด๋ผ๊ณ  ๋ถ€๋ฅผ๊นŒ?
๊ฐœ์„  ์ „ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๊ธฐ์กด์—๋Š” ์Šค๋…ธ์šฐ ํƒ€์ด์–ด๊ฐ€ ๊ทธ ๋ฌด์—‡์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์˜€๋Š”๋ฐ, ๊ฐœ์„ ๋œ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ถ”์ƒ์ ์ธ ๊ฒƒ์ธ ํƒ€์ด์–ด ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ฒŒ ๋๋‹คใ…ฃ. ๋ฐ”๋กœ ์˜์กด์˜ ๋ฐฉํ–ฅ์ด ์—ญ์ „๋œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž๋™์ฐจ๋Š” ์ž์‹ ๋ณด๋‹ค ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด ์Šค๋…ธ์šฐ ํƒ€์ด์–ด์— ์˜์กดํ•˜๋˜ ๊ด€๊ณ„๋ฅผ ์ค‘๊ฐ„์— ์ถ”์ƒํ™”๋œ ํƒ€์ด์–ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ๋‘๊ณ  ์˜์กด ๊ด€๊ณ„๋ฅผ ์—ญ์ „์‹œํ‚ค๊ณ  ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž์‹ ๋ณด๋‹ค ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์— ์˜์กดํ•˜๋˜ ๊ฒƒ์„ ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ๋‘์–ด ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์˜ ๋ณ€ํ™”์— ์˜ํ–ฅ๋ฐ›์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์˜์กด ์—ญ์ „ ์›์น™์ด๋‹ค.


์ถœ์ฒ˜
์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ์ž๋ฐ” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›๋ฆฌ์™€ ์ดํ•ด
https://github.com/expert0226/oopinspring

0๊ฐœ์˜ ๋Œ“๊ธ€