๐Ÿ“ ๋””์ž์ธ ํŒจํ„ด # 1 : ์‹ฑ๊ธ€ํ„ด, ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด ๐Ÿ“

bo-yoonยท2021๋…„ 7์›” 4์ผ
0

designpattern

๋ชฉ๋ก ๋ณด๊ธฐ
1/2

๐Ÿ˜ฝ ์ฐธ๊ณ  ๐Ÿ˜ฝ

headfirst designPattern ์„ ์ฐธ๊ณ ํ•˜๊ณ  ํ•™์Šตํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๋ธ”๋กœ๊ทธ & ๊นƒํ—™์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

gmlwjd9405.github.io

OmarElGabry/DesignPatterns

quanke/design-pattern-java-source-code

yaboong.github.io



๐Ÿ˜ผ ์†Œ์Šค ์ฝ”๋“œ ๐Ÿ˜ผ

https://github.com/bo-yoon/DesignPattern



๐Ÿ˜ผ ๋””์ž์ธ ์›์น™ ๐Ÿ˜บ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋‚ด๊ณ , ๋‹ฌ๋ผ์ง€์ง€ ์•Š์€ ๋ถ€๋ถ„์œผ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ ์‹œํ‚จ๋‹ค.
    • ์ฆ‰, ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ๋ฝ‘์•„์„œ ์บก์Šํ™”์‹œํ‚จ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚˜์ค‘์— ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ถ€๋ถ„์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ์ฑ„๋กœ ๊ทธ ๋ถ€๋ถ„๋งŒ ๊ณ ์น˜๊ฑฐ๋‚˜ ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ตฌํ˜„์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค.
    • ์ƒ์œ„ํ˜•์‹์— ๋งž์ถฐ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•จ.
  • ์ƒ์†๋ณด๋‹ค๋Š” ๊ตฌ์„ฑ์„ ํ™œ์šฉํ•œ๋‹ค.
    • A์—๋Š” B๊ฐ€์žˆ๋‹ค
  • ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋Š” ๊ฐ์ฒด ์‚ฌ์ด์—๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๋Š” ๋””์ž์ธ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
  • ํด๋ž˜์Šค๋Š” ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ์—ด๋ ค์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ถ”์ƒํ™”๋œ ๊ฒƒ์— ์˜์กดํ•˜๋„๋ก ๋งŒ๋“ค์–ด๋ผ ๊ตฌ์ƒ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋„๋ก ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • ์ตœ์†Œ ์ง€์‹ ์›์น™ - ์ •๋ง ์นœํ•œ ์นœ๊ตฌํ•˜๊ณ ๋งŒ ์ด์•ผ๊ธฐ ํ•ด๋ผ
  • ํ• ๋ฆฌ์šฐ๋“œ ์›์น™ : ๋จผ์ € ์—ฐ๋ฝํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €ํฌ๊ฐ€ ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
    • ์˜์กด์„ฑ ๋ถ€ํŒจ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ผ ์—ญํ•  ์›์น™ = ํด๋ž˜์Šค๋ฅผ ๋ฐ”๊พธ๋Š” ์ด์œ ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฟ์ด์–ด์•ผ ํ•œ๋‹ค.


โšพ๏ธ ์žฅ์  โšพ๏ธ

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


โšฝ๏ธ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด(์ƒ์„ฑ ํŒจํ„ด) โšฝ๏ธ

  • ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์ง€๊ณ , ์–ด๋””์„œ๋“ ์ง€ ๊ทธ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด
  • ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋ฉฐ, ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์–ด๋””์„œ๋“ ์ง€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํŒจํ„ด
  • ๋ฌด์–ธ๊ฐ€ ํ•˜๋‚˜์˜ ์ž์›์„ ์—ฌ๋Ÿฌ ๋ช… ์ด์„œ ๊ณต์œ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.
    ๊ณต์œ ์˜ ๋‹จ์ ์€ thread safe ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค.
    ์ฆ‰, ์ž‘์—… ๋„์ค‘์— ๋ผ์–ด ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์œ„ํ‚ค๋ฐฑ๊ณผ ์ถœ์ฒ˜

ํ•ด๊ฒฐ์ฑ…

  • ์ •์  ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ”๋กœ ๊ฐ์ฒด ํ• ๋‹นํ•ด ์ดˆ๊ธฐํ™”(Eager)
  • ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋™๊ธฐํ™” ํ•˜๊ธฐ(synchronized)


โšพ๏ธ ์ผ๋ฐ˜ ์‹ฑ๊ธ€ํ„ด โšพ๏ธ


package singleton;

public class Refrigerator {
	// ๋ƒ‰์žฅ๊ณ ๋Š” ๊ณตํ†ต ์ž์›	
    private static Refrigerator ref = null;
    
    private Refrigerator() {}  // ์ƒ์„ฑ์ž๊ฐ€	 private
    
    public static Refrigerator getInstance() {
    	if(ref == null) {
    			ref = new Refrigerator();
    	}
    	return ref;
    }
    
	public void display() {
		System.out.println("๋ƒ‰์žฅ๊ณ  ๊ณต์œ ");
		
	}
}


โšพ๏ธ ์ดˆ๊ธฐํ™”(Eager) โšพ๏ธ


package singleton;

public class EagerRefrigerator {
	// ๋ƒ‰์žฅ๊ณ ๋Š” ๊ณตํ†ต ์ž์›	
    private static EagerRefrigerator ref = new EagerRefrigerator();
    
    private EagerRefrigerator() {}  // ์ƒ์„ฑ์ž๊ฐ€	 private
    
    public static EagerRefrigerator getInstance() {

    	return ref;
    }
    
    public void display() {
    	System.out.println("Eager ๋ƒ‰์žฅ๊ณ  ๊ณต์œ ");
  
    }
}


โšพ๏ธ ๋™๊ธฐํ™” โšพ๏ธ

package singleton;

public class SyncRefrigerator {
	// ๋ƒ‰์žฅ๊ณ ๋Š” ๊ณตํ†ต ์ž์›	
    private static SyncRefrigerator ref = null;
    
    private SyncRefrigerator() {}  // ์ƒ์„ฑ์ž๊ฐ€	 private
    
    public synchronized static SyncRefrigerator getInstance() {
    	if(ref == null) {
    			ref = new SyncRefrigerator();
    	}
    	return ref;
    }
    
    public void display() {
    	System.out.println("Sync ๋ƒ‰์žฅ๊ณ  ๊ณต์œ ");
  
    }
}



โšฝ๏ธ Strategy ํŒจํ„ด (ํ–‰์œ„ ํŒจํ„ด) โšฝ๏ธ


  • ์ƒ์œ„ ๋ถ„๋ฅ˜์— ํ•ด๋‹น๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค, ํ˜น์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ๊ฒƒ์„ ์ƒ์† ๋ฐ›์•„ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ์„ ์–ธ์‹œ ์›ํ•˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๊ฐ์ฒด์— ํ• ๋‹นํ•ด์ฃผ์–ด์„œ ํ•˜์œ„ ํด๋ž˜์Šค์— ์ •์˜๋œ ํ–‰์œ„๋ฅผ ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ด ์›๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰ ์ค‘์— ์–ธ์ œ๋“  ํ–‰์œ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์„ ์–ธ๋œ User๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋„์ค‘ ์–ธ์ œ๋“  ์ผ€๋ฆฌ๋น„์•ˆ ๋ฒ ์ด๋ฅผ ๊ฐ€๊ฑฐ๋‚˜ ์‹ค๋‚ด ์ฑ„์œก๊ด€์„ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ํ–‰์œ„๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ”๊พธ๊ฒŒ ํ•ด์ค€๋‹ค.


๊ทธ๋ฆผ ์ถœ์ฒ˜

๋‹จ์  : ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ ๋ฐœ์ƒ




package strategy;

public interface Exercise {
	
	public void acting(int hours);
}

package strategy;

public class Climbing implements Exercise {
	
	private String place; // ์žฅ์†Œ
	
	public Climbing(String place) {
		this.place = place;
	}
	
	@Override
	public void acting(int hours) {
		System.out.println(place + "์—์„œ " +hours + "์‹œ๊ฐ„ ๋™์•ˆ ํด๋ผ์ด๋ฐํ•จ "  );
	}
	
}
package strategy;

public class Swimming implements Exercise {
	
	private String place;
	private String things;
	
	public Swimming(String place, String things) {
		this.place = place;
		this.things = things;
	}
	
	@Override
	public void acting(int hours) {
		System.out.println(hours +"์‹œ๊ฐ„ ๋™์•ˆ " + place + "์—์„œ " +things +
				"์„ ๊ฐ€์ง€๊ณ  ์ˆ˜์˜");
	}
}

package strategy;

public class Swimming implements Exercise {
	
	private String place;
	private String things;
	
	public Swimming(String place, String things) {
		this.place = place;
		this.things = things;
	}
	
	@Override
	public void acting(int hours) {
		System.out.println(hours +"์‹œ๊ฐ„ ๋™์•ˆ " + place + "์—์„œ " +things +
				"์„ ๊ฐ€์ง€๊ณ  ์ˆ˜์˜");
	}
}

package strategy;

public class Child extends User {
	
	@Override
	public void display() {
		System.out.println("๋‚˜๋Š” ์–ด๋ฆฐ์ด");
	}
}
package strategy;

public class Player extends User{
	
	@Override
	public void display() {
		System.out.println("๋‚˜๋Š” ์ˆ˜์˜์„ ์ˆ˜!");
	}


}
package strategy;

public class Main {

	public static void main(String [] args) {
		
		User user = new Child(); // ํ•™์ƒ ์‚ฌ์šฉ์ž ์„ ์–ธ
		
		user.display();
		
		user.setExercise(new Swimming("์ผ€๋ฆฌ๋น„์•ˆ๋ฒ ์ด","ํŠœ๋ธŒ"));
		user.doAct(5);
		
		user.setExercise(new Climbing("์‹ค๋‚ด ์ฒด์œก๊ด€"));
		user.doAct(2);
		
	}
}
profile
๊ฐœ๋ฐœ ๋กœ๊ทธ ๐ŸŽ ๐ŸŽ ๐ŸŽ

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