๐Ÿ“ ์—˜๋ ˆ๊ฐ•ํŠธ ์˜ค๋ธŒ์ ํŠธ ๋ฝ€๊ฐœ๊ธฐ 1 ๊ฐ•์˜ ์ •๋ฆฌ


๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ ์ •๋ฆฌํ•˜๊ธฐ โœ๏ธ

์—˜๋ ˆ๊ฐ•ํŠธ ์˜ค๋ธŒ์ ํŠธ

image

  • ๋ฌธ์ž์—ด๊ณผ ์›์‹œ๊ฐ’์„ ํฌ์žฅํ•ด๋ผ

  • ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋ชจ๋‘ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜

    image

์ธ์ž์˜ ๊ฐ’์œผ๋กœ null์„ ์ ˆ๋Œ€ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”

public Iterable<File> find(String mask) {
    if (mask == null) {
// .
} else {
// .
} }

null์„ ์ฒดํฌํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ์ฒด๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
mask ๊ฐ์ฒด๋ฅผ ์กด์ค‘ํ–ˆ๋‹ค๋ฉด ์กฐ๊ฑด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๊ฐ์ฒด ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•˜๊ฒŒ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ์›์‹œ ๊ฐ’๊ณผ ๋ฌธ์ž์—ด์„ ํฌ์žฅํ•˜๋ฉด null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

image

์ด ๋ถ€๋ถ„์ด randomNumber๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€.
randomNumber๋ฅผ ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค. (์›์‹œ๊ฐ’ ํฌ์žฅ).

image

๊ฐ์ฒด์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค.

image

ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ.

RandomNumber์˜ null ์ฒดํฌ ์•ˆํ•ด์ค˜๋„ ๋˜๋‚˜ ?
์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์™ธ๋ถ€์— ์“ฐ์ธ๋‹ค๋ฉด ๊ณ ๋ฏผํ•ด๋ด์•ผํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์—์„œ๋งŒ move๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด null ์ฒดํฌ๋ฅผ ๊ตณ์ด ์•ˆํ•ด์ค˜๋„ ์ข‹๋‹ค. ๋‚ด๊ฐ€ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ผ๋ฉด ์•ˆํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.
move() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ ์–ด๋””๊นŒ์ง€์ธ์ง€์— ๋”ฐ๋ผ null ์ฒดํฌ ์—ฌ๋ถ€๊ฐ€ ๋‹ฌ๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค.

final์ด๊ฑฐ๋‚˜ abstract ์ด๊ฑฐ๋‚˜

์ƒ์†์€ ๊ฐ์ฒด๋“ค์˜ ๊ด€๊ณ„๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋‹ˆ ์ตœ๋Œ€ํ•œ ์ž์ œํ•˜๊ณ ,
final์ด๋‚˜ abstract๋กœ ๋งŒ๋“ค์–ด๋ผ

๋ณ€์ˆ˜์— final ์„ ๋ถ™์ด๋ฉด ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ฉ”์„œ๋“œ์— ๋ถ™์ด๋ฉด ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.
ํด๋ž˜์Šค์— final ์€ ์ƒ์†์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

final ํด๋ž˜์Šค๊ฐ€ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฒ•. ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ ๋‹ค.

RandomNumber ํด๋ž˜์Šค๋ฅผ final๋กœ ๋งŒ๋“ค๊ณ  Number ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

image

image

image

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ Number ์ธํ„ฐํŽ˜์ด์Šค์™€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค์™€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๊ฒŒ final ํด๋ž˜์Šค์™€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ๊ฒƒ ๋ณด๋‹ค ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ์šฉ์ดํ•˜๋‹ค.

ํด๋ž˜์Šค์— final์„ ๋ถ™์ด๋Š” ๊ฒƒ์€ ์ข‹์€ ์Šต๊ด€์ด๋‹ค.
final์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ถœํ•˜๋ฉด ๋œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋˜๋ฉด ์ค‘๋ณต๋“ค์ด ๋งŽ์•„์ง€๋Š”๋ฐ, ์ด ์ค‘๋ณต์„ ์–ด๋–ป๊ฒŒ ์—†์• ๋‚˜ ?
์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด ์ค‘๊ฐ„์— ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋‘”๋‹ค.
Car - ์ธํ„ฐํŽ˜์ด์Šค
AbstractCar - ์ถ”์ƒ ํด๋ž˜์Šค
Sonatar - ํด๋ž˜์Šค

์ด๋Ÿฌ๋ฉด ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํ•„์š”์„ฑ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ default ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋‚˜ ?

ํฌ๋น„๋Š” default ๋ฅผ ๋‚จ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์“ฐ๋Š”๊ฒŒ ๋” ์ข‹๋‹ค.

์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ๋•Œ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ์ฆ‰ ์ธ์Šคํ„ด์Šค์— ์ข…์†๋œ ๋ฉ”์„œ๋“œ๋ฉด default ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. default ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ž˜ ๊ตฌ๋ณ„.
์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋‹ˆ ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ์† ๋•Œ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ private๋กœ ๋ง‰์•„๋ผ !
๊ทธ๋ž˜์•ผ ์บก์Šํ™”๊ฐ€ ์ž˜ ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
์ ‘๊ทผํ•  ๋•Œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•ด๋ผ

-er๋กœ ๋๋‚˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”

ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์„ ๋•Œ ์ข‹์€ ๊ฐ€์ด๋“œ.

ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ์—ญํ• ์ผ ๋ฟ์ด๋‹ค (๊ฐ์ฒด์˜ Factory).
ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ์ถ”์ ํ•˜๊ณ , ์ ์ ˆํ•œ ์‹œ์ ์— ํŒŒ๊ดดํ•œ๋‹ค (๋ผ์ดํ”„ ์‚ฌ์ดํด ๊ด€๋ฆฌ).

ํด๋ž˜์Šค๋ฅผ ๊ฐ์ฒด์˜ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ๊ฒƒ์€ ํด๋ž˜์Šค๋ฅผ ์ˆ˜๋™์ ์ธ ์กด์žฌ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์˜ ๋Šฅ๋™์ ์ธ ๊ด€๋ฆฌ์ž์ด๋‹ค.
๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค.

ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง“๋Š” ๋ฐฉ์‹

ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋“ค์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๊ฐ€ ์•„๋‹Œ, ๋ฌด์—‡์ธ์ง€ ์— ๊ธฐ๋ฐ˜ํ•ด ์ง€์–ด๋ผ.

  • ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋กœ ์ด๋ฆ„์„ ์ง€์€ ์ž˜๋ชป๋œ ์˜ˆ
public class CashFormatter {
    private int dollars;
    public CashFormatter(int dollars) {
        this.dollars = dollars;
    }
    public String format() {
        return String.format("$ %d", this.dollars);
    }
}

๋ฌด์—‡์ธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด์˜ ์—ญ๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ์ด๋ฆ„์„ ์ง€์–ด์•ผ ํ•œ๋‹ค.

  • ๋ฌด์—‡์ธ์ง€
public class Cash {
    private int dollars;
    public Cash(int dollars) {
        this.dollars = dollars;
    }
    public String usd() {
        return String.format("$ %d", this.dollars);
    }
}

๊ฐ์ฒด๋Š” ๊ฐ์ฒด์˜ ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ๋‚ด๋ถ€ ์„ธ๊ณ„๋ฅผ ์ด์–ด์ฃผ๋Š” ์—ฐ๊ฒฐ์žฅ์น˜๊ฐ€ ์•„๋‹ˆ๊ณ ,
๋‚ด๋ถ€์— ์บก์Šํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ ˆ์ฐจ์˜ ์ง‘ํ•ฉ๋„ ์•„๋‹ˆ๋‹ค.
๊ฐ์ฒด๋Š” ์บก์Šํ™”๋œ ๋ฐ์ดํ„ฐ์˜ ๋Œ€ํ‘œ์ž์ด๋‹ค.

๋ฌด์—‡์ธ์ง€๋กœ ๊ฐ์ฒด๋ฅผ ์ถ”์ถœํ•˜๋ฉด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๊นŒ์ง€ ํฌ๊ด„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€.
๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋Š” ์ˆ˜๋™์ ์ธ ์กด์žฌ๊ฐ€ ๋œ๋‹ค.

๋ฉ”์„œ๋“œ์—์„œ๋Š” protected๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ณ€์ˆ˜์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
DTO๋Š” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ ๋„๋ฉ”์ธ ๊ฐ์ฒด์—์„œ๋Š” ๋ฌด์กฐ๊ฑด ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” private์—ฌ์•ผ ํ•œ๋‹ค.

โ€œ๋ฌด์—‡์ธ์ง€โ€ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  โ€œ๋ฌด์—‡์„ ํ•˜๋Š”์ง€โ€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•˜๊ณ  ์„ค๊ณ„ํ•˜์ง€ ๋ง๋ผ

์ฒ˜์Œ์— ๋ฉ”์„ธ์ง€๋ฅผ ์ •ํ•˜๊ณ  ๊ฐ์ฒด์˜ ํ˜‘๋ ฅ์„ ๊ตฌ์ƒํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด๋Š” โ€œ๋ฌด์—‡์„ ํ•˜๋Š”์ง€โ€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๊ฐ€ โ€œ๋ฌด์—‡์ธ์ง€โ€ ๋ถ€ํ„ฐ ์ƒ๊ฐ์„ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐ์ฒด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ƒ๊ฐํ•˜๊ณ  ์ฑ…์ž„์„ ๋ถ€์—ฌํ•˜๋ฉด์„œ โ€œ๋ฌด์—‡์„ ํ•˜๋Š”์ง€โ€ ๊ฐ€ ๋œ๋‹ค.

์ด๋ฏธ er๊ณผ or์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๋“ค์€ ์จ๋„ ๋˜์ง€๋งŒ, ๋‚˜๋จธ์ง€๋Š” ์ž์ œํ•˜๋ผ

CashFormatter๊ฐ€ ์•„๋‹Œ FomattedCash๋Š” ์–ด๋•Œ ?
CashFormatter๋Š”format() ์ด์™ธ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๋ฉด ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•˜์„ธ์š”

๋ฉ”์„œ๋“œ ๋ช…์€ ๋ฌด์กฐ๊ฑด ๋™์‚ฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.

๋นŒ๋”(builder)์˜ ์ด๋ฆ„์€ ๋ช…์‚ฌ๋กœ

๋ฐ˜ํ™˜ํƒ€์ž…์ด void๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋กœ, ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค์–ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ด ๋ฉ”์„œ๋“œ์˜ ๋ช…์€ ํ•ญ์ƒ ๋ช…์‚ฌ์—ฌ์•ผ ํ•œ๋‹ค.
ํ˜•์šฉ์‚ฌ๋ฅผ ๋ง๋ถ™์—ฌ ๋ฉ”์„œ๋“œ์˜ ์˜๋ฏธ๋ฅผ ์ข€ ๋” ํ’๋ถ€ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๋ช…์‚ฌ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค.

Ex) float speed(), Employee employee(), String parsedCell()

์กฐ์ •์ž(manipulator)์˜ ์ด๋ฆ„์€ ๋™์‚ฌ๋กœ

๋ฐ˜ํ™˜ํƒ€์ž…์ด void์ธ ๋ฉ”์„œ๋“œ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
์ด ๋ฉ”์„œ๋“œ ๋ช…์€ ํ•ญ์ƒ ๋™์‚ฌ์—ฌ์•ผ ํ•œ๋‹ค.
๋ถ€์‚ฌ๋ฅผ ๋ง๋ถ™์—ฌ ๋ฉ”์„œ๋“œ์˜ ๋ฌธ๋งฅ๊ณผ ๋ชฉ์ ์— ๊ด€ํ•œ ํ’๋ถ€ํ•œ ์ •๋ณด๋ฅผ ์ œ์†กํ•˜๋Š” ๋™์‚ฌ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

ex) void save(String content), void quicklyPrint(int id);

์ž˜๋ชป๋œ ์˜ˆ์‹œ

boolean put(String key, Float value);

์ด ๋ฉ”์„œ๋“œ๋Š” PutOperation ๊ณผ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด save() , success() ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

๋นŒ๋”์™€ ์กฐ์ •์ž๋กœ ๋ถ„๋ฆฌ - ๋นŒ๋”๋Š” ๋ช…์‚ฌ๋‹ค

class Bakery {
    Food cookBrownie();
    Drink brewCupOfCoffee(String flavor);
}

cookBrownie() , brewCupOfCoffee() ๋Š” ์‹ค์ œ๋กœ๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๊ณ , ํ”„๋กœ์‹œ์ €์ด๋‹ค.
๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ์˜๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๊ณ , ์กด์ค‘ํ•ด์ค˜์•ผํ•˜๋Š” ์‚ด์•„์žˆ๋Š” ์œ ๊ธฐ์ฒด์ด๋‹ค.
๋‹จ์ˆœํ•œ ๋ช…๋ น์— ๋”ฐ๋ฅด์ง€ ์•Š๊ณ , ๊ณ„์•ฝ์— ๊ธฐ๋ฐ˜ํ•ด ์ผํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ด€๋…์ ์ธ ๋ถ€๋ถ„์€ ํฌ๊ธฐํ•ด๋„ ๊ดœ์ฐฎ๋‹ค !

getXxx()๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ xxx๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๋“œ๋Ÿฌ๋‚ด์ง€๋งŒ,
๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ๋กœ์ง์ด ์žˆ๋Š”์ง€๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๋นŒ๋”์™€ ์กฐ์ •์ž๋กœ ๋ถ„๋ฆฌ - ์กฐ์ •์ž๋Š” ๋™์‚ฌ๋‹ค

ex) DJ์—๊ฒŒ ์Œ์•…์„ ํ‹€์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ๋•Œ

  • ๋ฐฉ๋ฒ• 1. ์Œ์•…์„ ํ‹€์–ด์ฃผ์„ธ์š”.
  • ๋ฐฉ๋ฒ• 2. ์Œ์•…์„ ํ‹€๊ณ , ํ˜„์žฌ ๋ณผ๋ฅจ ์ƒํƒœ๋ฅผ ๋งํ•ด์ฃผ์„ธ์š”.

์ด ์ค‘ ๋ฐฉ๋ฒ• 1๊ฐ€ ๋” ๊ฐ์ฒด๋ฅผ ์กด์ค‘ํ•˜๊ณ  ์žˆ๋‹ค.
๊ทธ ๊ฐ์ฒด๊ฐ€ ์•Œ์•„์„œ ํ•˜๊ฒ ์ง€ ! ๋ฅผ ์ƒ๊ฐํ•ด๋ผ. ๊ฐ์ฒด๋ฅผ ๋ฏฟ์–ด๋ผ.

print๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ˆ print() ๋กœ ํ†ต์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋นŒ๋”์™€ ์กฐ์ •์ž๋กœ ๋ถ„๋ฆฌ 3 - ๋นŒ๋”์™€ ์กฐ์ •์ž ํ˜ผํ•ฉํ•˜๊ธฐ

class Document {
    int write(InputStream content);
}

๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋Š” write๋ฅผ ๋นŒ๋”์™€ ์กฐ์ •์ž๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

class Document {
    OutputPipe output();
}
class OutputPipe {
    void write(InputStream content);
    int bytes();
    long time();
}

๋นŒ๋”์™€ ์กฐ์ •์ž๋กœ ๋ถ„๋ฆฌ - Boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ˜•์šฉ์‚ฌ๋กœ ์ง€์–ด๋ผ

๋นŒ๋”์ด์ง€๋งŒ, ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ํ˜•์šฉ์‚ฌ๋กœ ์ง€์–ด๋ผ.

์ƒ์„ฑ์ž ํ•˜๋‚˜๋ฅผ ์ฃผ ์ƒ์„ฑ์ž๋กœ ๋งŒ๋“œ์„ธ์š”

ํด๋ž˜์Šค๋Š” 2~3๊ฐœ์˜ ๋ฉ”์„œ๋“œ์™€ 5~10๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ํฌํ•จํ•ด์•ผํ•œ๋‹ค.

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

  • ์ฃผ ์ƒ์„ฑ์ž : ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์˜ค์ง ์ฃผ ์ƒ์„ฑ์ž๋งŒ ๋‹ด๋‹นํ•œ๋‹ค.
  • ๋ถ€ ์ƒ์„ฑ์ž : ์ฃผ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์ธ์ž์ˆ˜๊ฐ€ ์ ์€ ์ˆ˜๋ถ€ํ„ฐ ๋งŽ์€ ์ˆœ์œผ๋กœ, ์ฃผ ์ƒ์„ฑ์ž๋Š” ๋งˆ์ง€๋ง‰์— ๋‘”๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ƒ์„ฑ์ž๋Š” ์ข‹๋‹ค ! ํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€๋Š” ์˜ณ์ง€ ์•Š๋‹ค ! ์ƒ์„ฑ์ž ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋‹ค๋ฅธ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ƒ์„ฑ์ž ๋™๋“ฑ์„ฑ์„ ํ…Œ์ŠคํŠธ ํ•˜๋ฉด ๋œ๋‹ค.

๋ทฐ์—์„œ List ์ •๋„๋กœ ๊ฐ€๊ณต์€ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ข‹์€ ๊ฐ์ฒด๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ๊ฐ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค (100%๋Š” ์–ด๋ ต๋‹ค).

๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ผ

์ฃผ์„์ด ์—†์–ด๋„ ํด๋ž˜์Šค๋ช…๊ณผ ๋ฉ”์„œ๋“œ๋งŒ์„ ๋ด๋„ ๋ฌด์Šจ์ผ์„ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ,
ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ฉ”์„œ๋“œ์˜ ์˜๋„๋ฅผ ์•Œ๋„๋ก ํ•˜๋ผ.

๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋ผ๋Š” ๊ฒƒ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋„ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํด๋ž˜์Šค์˜ ์ผ๋ถ€์ด๊ณ  ๋…๋ฆฝ์ ์ธ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์ง€ ๋งˆ์„ธ์š”

์ธ์ž์— ์†์„ ๋Œ€์ง€ ๋ง๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ์ž˜๋ชป๋œ ์˜ˆ์‹œ
public class Cash {
    private int dollars;
    public Cash(String dlr) {
        this.dollars = Integer.parseInt(dlr);
    }
}

์ƒ์„ฑ์ž์— ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๊ฐ์ฒด ๋ณ€ํ™˜๊ณผ ๊ด€๋ จํ•œ ์˜ˆ์™ธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ข‹์€ ์˜ˆ์‹œ
public class Cash {
    private Number dollars;
    public Cash(String dlr) {
        this.dollars = new StringAsInteger(dlr);
    }
}
public class StringAsInteger extends Number {
    private String source;
    public StringAsInteger(String txt) {
        this.source = txt;
    }
@Override
    public int intValue() {
        return Integer.parseInt(this.source);
    }
... }

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

์ง„์ •ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋ž€ ๋” ์ž‘์€ ๊ฐ์ฒด๋“ค์„ ์กฐํ•ฉํ•ด์„œ ๋” ํฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ์ฒด์˜ ๋ณ€ํ™˜์„ ๋’ค๋กœ ๋ฏธ๋ค„ ํŒŒ์‹ฑ์ด ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(decorator)๋ฅผ ์ถ”๊ฐ€ํ•ด ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

public class CachedNumber extends Number {
    private Number origin;
    private List<Integer> cached = new ArrayList<>(1);
    public CachedNumber(Number num) {
        this.origin = num;
    }
@Override
    public int intValue() {
        if (this.cached.isEmpty()) {
            this.cached.add(this.origin.intValue());
        }
        return this.cached.get(0);
    }
... }
public class Cash {
    private Number dollars;
    public Cash(String dlr) {
        this.dollars = new CachedNumber(new StringAsInteger(dlr));
    }
}