๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿญ Chapter 2: ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„

๐ŸŽƒ ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ๋ฐํ˜€๋ผโ€‹

์ข‹์€ ์ด๋ฆ„์„ ์ง€์œผ๋ ค๋ฉด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ ์ข‹์€ ์ด๋ฆ„์œผ๋กœ ์ ˆ์•ฝํ•˜๋Š” ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋” ๋งŽ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๋ฆ„์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด ๋” ๋‚˜์€ ์ด๋ฆ„์ด ๋– ์˜ค๋ฅด๋ฉด ๊ฐœ์„ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ข€ ๋” ํ–‰๋ณตํ•ด์ง€๋ฆฌ๋ผ.

๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตต์งํ•œ ์งˆ๋ฌธ์— ๋ชจ๋‘ ๋‹ตํ•ด์•ผ ํ•œ๋‹ค. ๋ณ€์ˆ˜(ํ˜น์€ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค)์˜ ์กด์žฌ ์ด์œ ๋Š”? ์ˆ˜ํ–‰ ๊ธฐ๋Šฅ์€? ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€? ๋”ฐ๋กœ ์ฃผ์„์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ๋“œ๋Ÿฌ๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๋ง์ด๋‹ค.

int d; // ๊ฒฝ๊ณผ ์‹œ๊ฐ„(๋‹จ์œ„: ๋‚ ์งœ)

์ด๋ฆ„ d๋Š” ์•„๋ฌด ์˜๋ฏธ๋„ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฝ๊ณผ ์‹œ๊ฐ„์ด๋‚˜ ๋‚ ์งœ๋ผ๋Š” ๋Š๋‚Œ์ด ์•ˆ ๋“ ๋‹ค. ์ธก์ •ํ•˜๋ ค๋Š” ๊ฐ’๊ณผ ๋‹จ์œ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค.

int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

์˜๋„๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์ดํ•ด์™€ ๋ณ€๊ฒฝ์ด ์‰ฌ์›Œ์ง„๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋ฌด์—‡์„ ํ• ๊นŒ?

public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();

for (int[] x : theList)
if (x[0] == 4)
list1.add(x);

return list1;
}

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

  1. theList์— ๋ฌด์—‡์ด ๋“ค์—ˆ๋Š”๊ฐ€?
  2. theList์—์„œ 0๋ฒˆ์งธ ๊ฐ’์ด ์–ด์งธ์„œ ์ค‘์š”ํ•œ๊ฐ€?
  3. ๊ฐ’ 4๋Š” ๋ฌด์Šจ ์˜๋ฏธ์ธ๊ฐ€?
  4. ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฆฌ์ŠคํŠธ list1์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

์œ„ ์ฝ”๋“œ ์ƒ˜ํ”Œ์—” ์ด์™€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ •๋ณด ์ œ๊ณต์€ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ–ˆ์—ˆ๋‹ค. ์ง€๋ขฐ์ฐพ๊ธฐ ๊ฒŒ์ž„์„ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด theList๊ฐ€ ๊ฒŒ์ž„ํŒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•ˆ๋‹ค. theList๋ฅผ gameBoard๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

๊ฒŒ์ž„ํŒ์—์„œ ๊ฐ ์นธ์€ ๋‹จ์ˆœ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๋ฐฐ์—ด์—์„œ 0๋ฒˆ์งธ ๊ฐ’์€ ์นธ ์ƒํƒœ๋ฅผ ๋œปํ•œ๋‹ค. ๊ฐ’ 4๋Š” ๊นƒ๋ฐœ์ด ๊ฝ‚ํžŒ ์ƒํƒœ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๊ฐ ๊ฐœ๋…์— ์ด๋ฆ„๋งŒ ๋ถ™์—ฌ๋„ ์ฝ”๋“œ๊ฐ€ ์ƒ๋‹นํžˆ ๋‚˜์•„์ง„๋‹ค.

public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();

for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);

return flaggedCells;
}

์œ„์—์„œ ๋ณด๋“ฏ, ์ฝ”๋“œ์˜ ๋‹จ์ˆœ์„ฑ์€ ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฐ์‚ฐ์ž ์ˆ˜์™€ ์ƒ์ˆ˜ ์ˆ˜๋Š” ์•ž์˜ ์˜ˆ์™€ ๋˜‘๊ฐ™์œผ๋ฉฐ, ๋“ค์—ฌ์“ฐ๊ธฐ ๋‹จ๊ณ„๋„ ๋™์ผํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ๋„ ์ฝ”๋“œ๋Š” ๋”์šฑ ๋ช…ํ™•ํ•ด์กŒ๋‹ค.

ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€, int ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ์นธ์„ ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด๋„ ๋˜๊ฒ ๋‹ค. isFlagged๋ผ๋Š” ์ข€ ๋” ๋ช…์‹œ์ ์ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด FLAGGED๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ๊ฐ์ถฐ๋„ ์ข‹๊ฒ ๋‹ค.

public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();

for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);

return flaggedCells;
}

๋‹จ์ˆœํžˆ ์ด๋ฆ„๋งŒ ๊ณ ์ณค๋Š”๋ฐ๋„ ํ•จ์ˆ˜๊ฐ€ ํ•˜๋Š” ์ผ์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์กŒ๋‹ค. ๋ฐ”๋กœ ์ด๊ฒƒ์ด ์ข‹์€ ์ด๋ฆ„์ด ์ฃผ๋Š” ์œ„๋ ฅ์ด๋‹ค.

๐ŸŽƒ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ํ”ผํ•˜๋ผโ€‹

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ฝ”๋“œ์— ๊ทธ๋ฆ‡๋œ ๋‹จ์„œ๋ฅผ ๋‚จ๊ฒจ์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๊ทธ๋ฆ‡๋œ ๋‹จ์„œ๋Š” ์ฝ”๋“œ ์˜๋ฏธ๋ฅผ ํ๋ฆฐ๋‹ค. ๋‚˜๋ฆ„๋Œ€๋กœ ๋„๋ฆฌ ์“ฐ์ด๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๋‹จ์–ด๋ฅผ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•ด๋„ ์•ˆ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, hp, aix, sco๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ์œ ๋‹‰์Šค ํ”Œ๋žซํผ์ด๋‚˜ ์œ ๋‹‰์Šค ๋ณ€์ข…์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด๋ฆ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์—ฌ๋Ÿฌ ๊ณ„์ •์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์„ ๋•Œ, ์‹ค์ œ List๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, accountList๋ผ ๋ช…๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ List๋ผ๋Š” ๋‹จ์–ด๋Š” ํŠน์ˆ˜ํ•œ ์˜๋ฏธ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ accountGroup, bunchOfAccounts, ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํžˆ Accounts๋ผ ๋ช…๋ช…ํ•œ๋‹ค.

์„œ๋กœ ํก์‚ฌํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•œ๋‹ค. ํ•œ ๋ชจ๋“ˆ์—์„œ XYZControllerForEfficientHandlingOfStrings๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ , ์กฐ๊ธˆ ๋–จ์–ด์ง„ ๋ชจ๋“ˆ์—์„œ XYZControllerForEfficientStorageOfStrings๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด? ์ฐจ์ด๋ฅผ ์•Œ์•„์ฑ˜๋Š”๊ฐ€? ๋‘ ๋‹จ์–ด๋Š” ๊ฒ๋‚˜๊ฒŒ ๋น„์Šทํ•˜๋‹ค.

์œ ์‚ฌํ•œ ๊ฐœ๋…์€ ์œ ์‚ฌํ•œ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ๋„ ์ •๋ณด๋‹ค. ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๋Š” ํ‘œ๊ธฐ๋ฒ•์€ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋‹ค. ์ด๋ฆ„์œผ๋กœ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ง„์งœ ๋”์ฐํ•œ ์˜ˆ๊ฐ€ ์†Œ๋ฌธ์ž L์ด๋‚˜ ๋Œ€๋ฌธ์ž O ๋ณ€์ˆ˜๋‹ค. ๋‘ ๋ณ€์ˆ˜๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๋”์ฐํ•ด์ง„๋‹ค. ์†Œ๋ฌธ์ž L์€ ์ˆซ์ž 1์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  ๋Œ€๋ฌธ์ž O๋Š” ์ˆซ์ž 0์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

๐ŸŽƒ ์˜๋ฏธ ์žˆ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ผโ€‹

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

์—ฐ์†์ ์ธ ์ˆซ์ž๋ฅผ ๋ง๋ถ™์ธ ์ด๋ฆ„(a1, a2, ..., aN)์€ ์˜๋„์ ์ธ ์ด๋ฆ„๊ณผ ์ •๋ฐ˜๋Œ€๋‹ค. ์ด๋Ÿฐ ์ด๋ฆ„์€ ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด๋ฆ„๋„ ์•„๋‹ˆ๋ฉฐ, ์•„๋ฌด๋Ÿฐ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด๋ฆ„์ผ ๋ฟ์ด๋‹ค. ์ €์ž ์˜๋„๊ฐ€ ์ „ํ˜€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}

ํ•จ์ˆ˜ ์ธ์ˆ˜ ์ด๋ฆ„์œผ๋กœ source์™€ destination์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฝ”๋“œ ์ฝ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์‰ฌ์›Œ์ง„๋‹ค.

๋ถˆ์šฉ์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ ์ด๋ฆ„ ์—ญ์‹œ ์•„๋ฌด๋Ÿฐ ์ •๋ณด๋„ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค. Product๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ProductInfo ํ˜น์€ ProductData๋ผ ๋ถ€๋ฅธ๋‹ค๋ฉด ๊ฐœ๋…์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์€ ์ฑ„ ์ด๋ฆ„๋งŒ ๋‹ฌ๋ฆฌํ•œ ๊ฒฝ์šฐ๋‹ค. Info๋‚˜ Data๋Š” a, an, the์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜๋ฏธ๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•œ ๋ถˆ์šฉ์–ด๋‹ค.

a๋‚˜ the์™€ ๊ฐ™์€ ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๋Š” ์†Œ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์˜๋ฏธ๊ฐ€ ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅด๋‹ค๋ฉด ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

๋ถˆ์šฉ์–ด๋Š” ์ค‘๋ณต์ด๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์— variable์ด๋ผ๋Š” ๋‹จ์–ด๋Š” ๋‹จ์—ฐ์ฝ” ๊ธˆ๋ฌผ์ด๋‹ค. ํ‘œ์ด๋ฆ„์— table์ด๋ผ๋Š” ๋‹จ์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. NameString์ด Name๋ณด๋‹ค ๋ญ๊ฐ€ ๋‚˜์€๊ฐ€? Name์ด ๋ถ€๋™์†Œ์ˆ˜๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋˜๊ฐ€? ๊ทธ๋ ‡๋‹ค๋ฉด ์•ž์„œ ์–ธ๊ธ‰ํ•œ "๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ํ”ผํ•˜๋ผ" ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๋ฅผ ๋ณดํ˜ธํ•˜๊ณ ์ž ์ด๋ฆ„์„ ๋ฐ”๊ฟจ์œผ๋‚˜ ์˜ค๋ฅ˜ ํ˜•ํƒœ๋Š” ์ •ํ™•ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();

์ด ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์–ด๋Š ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ๊นŒ?

๋ช…ํ™•ํ•œ ๊ด€๋ก€๊ฐ€ ์—†๋‹ค๋ฉด ๋ณ€์ˆ˜ moneyAmount๋Š” money์™€ ๊ตฌ๋ถ„์ด ์•ˆ ๋œ๋‹ค. customerInfo๋Š” customer์™€, accountData๋Š” account์™€, theMessage๋Š” message์™€ ๊ตฌ๋ถ„์ด ์•ˆ ๋œ๋‹ค. ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ฐจ์ด๋ฅผ ์•Œ๋„๋ก ์ด๋ฆ„์„ ์ง€์–ด๋ผ.

๐ŸŽƒ ๋ฐœ์Œํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผโ€‹

๋ฐœ์Œํ•˜๊ธฐ ์–ด๋ ค์šด ์ด๋ฆ„์€ ํ† ๋ก ํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค. ๋ฐœ์Œํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์€ ์ค‘์š”ํ•˜๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‚ฌํšŒ ํ™œ๋™์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
/* ... */
}

class Customer {
private Date generationTimestamp;
private Date modificationTimestamp;
private final String recordId = "102";
/* ... */
}

๋‘˜์งธ ์ฝ”๋“œ๋Š” ์ง€์ ์ธ ๋Œ€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. "๋งˆ์ดํ‚ค, ์ด ๋ ˆ์ฝ”๋“œ ์ข€ ๋ณด์„ธ์š”. 'Generation Timestamp'๊ฐ’์ด ๋‚ด์ผ ๋‚ ์งœ์ž…๋‹ˆ๋‹ค! ์–ด๋–ป๊ฒŒ ์ด๋ ‡์ฃ ?"

๐ŸŽƒ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์•„๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผโ€‹

๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„๊ณผ ์ƒ์ˆ˜๋Š” ํ…์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์‰ฝ๊ฒŒ ๋ˆˆ์— ๋„์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

MAX_CLASSES_PER_STUDENT๋Š” grep์œผ๋กœ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€๋งŒ, ์ˆซ์ž 7์€ ์€๊ทผํžˆ ๊นŒ๋‹ค๋กญ๋‹ค. 7์ด ๋“ค์–ด๊ฐ€๋Š” ํŒŒ์ผ ์ด๋ฆ„์ด๋‚˜ ์ˆ˜์‹์ด ๋ชจ๋‘ ๊ฒ€์ƒ‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฐ ๊ด€์ ์—์„œ ๊ธด ์ด๋ฆ„์ด ์งง์€ ์ด๋ฆ„๋ณด๋‹ค ์ข‹๋‹ค. ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ด ์ƒ์ˆ˜๋ณด๋‹ค ์ข‹๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ์—์„œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋งŒ ํ•œ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฆ„ ๊ธธ์ด๋Š” ๋ฒ”์œ„ ํฌ๊ธฐ์— ๋น„๋ก€ํ•ด์•ผ ํ•œ๋‹ค. ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์ฝ”๋“œ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

// 1
for (int j = 0; j < 34; j++) {
s += (t[j] * 4) / 5;
}

// 2
int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;

for (int j = 0; j < NUMBER_OF_TASKS; j++) {
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}

์œ„ ์ฝ”๋“œ์—์„œ sum์ด ๋ณ„๋กœ ์œ ์šฉํ•˜์ง„ ์•Š์œผ๋‚˜ ์ตœ์†Œํ•œ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฆ„์„ ์˜๋ฏธ์žˆ๊ฒŒ ์ง€์œผ๋ฉด ํ•จ์ˆ˜๊ฐ€ ๊ธธ์–ด์ง„๋‹ค. ํ•˜์ง€๋งŒ WORK_DAYS_PER_WEEK๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€ ์ƒ๊ฐํ•ด๋ณด๋ผ. ๊ทธ๋ƒฅ 5๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด 5๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์ด๋ฆ„์„ ๋ชจ๋‘ ์ฐพ์€ ํ›„ ์˜๋ฏธ๋ฅผ ๋ถ„์„ํ•ด ์›ํ•˜๋Š” ์ƒ์ˆ˜๋ฅผ ๊ฐ€๋ ค๋‚ด์•ผ ํ•˜๋ฆฌ๋ผ.

๐ŸŽƒ ์ธ์ฝ”๋”ฉ์„ ํ”ผํ•˜๋ผโ€‹

๋ฌธ์ œ ํ•ด๊ฒฐ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ธ์ฝ”๋”ฉ์€ ๋ถˆํ•„์š”ํ•œ ์ •์‹ ์  ๋ถ€๋‹ด์ด๋‹ค. ์ธ์ฝ”๋”ฉํ•œ ์ด๋ฆ„์€ ๊ฑฐ์˜๋‹ค ๋ฐœ์Œํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ ์˜คํƒ€๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ์‰ฝ๋‹ค.

๐ŸŽˆ ํ—๊ฐ€๋ฆฌ์‹ ํ‘œ๊ธฐ๋ฒ•โ€‹

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

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์— ํƒ€์ž…์„ ์ธ์ฝ”๋”ฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ฐ์ฒด๋Š” ๊ฐ•ํ•œ ํƒ€์ž…์ด๋ฉฐ, IDE๋Š” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ ๋„ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ •๋„๋กœ ๋ฐœ์ „ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ œ๋Š” ํ—๊ฐ€๋ฆฌ์‹ ํ‘œ๊ธฐ๋ฒ•์ด๋‚˜ ๊ธฐํƒ€ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ์˜คํžˆ๋ ค ๋ฐฉํ•ด๊ฐ€ ๋  ๋ฟ์ด๋‹ค. ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ์ด๋ฆ„์ด๋‚˜ ํƒ€์ž…์„ ๋ฐ”๊พธ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง€๋ฉฐ, ์ฝ๊ธฐ๋„ ์–ด๋ ค์›Œ์ง„๋‹ค.

PhoneNumber phoneString;
// ํƒ€์ž…์ด ๋ฐ”๋€Œ์–ด๋„ ์ด๋ฆ„์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค!

๐ŸŽˆ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ ‘๋‘์–ดโ€‹

์ด์ œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— m_์ด๋ผ๋Š” ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ผ ํ•„์š”๋„ ์—†๋‹ค. ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋Š” ์ ‘๋‘๊ฐ€ ํ•„์š”์—†์„ ์ •๋„๋กœ ์ž‘์•„์•ผ ๋งˆ๋•…ํ•˜๋‹ค. ๋˜ํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ์ƒ‰์ƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๋ˆˆ์— ๋„๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” IDE๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋งˆ๋•…ํ•˜๋‹ค.

// 1
public class Part {
private String m_dsc; // ์„ค๋ช… ๋ฌธ์ž์—ด

void setName(String name) {
m_dsc = name;
}
}

// 2
public class Part {
String description;

void setDescription(String description) {
this.description = description;
}
}

๊ณ„๋‹ค๊ฐ€ ์‚ฌ๋žŒ๋“ค์€ ์ ‘๋‘์–ด(๋˜๋Š” ์ ‘๋ฏธ์–ด)๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ด๋ฆ„์„ ํ•ด๋…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์žฌ๋นจ๋ฆฌ ์ตํžŒ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ์œผ์ˆ˜๋ก ์ ‘๋‘์–ด๋Š” ๊ด€์‹ฌ ๋ฐ–์œผ๋กœ ๋ฐ€๋ ค๋‚œ๋‹ค. ๊ฒฐ๋ฃฉ ์ ‘๋‘์–ด๋Š” ์˜›๋‚ ์— ์ž‘์„ฑํ•œ ๊ตฌ๋‹ฅ๋‹ค๋ฆฌ ์ฝ”๋“œ๋ผ๋Š” ์ง•ํ‘œ๊ฐ€ ๋˜๋ฒ„๋ฆฐ๋‹ค.

๐ŸŽˆ ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค์™€ ๊ตฌํ˜„ ํด๋ž˜์Šคโ€‹

๋•Œ๋กœ๋Š” ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„ํ˜•์„ ์ƒ์„ฑํ•˜๋Š” ABSTRACT FACTORY๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ํŒฉํ† ๋ฆฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค๋‹ค. ๊ตฌํ˜„์€ ๊ตฌ์ฒด ํด๋ž˜์Šค์—์„œ ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‘ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ์ง€์–ด์•ผ ์ข‹์„๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์€ ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š” ํŽธ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์˜›๋‚  ์ฝ”๋“œ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ ‘๋‘์–ด I๋Š” ์ฃผ์˜๋ฅผ ํํŠธ๋ฆฌ๊ณ  ๊ณผ๋„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํด๋ž˜์Šค ์‚ฌ์šฉ์ž๋Š” ๊ทธ๋ƒฅ ShapeFactory๋ผ๊ณ ๋งŒ ์ƒ๊ฐํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ๊ทธ๋ž˜์„œ ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ตฌํ˜„ ํด๋ž˜์Šค ์ด๋ฆ„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ตฌํ˜„ ํด๋ž˜์Šค ์ด๋ฆ„์„ ํƒํ•˜๊ฒ ๋‹ค. ShapeFactoryImp๋‚˜ ์‹ฌ์ง€์–ด CShapeFactory๊ฐ€ IShapeFactory๋ณด๋‹ค ์ข‹๋‹ค.

๐ŸŽƒ ์ž์‹ ์˜ ๊ธฐ์–ต๋ ฅ์„ ์ž๋ž‘ํ•˜์ง€ ๋งˆ๋ผโ€‹

๋…์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉด์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ž์‹ ์ด ์•„๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ทธ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ ์˜์—ญ์ด๋‚˜ ํ•ด๋ฒ• ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์„ ์„ ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋‹ค.

๋ฌธ์ž ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ฃจํ”„์—์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ณ€์ˆ˜ i, j, k๋Š” ๊ดœ์ฐฎ๋‹ค. (l์€ ์ ˆ๋Œ€ ์•ˆ ๋œ๋‹ค!) ๋‹จ, ๋ฃจํ”„ ๋ฒ”์œ„๊ฐ€ ์•„์ฃผ ์ž‘๊ณ  ๋‹ค๋ฅธ ์ด๋ฆ„๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ ๊ดœ์ฐฎ๋‹ค. ๋ฃจํ”„์—์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜ ๋ณ€์ˆ˜๋Š” ์ „ํ†ต์ ์œผ๋กœ ํ•œ ๊ธ€์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ ์™ธ์—๋Š” ๋Œ€๋ถ€๋ถ„ ์ ์ ˆํ•˜์ง€ ๋ชปํ•˜๋‹ค.

๋˜‘๋˜‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ์ „๋ฌธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ ์‚ฌ์ด์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์ฐจ์ด์  ํ•˜๋‚˜๋งŒ ๋“ค์ž๋ฉด, ์ „๋ฌธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋ช…๋ฃŒํ•จ์ด ์ตœ๊ณ ๋ผ๋Š” ์‚ฌ์‹ค์„ ์ดํ•ดํ•œ๋‹ค. ์ „๋ฌธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ž์‹ ์˜ ๋Šฅ๋ ฅ์„ ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ์‚ฌ์šฉํ•ด ๋‚จ๋“ค์ด ์ดํ•ดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋‚ด๋†“๋Š”๋‹ค.

๐ŸŽƒ ํด๋ž˜์Šค ์ด๋ฆ„โ€‹

ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ฐ์ฒด ์ด๋ฆ„์€ ๋ช…์‚ฌ๋‚˜ ๋ช…์‚ฌ๊ตฌ๊ฐ€ ์ ํ•ฉํ•˜๋‹ค. Customer, WikiPage, Account, AddressParser ๋“ฑ์€ ์ข‹์€ ์˜ˆ๋‹ค. Manager, Processor, Data, Info ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹จ์–ด๋Š” ํ”ผํ•˜๊ณ , ๋™์‚ฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐ŸŽƒ ๋ฉ”์„œ๋“œ ์ด๋ฆ„โ€‹

๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ๋™์‚ฌ๋‚˜ ๋™์‚ฌ๊ตฌ๊ฐ€ ์ ํ•ฉํ•˜๋‹ค. postPayment, deletePage, save ๋“ฑ์ด ์ข‹์€ ์˜ˆ๋‹ค. ์ ‘๊ทผ์ž, ๋ณ€๊ฒฝ์ž, ์กฐ๊ฑด์ž๋Š” javabean ํ‘œ์ค€์— ๋”ฐ๋ผ ๊ฐ’ ์•ž์— get, set, is๋ฅผ ๋ถ™์ธ๋‹ค.

String name = employee.getName();
customer.setName("mike");
if (paycheck.isPosted()) // ...

์ƒ์„ฑ์ž(Constructor)๋ฅผ ์ค‘๋ณต์ •์˜(overload)ํ•  ๋•Œ๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฉ”์„œ๋“œ๋Š” ์ธ์ˆ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋‘ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

Complex fulcrumPoint = Complex.FromRealNumber(23.0);

์œ„ ์ฝ”๋“œ๊ฐ€ ์•„๋ž˜ ์ฝ”๋“œ๋ณด๋‹ค ์ข‹๋‹ค.

Complex fulcrumPoint = new Complex(23.0);

์ƒ์„ฑ์ž ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๋ ค๋ฉด ํ•ด๋‹น ์ƒ์„ฑ์ž๋ฅผ private๋กœ ์„ ์–ธํ•œ๋‹ค.

๐ŸŽƒ ๊ธฐ๋ฐœํ•œ ์ด๋ฆ„์€ ํ”ผํ•˜๋ผโ€‹

HolyHandGrenade๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ๊ณ˜๋Š”๊ฐ€? ๊ธฐ๋ฐœํ•œ ์ด๋ฆ„์ด์ง€๋งŒ DeleteItems๊ฐ€ ๋” ์ข‹๋‹ค. ์žฌ๋ฏธ๋‚œ ์ด๋ฆ„๋ณด๋‹ค ๋ช…๋กœํ•œ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋ผ.

ํŠน์ • ๋ฌธํ™”์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋†๋‹ด์€ ํ”ผํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค. ์˜๋„๋ฅผ ๋ถ„๋ช…ํ•˜๊ณ  ์†”์งํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ผ.

๐ŸŽƒ ํ•œ ๊ฐœ๋…์— ํ•œ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ผโ€‹

์ถ”์ƒ์ ์ธ ๊ฐœ๋… ํ•˜๋‚˜์— ๋‹จ์–ด ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด ์ด๋ฅผ ๊ณ ์ˆ˜ํ•œ๋‹ค. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ๋…์ž์ ์ด๊ณ  ์ผ๊ด€์ ์ด์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์ฃผ์„์„ ๋’ค์ ธ๋ณด์ง€ ์•Š๊ณ ๋„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋™์ผ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— controller, manager, driver๋ฅผ ์„ž์–ด ์“ฐ๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค. DeviceManager์™€ ProtocolController๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? ์–ด์งธ์„œ ๋‘˜ ๋‹ค Controller๊ฐ€ ์•„๋‹Œ๊ฐ€? ์–ด์งธ์„œ ๋‘˜ ๋‹ค Manager๊ฐ€ ์•„๋‹Œ๊ฐ€? ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด ๋…์ž๋Š” ๋‹น์—ฐํžˆ ํด๋ž˜์Šค๋„ ๋‹ค๋ฅด๊ณ  ํƒ€์ž…๋„ ๋‹ค๋ฅด๋ฆฌ๋ผ ์ƒ๊ฐํ•œ๋‹ค.

์ผ๊ด€์„ฑ ์žˆ๋Š” ์–ดํœ˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฐ˜๊ฐ‘๊ฒŒ ์—ฌ๊ธธ ์„ ๋ฌผ์ด๋‹ค.

๐ŸŽƒ ๋ง์žฅ๋‚œ์„ ํ•˜์ง€ ๋งˆ๋ผโ€‹

ํ•œ ๋‹จ์–ด๋ฅผ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. ๋‹ค๋ฅธ ๊ฐœ๋…์— ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ๋ง์žฅ๋‚œ์— ๋ถˆ๊ณผํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ง€๊ธˆ๊นŒ์ง€ ๊ตฌํ˜„ํ•œ add ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ ๊ธฐ์กด ๊ฐ’ ๋‘ ๊ฐœ๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ์ด์–ด์„œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ƒˆ๋กœ ์ž‘์„ฑํ•œ ๋ฉ”์„œ๋“œ๋Š” ์ง‘ํ•ฉ์— ๊ฐ’์„ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ add๋ผ ๋ถˆ๋Ÿฌ๋„ ๊ดœ์ฐฎ์„๊นŒ? ์ƒˆ ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ์กด add ๋ฉ”์„œ๋“œ์™€ ๋งฅ๋ฝ์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ insert๋‚˜ append๋ผ๋Š” ์ด๋ฆ„์ด ์ ๋‹นํ•˜๋‹ค. ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ add๋ผ ๋ถ€๋ฅธ๋‹ค๋ฉด ์ด๋Š” ๋ง์žฅ๋‚œ์ด๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์งœ์•ผ ํ•œ๋‹ค. ์ง‘์ค‘์ ์ธ ํƒ๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋Œ€์ถฉ ํ›‘์–ด๋ด๋„ ์ดํ•ดํ•  ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋ชฉํ‘œ๋‹ค. ์˜๋ฏธ๋ฅผ ํ•ด๋…ํ•  ์ฑ…์ž„์ด ๋…์ž์—๊ฒŒ ์žˆ๋Š” ๋…ผ๋ฌธ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ์˜๋„๋ฅผ ๋ฐํž ์ฑ…์ž„์ด ์ €์ž์—๊ฒŒ ์žˆ๋Š” ์žก์ง€ ๋ชจ๋ธ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

๐ŸŽƒ ํ•ด๋ฒ• ์˜์—ญ์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผโ€‹

์ฝ”๋“œ๋ฅผ ์ฝ์„ ์‚ฌ๋žŒ๋„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ช…์‹ฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ „์‚ฐ ์šฉ์–ด, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„, ํŒจํ„ด ์ด๋ฆ„, ์ˆ˜ํ•™ ์šฉ์–ด ๋“ฑ์„ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ๋ชจ๋“  ์ด๋ฆ„์„ ๋ฌธ์ œ ์˜์—ญ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ •์ฑ…์€ ํ˜„๋ช…ํ•˜์ง€ ๋ชปํ•˜๋‹ค. ๊ธฐ์ˆ  ๊ฐœ๋…์—๋Š” ๊ธฐ์ˆ  ์ด๋ฆ„์ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ ํƒ์ด๋‹ค.

๐ŸŽƒ ๋ฌธ์ œ ์˜์—ญ์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผโ€‹

์ ์ ˆํ•œ 'ํ”„๋กœ๊ทธ๋ž˜๋จธ ์šฉ์–ด'๊ฐ€ ์—†๋‹ค๋ฉด ๋ฌธ์ œ ์˜์—ญ์—์„œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณด์ˆ˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ถ„์•ผ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์˜๋ฏธ๋ฅผ ๋ฌผ์–ด ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ์ˆ˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ์„ค๊ณ„์ž๋ผ๋ฉด ํ•ด๋ฒ• ์˜์—ญ๊ณผ ๋ฌธ์ œ ์˜์—ญ์„ ๊ตฌ๋ถ„ํ•  ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋ฌธ์ œ ์˜์—ญ ๊ฐœ๋…๊ณผ ๊ด€๋ จ์ด ๊นŠ์€ ์ฝ”๋“œ๋ผ๋ฉด ๋ฌธ์ œ ์˜์—ญ์—์„œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

๐ŸŽƒ ์˜๋ฏธ ์žˆ๋Š” ๋งฅ๋ฝ์„ ์ถ”๊ฐ€ํ•˜๋ผโ€‹

์Šค์Šค๋กœ ์˜๋ฏธ๊ฐ€ ๋ถ„๋ช…ํ•œ ์ด๋ฆ„์ด ์—†์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋‹ค์ˆ˜ ์ด๋ฆ„์€ ๊ทธ๋ ‡์ง€ ๋ชปํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ํด๋ž˜์Šค, ํ•จ์ˆ˜, ์ด๋ฆ„ ๊ณต๊ฐ„์— ๋„ฃ์–ด ๋งฅ๋ฝ์„ ๋ถ€์—ฌํ•œ๋‹ค. ๋ชจ๋“  ๋ฐฉ๋ฒ•์ด ์‹คํŒจํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ์œผ๋กœ ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, firstName, lastName, street, houseNumber, city, state, zipcode๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ํ›‘์–ด๋ณด๋ฉด ์ฃผ์†Œ๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ธˆ๋ฐฉ ์•Œ์•„์ฑˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋Š ๋ฉ”์„œ๋“œ๊ฐ€ state๋ผ๋Š” ๋ณ€์ˆ˜ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด? ๋ณ€์ˆ˜ state๊ฐ€ ์ฃผ์†Œ์˜ ์ผ๋ถ€๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ธˆ๋ฐฉ ์•Œ์•„์ฑŒ๊นŒ?

์•„๋ž˜ ์˜ˆ์ œ๋Š” ๋งฅ๋ฝ์ด ๋ถ„๋ช…ํ•œ ๋ณ€์ˆ˜๋‹ค. ์„ธ ๋ณ€์ˆ˜๋Š” ํ™•์‹คํ•˜๊ฒŒ GuessStatisticsMessage์— ์†ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งฅ๋ฝ์„ ๊ฐœ์„ ํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ์ชผ๊ฐœ๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง€๋ฏ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ข€ ๋” ๋ช…ํ™•ํ•ด์ง„๋‹ค.

public class GuessStatisticsMessage {
private String number;
private String verb;
private String pluralModifier;

public String make(char candidate, int count) {
createPluralDependentMessageParts(count);

return String.format(
"There %s %s %s%s",
verb, number, candidate, pluralModifier
);
}

private void createPluralDependentMessageParts(int count) {
if (count == 0) {
thereAreNoLetters();
} else if (count == 1) {
thereIsOneLetter();
} else {
thereAreManyLetters(count);
}
}

private void thereAreManyLetters(int count) {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}

private void thereIsOneLetter() {
number = "1";
verb = "is"
pluralModifier = "";
}

private void thereAreNoLetters() {
number = "no";
verb = "are";
pluralModifier = "s";
}
}

๐ŸŽƒ ๋ถˆํ•„์š”ํ•œ ๋งฅ๋ฝ์„ ์—†์• ๋ผโ€‹

์ผ๋ฐ˜์ ์œผ๋กœ ์งง์€ ์ด๋ฆ„์ด ๊ธด ์ด๋ฆ„๋ณด๋‹ค ์ข‹๋‹ค. ๋‹จ, ์˜๋ฏธ๊ฐ€ ๋ถ„๋ช…ํ•œ ๊ฒฝ์šฐ์— ํ•œํ•ด์„œ๋‹ค. ์ด๋ฆ„์— ๋ถˆํ•„์š”ํ•œ ๋งฅ๋ฝ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•œ๋‹ค.

accountAddress์™€ customerAddress๋Š” Address ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋กœ๋Š” ์ข‹์€ ์ด๋ฆ„์ด๋‚˜ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ๋ชปํ•˜๋‹ค. Address๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ ํ•ฉํ•˜๋‹ค. ํฌํŠธ ์ฃผ์†Œ, MAC ์ฃผ์†Œ, ์›น ์ฃผ์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด PostalAddress, MAC, URI๋ผ๋Š” ์ด๋ฆ„๋„ ๊ดœ์ฐฎ๊ฒ ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜๋ฏธ๊ฐ€ ์ข€ ๋” ๋ถ„๋ช…ํ•ด์ง„๋‹ค. ๋ฐ”๋กœ ์ด๊ฒƒ์ด ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ์ด์œ ๊ฐ€ ์•„๋‹ˆ๋˜๊ฐ€?