Skip to content

Commit a9f43da

Browse files
authored
Merge pull request #17 from theintrance/hyunwook/2024-11-06
Hyunwook/2024-11-06
2 parents 8211729 + d2d1d70 commit a9f43da

4 files changed

+503
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
title: '์ด ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ŠคํŠธ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์—†๋Š”๊ฐ€?'
3+
author: 'hyunwok'
4+
---
5+
6+
- ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ์žก์•„๋‚ผ ๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์— ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ ๋…ธ๋ ฅ์€ ์‹œ๊ฐ„ ๋‚ญ๋น„๋ผ๋Š” ์ฃผ์žฅ์„ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€๋” ์žˆ๋‹ค.
7+
- ํ•„์ž์˜ ๊ฒฝํ—˜์œผ๋กœ๋Š”, ์ด๊ฒƒ์€ ํ˜„์‹ค์—์„œ๋Š” ๋ณ„๋กœ ํšจ๊ณผ๊ฐ€ ์—†๋Š” ๋‹ค์†Œ ์ด์ƒ์ฃผ์˜์ ์ธ ์ฃผ์žฅ์ด๋‹ค.
8+
- ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋‹ค ์ฒ˜๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์ง€์‹์ด ํ’๋ถ€ํ•˜๋ฉฐ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์˜ฌ๋ฐ”๋ฅธ ํ–‰๋™๊ณผ ๊ฐ€์ •์„ ํ™•์ธํ•˜๋Š”, ๊ฑฐ์˜ ์™„๋ฒฝํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค
9+
- ์–ด๋–ค ๊ฐœ๋ฐœ์ž๋“ค์€ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ๋ถ€์ง€๋Ÿฐํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค
10+
- ๊ฐ€์ •ํ•œ ๊ฒƒ์ด ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์„ ๋“œ๋Ÿฌ๋‚ด๊ธฐ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋‚˜ ์ฝ”๋„ˆ ์ผ€์ด์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š๋Š”๋‹ค.
11+
- ํ…Œ์ŠคํŠธ๊ฐ€ ํ•ญ์ƒ ์‹ค์ œ ์ƒํ™ฉ์„ ์ •ํ™•ํ•˜๊ฒŒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
12+
- ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” Mock ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•  ๋•Œ๋„ ์žˆ๋Š”๋ฐ, Mock ๊ฐ์ฒด์˜ ํ–‰๋™์˜ ๊ฐ€์ •๊ณผ ์˜ˆ์ธก์„ ๋ฒ—์–ด๋‚˜๋Š” ๋™์ž‘์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊นจ๋‹ซ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ํž˜๋“ค๋‹ค.
13+
- ์–ด๋–ค ๊ฒƒ๋“ค์€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค.
14+
- ์•„๋ฌด๋ฆฌ ๋งŽ์€ ์ฝ”๋“œ ๊ตฌ์กฐํ™”๋‚˜ ์ฝ”๋“œ ๊ณ„์•ฝ์— ๋Œ€ํ•œ ๊ฑฑ์ •๋„ ๊ณ ํ’ˆ์งˆ์˜ ์ฒ ์ €ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๊ธฐ์— ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.
15+
- ๊ทธ ๋ฐ˜๋Œ€๋กœ, ์ง๊ด€์ ์ด์ง€ ์•Š๊ฑฐ๋‚˜ ์˜ˆ์ƒ์„ ๋ฒ—์–ด๋‚˜๋Š” ์ฝ”๋“œ์— ์ˆจ์–ด ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๋ฐฉ์ง€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
---
2+
title: '๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ผ'
3+
author: 'hyunwok'
4+
---
5+
6+
- ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํ›„์— ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค๋ฉด ์ด ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€(๋ถˆ๊ฐ€๋ณ€)์ด๊ณ , ๊ทธ ๋ฐ˜๋Œ€๋Š” ๊ฐ€๋ณ€์ด๋‹ค.
7+
- ๊ฐ€๋ณ€ ๊ฐ์ฒด์˜ ๋ฌธ์ œ์ ๋“ค
8+
- ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ์ถ”๋ก ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
9+
- ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ๋ณ€์งˆ ๋ฐฉ์ง€ ๋ด‰์ธ์ด ์—†๋Š” ์ƒ์ž์ด๊ธฐ์—, ๊ฐ์ฒด๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ ์ „๋‹ฌํ•˜๋ฉด ๋ณ€๊ฒฝ๋๊ฑฐ๋‚˜ ๋ฌด์–ธ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ํ™•์‹ ์„ ํ•  ์ˆ˜ ์—†๋‹ค.
10+
- ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
11+
- 6์žฅ์—์„œ ๋ณด์•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋ผ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์ค‘ ์Šฌ๋ ˆ๋“œ ์ฝ”๋“œ๊ฐ€ ํŠนํžˆ ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
12+
- ๊ฐ€๋ณ€ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์กด์žฌํ•˜์ง€๋งŒ, ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋Š˜๋ฆฌ๊ณ  ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ์— ํ•„์š”ํ•œ ๊ณณ์—์„œ๋งŒ ๊ฐ€๋ณ€์ ์ด ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.
13+
14+
### 7.1.1 ๊ฐ€๋ณ€ ํด๋ž˜์Šค๋Š” ์˜ค์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค.
15+
- ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ณ€์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ์„ธํ„ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
16+
17+
```java
18+
class TextOptions {
19+
private Font font;
20+
private Double fontSize;
21+
22+
TextOptions(Font font, Double fontSize) {
23+
this.font = font;
24+
this.fontSize = fontSize;
25+
}
26+
27+
void setFont(Font font) { // ํฐํŠธ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ
28+
this.font = font;
29+
}
30+
31+
void setFontSize(Double fontSize) { // ํฐํŠธ ์‚ฌ์ด์ฆˆ ๋˜ํ•œ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ
32+
this.fontSize = fontSize;
33+
}
34+
35+
Font getFont() {
36+
return font;
37+
}
38+
39+
Double getFontSize() {
40+
return fontSize;
41+
}
42+
}
43+
```
44+
45+
```java incorrect
46+
class UserDisplay {
47+
private final MessageBox messageBox;
48+
49+
void sayHello() {
50+
TextOptions defaultStyle = new TextOptions(Font.ARIAL, 12.0); // ํฐํŠธ ์‚ฌ์ด์ฆˆ๋ฅผ 12๋กœ ์„ค์ • ํ›„ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
51+
messageBox.renderTitle("Important message", defaultStyle);
52+
messageBox.renderMessage("Hello", defaultStyle);
53+
}
54+
}
55+
56+
class MessageBox {
57+
private final TextField titleField;
58+
private final TextField messageField;
59+
60+
void renderTitle(String title, TextOptions baseStyle) {
61+
baseStyle.setFontSize(18.0); // 18๋กœ ํฐํŠธ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ณ€๊ฒฝํ•จ
62+
titleField.display(title, baseStyle);
63+
}
64+
65+
void renderMessage(String message, TextOptions style) {
66+
messageField.display(message, style);
67+
}
68+
}
69+
```
70+
71+
### 7.1.2 ํ•ด๊ฒฐ์ฑ…: ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ผ
72+
- ๋ชจ๋“  ๊ฐ’์ด ๊ฐ์ฒด์˜ ์ƒ์„ฑ ์‹œ์— ์ œ๊ณต๋˜๊ณ  ๊ทธ ์ดํ›„๋กœ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•จ์œผ๋กœ์จ ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋ณ€์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ์˜ค์šฉ๋„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
73+
- ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋–„ ํด๋ž˜์Šค ๋‚ด์—์„œ๋„ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
74+
- ์–ธ์–ด์— ๋”ฐ๋ผ const, final, readonly๋“ฑ์ด ์žˆ๋‹ค.
75+
76+
```java correct
77+
class TextOptions {
78+
private final Font font;
79+
private final Double fontSize;
80+
81+
TextOptions(Font font, Double fontSize) {
82+
this.font = font;
83+
this.fontSize = fontSize;
84+
}
85+
86+
Font getFont() {
87+
return font;
88+
}
89+
90+
Double getFontSize() {
91+
return fontSize;
92+
}
93+
}
94+
```
95+
96+
- ์—ฌ๊ธฐ์— ์ถ”๊ฐ€์ ์œผ๋กœ TextOptions ๊ฐ์ฒด์•  ๋Œ€ํ•ด์„œ ๊ธ€๊ผด ํฌ๊ธฐ๋งŒ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•œ๋ฐ ์ด๊ฒƒ์„ ์œ„ํ•ด ์“ฐ๊ธฐ ์‹œ ๋ณต์‚ฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
97+
```java correct
98+
class MessageBox {
99+
private final TextField titleField;
100+
private final TextField messageField;
101+
102+
void renderTitle(String title, TextOptions baseStyle) {
103+
titleField.display(title, baseStyle.withFontSize(18.0));
104+
}
105+
}
106+
```
107+
108+
### 7.1.3 ํ•ด๊ฒฐ์ฑ…: ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•œ ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ผ
109+
- ์„ธํ„ฐ ํ•จ์ˆ˜ ์ œ๊ฑฐ, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํŒŒ์ด๋„๋กœ ํ‘œ์‹œํ•˜๋ฉด ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€์ ์œผ๋กœ ๋˜์ง€๋งŒ ๋ณ„๋กœ ์“ธ๋ชจ์—†์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
110+
- ์ผ๋ถ€๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ถˆ๋ณ€์ ์ธ ํด๋ž˜์Šค์˜ ๊ฐ€๋ณ€์  ๋ฒ„์ „์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํด๋ž˜์Šค๋ฅผ ๋‘ ๊ฐ€์ง€ ์œ ์šฉํ•œ ๋””์ž์ธ ํŒจํ„ด์„ ํ†ตํ•ด ๋‹ค์šฉ๋„๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
111+
- ๋นŒํ„ฐ ํŒจํ„ด
112+
- ์“ฐ๊ธฐ ์‹œ ๋ณต์‚ฌ ํŒจํ„ด
113+
114+
#### ๋นŒ๋”ํŒจํ„ด
115+
- ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ๊ฐ’์ด ์„ ํƒ ์‚ฌํ•ญ์ธ ๊ฒฝ์šฐ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ’์„ ๋ชจ๋‘ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กญ๊ธฐ์—, ์ด ๊ฒฝ์šฐ ์„ธํ„ฐ ํ•จ์ˆ˜๋ณด๋‹จ ๋นŒ๋” ํŒจํ„ด์ด ๋‚ซ๋‹ค.
116+
- ๋นŒ๋” ํŒจํ„ด์€ ํ•œ ํด๋ž˜์Šค๋ฅผ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ–๋Š”๋‹ค
117+
- ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋นŒ๋” ํด๋ž˜์Šค
118+
- ๋นŒ๋”์— ์˜ํ•ด ์ž‘์„ฑ๋œ ๋ถˆ๋ณ€์ ์ธ ์ฝ๊ธฐ ์ „์šฉ ํด๋ž˜์Šค
119+
120+
```java
121+
class TextOptions {
122+
private final Font font;
123+
private final Double fontSize;
124+
125+
TextOptions(Font font, Double fontSize) {
126+
this.font = font;
127+
this.fontSize = fontSize;
128+
}
129+
130+
Font getFont() { // ๊ฒŒํ„ฐ ํ•จ์ˆ˜๋งŒ ๊ฐ–์Œ
131+
return font;
132+
}
133+
134+
Double getFontSize() {
135+
return fontSize;
136+
}
137+
}
138+
139+
class TextOptionsBuilder {
140+
private final Font font;
141+
private Double fontSize;
142+
143+
TextOptionsBuilder(Font font) { // ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํ•„์ˆ˜ ๊ฐ’ ์ „๋‹ฌ ๋ฐ›์Œ
144+
this.font = font;
145+
}
146+
147+
TextOptionsBuilder setFontSize(Double fontSize) { // ์„ธํ„ฐ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•„์ˆ˜์ ์ด์ง€ ์•Š์€ ๊ฐ’ ๋ฐ›์Œ
148+
this.fontSize = fontSize;
149+
return this;
150+
}
151+
152+
TextOptions build() { // ๋‹ค ์ •ํ•ด์ง„ ํ›„ ํ˜ธ์ถœ์ชฝ์—์„œ build ํ˜ธ์ถœ
153+
return new TextOptions(font, fontSize);
154+
}
155+
}
156+
```
157+
158+
- ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์‹œ
159+
160+
```java correct
161+
// ํฐํŠธ ์‚ฌ์ด์ฆˆ ์„ค์ • O
162+
TextOptions getDefaultTextOptions() {
163+
return new TextOptionsBuilder(Font.ARIAL)
164+
.setFontSize(12.0)
165+
.build();
166+
}
167+
168+
// ํฐํŠธ ์‚ฌ์ด์ฆˆ ์„ค์ • X
169+
TextOptions getDefaultTextOptions() {
170+
return new TextOptionsBuilder(Font.ARIAL)
171+
.build();
172+
}
173+
```
174+
175+
#### ์“ฐ๊ธฐ ์‹œ ๋ณต์‚ฌ ํŒจํ„ด
176+
- ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด ์“ฐ๊ธฐ ์‹œ ๋ณต์‚ฌ ํŒจํ„ด์ด๋‹ค
177+
```java
178+
class TextOptions {
179+
private final Font font;
180+
private final Double fontSize;
181+
182+
TextOptions(Font font) { // ํ•„์ˆ˜ ๊ฐ’ ๋ฐ›๋Š” ํผ๋ธ”๋ฆญ ์ƒ์„ฑ์ž
183+
this(font, null); // ํ”„๋ผ์ด๋น— ์ƒ์„ฑ์ž ํ˜ธ์ถœ
184+
}
185+
186+
private TextOptions(Font font, Double fontSize) { // ๋ชจ๋“ ๊ฐ’ ๋ฐ›๋Š” ํ”„๋ผ์ด๋น— ์ƒ์„ฑ์ž
187+
this.font = font;
188+
this.fontSize = fontSize;
189+
}
190+
191+
Font getFont() {
192+
return font;
193+
}
194+
195+
Double getFontSize() {
196+
return fontSize;
197+
}
198+
199+
TextOptions withFont(Font newFont) {
200+
return new TextOptions(newFont, fontSize); // ํฐํŠธ๋งŒ ๋ณ€๊ฒฝ๋œ ์ƒˆ ๊ฐ์ฒด ๋ฐ˜ํ™˜
201+
}
202+
203+
TextOptions withFontSize(Double newFontSize) {
204+
return new TextOptions(font, newFontSize); // ํฐํŠธ ์‚ฌ์ด์ฆˆ๋งŒ ๋ณ€๊ฒฝ๋œ ์ƒˆ ๊ฐ์ฒด ๋ฐ˜ํ™˜
205+
}
206+
}
207+
```
208+
209+
- ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์˜ˆ์‹œ
210+
```java correct
211+
TextOptions getDefaultTextOptions() {
212+
return new TextOptions(Font.ARIAL)
213+
.withFontSize(12.0);
214+
}
215+
216+
// ์ „์— ๋ณด์•˜๋˜ ๋ฌธ์ œ ์žˆ๋˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •
217+
void renderTitle(String title, TextOptions baseStyle) {
218+
titleField.display(
219+
title,
220+
baseStyle.withFontSize(18.0) // ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
221+
);
222+
}
223+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
---
2+
title: '๊ฐ์ฒด๋ฅผ ๊นŠ์€ ์ˆ˜์ค€๊นŒ์ง€ ๋ถˆ๋ณ€์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ผ'
3+
author: 'hyunwok'
4+
---
5+
6+
- ํด๋ž˜์Šค๊ฐ€ ์‹ค์ˆ˜๋กœ ๊ฐ€๋ณ€์ ์œผ๋กœ ๋  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ๊นŠ์€ ๊ฐ€๋ณ€์„ฑ ๋•Œ๋ฌธ์ด๋‹ค
7+
- ๋ฌด์‹ฌ์ฝ” ๊ฐ€๋ณ€์ ์œผ๋กœ ๋  ์ˆ˜ ์žˆ๋Š” ์ข€ ๋” ๋ฏธ๋ฌ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฝ๋‹ค.
8+
9+
### 7.2.1 ๊นŠ์€ ๊ฐ€๋ณ€์„ฑ์€ ์˜ค์šฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
10+
```java incorrect
11+
class TextOptions {
12+
private final List<Font> fontFamily; // ์—ฌ๋Ÿฌ ํฐํŠธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ
13+
private final Double fontSize;
14+
15+
TextOptions(List<Font> fontFamily, Double fontSize) {
16+
this.fontFamily = fontFamily;
17+
this.fontSize = fontSize;
18+
}
19+
20+
List<Font> getFontFamily() {
21+
return fontFamily;
22+
}
23+
24+
Double getFontSize() {
25+
return fontSize;
26+
}
27+
}
28+
```
29+
30+
- ์œ„ ์˜ˆ์ œ๋Š” ๊ธ€๊ผด ๋ฆฌ์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ธฐ์— ๋ฌด์˜์‹์ค‘์— ๊ฐ€๋ณ€์ ์œผ๋กœ ๋  ์ˆ˜ ์žˆ๋‹ค.
31+
- ์œ„ ํด๋ž˜์Šค๋Š” ๊ธ€๊ผด ๋ชฉ๋ก์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ธ€๊ผด ๋ชฉ๋ก์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.
32+
- ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ, ๊ธ€๊ผด ๋ชฉ๋ก์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋™์ผํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.
33+
34+
#### ์‹œ๋‚˜๋ฆฌ์˜ค A ์ฝ”๋“œ ์˜ˆ์ œ
35+
- ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธ€๊ผด ๋ชฉ๋ก์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
36+
37+
```java incorrect
38+
List<Font> fontFamily = [Font.ARIAL, Font.VERDANA];
39+
40+
TextOptions textOptions =
41+
new TextOptions(fontFamily, 12.0); // ์ƒˆ ์ธ์Šคํ„ด์Šค์— ๋ฆฌ์ŠคํŠธ ์ฐธ์กฐ๊ฐ€ ์ „๋‹ฌ๋จ
42+
43+
fontFamily.clear(); // ์ฐธ์กฐ๋กœ ์ธํ•ด ์•„๊นŒ ๋งŒ๋“  ์ƒˆ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’ ๋˜ํ•œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋จ
44+
fontFamily.add(Font.COMIC_SANS);
45+
```
46+
47+
#### ์‹œ๋‚˜๋ฆฌ์˜ค B ์ฝ”๋“œ ์˜ˆ์ œ
48+
- getFontFamily()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ธ€๊ผด ๋ชฉ๋ก์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ›๊ณ , ์ด๊ฑธ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉ๋ก์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
49+
50+
```java incorrect
51+
TextOptions textOptions =
52+
new TextOptions([Font.ARIAL, Font.VERDANA], 12.0);
53+
54+
List<Font> fontFamily = textOptions.getFontFamily(); // ์ƒˆ ์ธ์Šคํ„ด์Šค์˜ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ด
55+
fontFamily.clear(); // ์ƒˆ ๋ฆฌ์ŠคํŠธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒˆ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์˜ ๋ฆฌ์ŠคํŠธ ๋˜ํ•œ ์‚ฌ๋ผ์ง
56+
fontFamily.add(Font.COMIC_SANS);
57+
```
58+
59+
- ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ์˜ค์šฉํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๊ณ , ์ถ”ํ›„์—๋Š” ์ˆ˜์ •ํ•˜๋Š” ๊ฒŒ ์•ˆ์ „ํ•œ์ง€ ์ถ”์ ํ•˜๊ธฐ ๋˜ํ•œ ์‰ฝ์ง€ ์•Š์•„์ง„๋‹ค.
60+
61+
### 7.2.2 ํ•ด๊ฒฐ์ฑ…: ๋ฐฉ์–ด์ ์œผ๋กœ ๋ณต์‚ฌํ•˜๋ผ
62+
- ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
63+
- ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ์ง€๋งŒ, ๊นŠ์€ ๋ถˆ๋ณ€์„ฑ์„ ๋‹ด๋ณดํ•˜๊ธฐ ์œ„ํ•ด ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.
64+
65+
```java correct
66+
class TextOptions {
67+
private final List<Font> fontFamily;
68+
private final Double fontSize;
69+
70+
TextOptions(List<Font> fontFamily, Double fontSize) {
71+
this.fontFamily = List.copyOf(fontFamily);
72+
this.fontSize = fontSize;
73+
}
74+
75+
List<Font> getFontFamily() {
76+
return List.copyOf(fontFamily);
77+
}
78+
79+
Double getFontSize() {
80+
return fontSize;
81+
}
82+
}
83+
```
84+
85+
- ์ด๋Ÿฐ ๋ฐฉ์‹์ด ๊ฝค ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ๋„ ๋ช…ํ™•ํ•˜๋‹ค.
86+
- ๋ณต์‚ฌํ•˜๋Š”๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค, ๋งŒ์•ฝ ์ˆ˜๋ฐฑ๊ฐœ์˜ ํฐํŠธ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
87+
- ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณ€๊ฒฝ์„ ๋ง‰์•„์ฃผ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค, final์„ ์‚ฌ์šฉํ•œ๋‹ค ํ•ด๋„ ํด๋ž˜์Šค ๋‚ด์—์„œ๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
88+
89+
### 7.2.3 ํ•ด๊ฒฐ์ฑ…: ๋ถˆ๋ณ€์  ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ
90+
- ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋„๋ฆฌ ๋ฐ›์•„๋“ค์—ฌ์ง€๊ณ  ์žˆ๋Š” ์ข‹์€ ๊ด€ํ–‰์ด๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ ๋งŽ์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ๊ณตํ†ต ์œ ํ˜•์ด๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋ถˆ๋ณ€์ ์ธ ๋ฒ„์ „์„ ์ œ๊ณตํ•œ๋‹ค.
91+
- Java : ๊ตฌ์•„๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ImmutableList ํด๋ž˜์Šค
92+
- C# : System.Collections.Immutable์˜ ImmutableList ํด๋ž˜์Šค
93+
- JS ๊ธฐ๋ฐ˜ ์–ธ์–ด
94+
- Immutable.js ๋ชจ๋“ˆ์˜ ๋ฆฌ์ŠคํŠธ ํด๋ž˜์Šค
95+
- JS ๋ฐฐ์—ด์ด์ง€๋งŒ Immer ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๋ณ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ JS์˜ ๋ฐฐ์—ด
96+
97+
```java correct
98+
class TextOptions {
99+
private final ImmutableList<Font> fontFamily;
100+
private final Double fontSize;
101+
102+
TextOptions(ImmutableList<Font> fontFamily, Double fontSize) {
103+
this.fontFamily = fontFamily;
104+
this.fontSize = fontSize;
105+
}
106+
107+
ImmutableList<Font> getFontFamily() {
108+
return fontFamily;
109+
}
110+
111+
Double getFontSize() {
112+
return fontSize;
113+
}
114+
}
115+
```

0 commit comments

Comments
ย (0)