๐ ๋์์ธ ํจํด # 1 : ์ฑ๊ธํด, ์คํธ๋ํฐ์ง ํจํด ๐
23272 ๋จ์ด DesignPatternDesignPattern
๐ฝ ์ฐธ๊ณ ๐ฝ
headfirst designPattern ์ ์ฐธ๊ณ ํ๊ณ ํ์ตํ์์ต๋๋ค.
์๋ ๋ธ๋ก๊ทธ & ๊นํ์ ์ฐธ๊ณ ํ์์ต๋๋ค.
quanke/design-pattern-java-source-code
๐ผ ์์ค ์ฝ๋ ๐ผ
https://github.com/bo-yoon/DesignPattern
๐ผ ๋์์ธ ์์น ๐บ
- ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ ์ฐพ์ ๋ด๊ณ , ๋ฌ๋ผ์ง์ง ์์ ๋ถ๋ถ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌ ์ํจ๋ค.
- ์ฆ, ๋ฐ๋๋ ๋ถ๋ถ์ ๋ฐ๋ก ๋ฝ์์ ์บก์ํ์ํจ๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋์ค์ ๋ฐ๋์ง ์๋ ๋ถ๋ถ์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋ ์ฑ๋ก ๊ทธ ๋ถ๋ถ๋ง ๊ณ ์น๊ฑฐ๋ ํ์ฅ ํ ์ ์๋ค.
- ๊ตฌํ์ด ์๋ ์ธํฐํ์ด์ค์ ๋ง์ถฐ์ ํ๋ก๊ทธ๋๋ฐํ๋ค.
- ์์ํ์์ ๋ง์ถฐ์ ํ๋ก๊ทธ๋๋ฐํ๋ค๋ ๊ฒ์ ๋งํจ.
- ์์๋ณด๋ค๋ ๊ตฌ์ฑ์ ํ์ฉํ๋ค.
- A์๋ B๊ฐ์๋ค
- ์๋ก ์ํธ์์ฉ์ ํ๋ ๊ฐ์ฒด ์ฌ์ด์๋ ๊ฐ๋ฅํ๋ฉด ๋์จํ๊ฒ ๊ฒฐํฉํ๋ ๋์์ธ์ ์ฌ์ฉํด์ผํ๋ค.
- ํด๋์ค๋ ํ์ฅ์ ๋ํด์๋ ์ด๋ ค์์ด์ผ ํ์ง๋ง ์ฝ๋ ๋ณ๊ฒฝ์ ๋ํด์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- ์ถ์ํ๋ ๊ฒ์ ์์กดํ๋๋ก ๋ง๋ค์ด๋ผ ๊ตฌ์ ํด๋์ค์ ์์กดํ๋๋ก ๋ง๋ค์ง ์๋๋ก ํ๋ค.
- ์ต์ ์ง์ ์์น - ์ ๋ง ์นํ ์น๊ตฌํ๊ณ ๋ง ์ด์ผ๊ธฐ ํด๋ผ
- ํ ๋ฆฌ์ฐ๋ ์์น : ๋จผ์ ์ฐ๋ฝํ์ง ๋ง์ธ์. ์ ํฌ๊ฐ ์ฐ๋ฝ๋๋ฆฌ๊ฒ ์ต๋๋ค.
- ์์กด์ฑ ๋ถํจ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
- ๋จ์ผ ์ญํ ์์น = ํด๋์ค๋ฅผ ๋ฐ๊พธ๋ ์ด์ ๋ ํ ๊ฐ์ง ๋ฟ์ด์ด์ผ ํ๋ค.
โพ๏ธ ์ฅ์ โพ๏ธ
- ํจํด์ ํตํด์ ์์ฌ์ํต์ ํ๋ ๊ฒ์๋ ์ ๋ฌธ์ฉ์ด๋ฅผ ๊ณต์ ํ๋ ๊ฒ ์ธ์ ๋ ๋ง์ ์ด๋์ด ์๋ค.
- ๊ฐ๋จํ ๋จ์ด๋ก ๋ง์ ๊ฒ์ ์ด์ผ๊ธฐ ํ ์ ์๋ค.
- ํจํด ์์ค์์ ๋ํ๋ฅผ ํ๋ฉด ๋์์ธ์ ๋ ๋ง์ด ์ง์คํ ์์๋ค.
โฝ๏ธ ์ฑ๊ธํด ํจํด(์์ฑ ํจํด) โฝ๏ธ
- ์ฑ๊ธํด ํจํด์ ํด๋น ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ๋ง๋ค์ด์ง๊ณ , ์ด๋์๋ ์ง ๊ทธ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๊ธฐ ์ํ ํจํด
- ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ํ๋๋ง ์์ฑํ๋๋ก ํ๋ฉฐ, ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ด๋์๋ ์ง ์ฐธ์กฐํ ์ ์๊ฒ ํ๋ ํจํด
- ๋ฌด์ธ๊ฐ ํ๋์ ์์์ ์ฌ๋ฌ ๋ช
์ด์ ๊ณต์ ํ ๋ ์ฌ์ฉํ๋ ํจํด์ด๋ค.
๊ณต์ ์ ๋จ์ ์ thread safe ํ์ง ์๋๋ค๋ ์ ์ด๋ค.
์ฆ, ์์
๋์ค์ ๋ผ์ด ๋ค ์ ์๋ค.
๊ณต์ ์ ๋จ์ ์ 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);
}
}
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ๋์์ธ ํจํด # 1 : ์ฑ๊ธํด, ์คํธ๋ํฐ์ง ํจํด ๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@borab/๋์์ธ-ํจํด-1-์ฑ๊ธํด-์คํธ๋ํฐ์ง-ํจํด์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค