Skip to content

Commit 3a728c6

Browse files
authoredMay 16, 2021
Merge pull request #271 from hankkuu/br/hangyu
[#6][2κΈ°] λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•˜λΌ
2 parents 1d89514 + bdcce67 commit 3a728c6

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# item 6. λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•˜λΌ
2+
3+
[λ°±κΈ°μ„ λ‹˜ κ°•μ˜](https://www.youtube.com/watch?v=0yUxPUXS1pM&list=PLfI752FpVCS8e5ACdi5dpwLdlVkn0QgJJ&index=6)
4+
5+
[code1](https://github.com/keesun/study/blob/master/effective-java/item6.md)
6+
7+
[code2](https://github.com/WegraLee/effective-java-3e-source-code/tree/master/src/effectivejava/chapter2/item6)
8+
9+
---
10+
11+
## 1. μž¬μ‚¬μš©μ„±μ— λŒ€ν•œ 관점
12+
λ˜‘κ°™μ€ κΈ°λŠ₯의 객체λ₯Ό 맀번 μƒμ„±ν•˜κΈ°λ³΄λ‹€λŠ” 객체 ν•˜λ‚˜λ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 편이 μ’‹λ‹€
13+
14+
특히 λΆˆλ³€ κ°μ²΄λŠ” μ–Έμ œλ“  μž¬μ‚¬μš©ν•  수 μžˆλ‹€
15+
16+
μ•„λž˜μ™€ 같이 μƒμ„±μžλ₯Ό 톡해 String 객체λ₯Ό 맀번 λ§Œλ“€μ§€ 말아라
17+
```java
18+
String s = new String("bikini"); // 따라 ν•˜μ§€ 말 것
19+
String s = "bikini";
20+
```
21+
22+
μƒμ„±μžλ₯Ό 톡해 String 객체λ₯Ό λ§Œλ“€κ²Œ 되면 쓸데없이 String μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜λ³΅ν•΄μ„œ λ§Œλ“€κ²Œ λœλ‹€
23+
24+
Java의 가상머신은 λ˜‘κ°™μ€ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ— λŒ€ν•΄μ„œλŠ” 동일 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” μž¬μ‚¬μš©μ„±μ΄ 보μž₯λœλ‹€
25+
26+
μƒμ„±μžλ₯Ό 톡해 μƒμ„±ν•˜λŠ” 것 λŒ€μ‹ μ— 정적 νŒ©ν† λ¦¬ λ§€μ†Œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” λΆˆλ³€ ν΄λž˜μŠ€μ—μ„œλŠ” μž¬μ‚¬μš© ν•  수 μžˆλŠ” 객체 생성을 ν•  수 μžˆλ‹€
27+
28+
차이점이라면 μƒμ„±μžλŠ” 맀번 μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€μ§€λ§Œ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλŠ” 클래슀 내뢀에 ν•œλ²ˆ λ§Œλ“€μ–΄μ„œ 캐싱해놓고 μ‚¬μš©ν•  수 μžˆλ‹€ (미리 λ§Œλ“€μ–΄ λ†“μ€κ²Œ μžˆλ‹€λŠ” λΆ€λΆ„)
29+
30+
```java
31+
public class Main {
32+
/**
33+
* The {@code Boolean} object corresponding to the primitive
34+
* value {@code true}.
35+
*/
36+
public static final Boolean TRUE = Boolean.TRUE;
37+
38+
/**
39+
* The {@code Boolean} object corresponding to the primitive
40+
* value {@code false}.
41+
*/
42+
public static final Boolean FALSE = Boolean.FALSE;
43+
44+
public static void main(String[] args) {
45+
Boolean result = Main.valueOf(true);
46+
System.out.println(result);
47+
}
48+
49+
public static Boolean valueOf(boolean b) {
50+
return b ? Main.TRUE : Main.FALSE;
51+
}
52+
}
53+
54+
```
55+
56+
생성 λΉ„μš©μ΄ λΉ„μ‹Ό 객체가 λ°˜λ³΅ν•΄μ„œ μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ μΊμ‹±ν•΄μ„œ μž¬μ‚¬μš©ν•˜λŠ” κ±Έ ꢌμž₯ν•œλ‹€
57+
58+
생성 λΉ„μš©μ΄ λΉ„μ‹Έλ‹€λΌλŠ” 것은? (이전 μž‘μ„±μžλ“€ λ‚΄μš© μ°Έκ³ )
59+
1. μ‹œμŠ€ν…œμ˜ μžμ›μ„ 많이 λ¨ΉλŠ” λΆ€λΆ„
60+
1. λ©”λͺ¨λ¦¬
61+
2. λ””μŠ€ν¬ μ‚¬μš©λž‘
62+
3. λ„€νŠΈμ›Œν¬μ˜ λŒ€μ—­ν­
63+
2. λ°μ΄ν„°μ˜ 크기가 ν¬κ±°λ‚˜ 객체 내뢀에 μ—¬λŸ¬ 객체듀을 ν¬ν•¨ν•˜λŠ” κ²½μš°λ‚˜ λ‹¨μˆœ 생성/μ†Œλ©Έμ΄ μ•„λ‹Œ 연관관계가 λ³΅μž‘ν•œ λΆ€λΆ„
64+
1. 크기가 μ•„μ£Ό 큰 Array
65+
2. Database Connection
66+
3. I/O μž‘μ—…μ„ ν•„μš”λ‘œ ν•˜λŠ” Object
67+
3. (책에 λ‚˜μ˜€λŠ”) Expression Object의 Pattern
68+
69+
```java
70+
// μ΄λ ‡κ²Œ ν•˜λ©΄ 더 λŠλ¦¬λ‹€
71+
static boolean isRomanNumeralSlow(String s) {
72+
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
73+
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
74+
}
75+
76+
// 미리 컴파일 해놓은 객체λ₯Ό 뢈러 μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ°œμ„ ν–ˆλ‹€
77+
private static final Pattern ROMAN = Pattern.compile(
78+
"^(?=.)M*(C[MD]|D?C{0,3})"
79+
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
80+
81+
static boolean isRomanNumeralFast(String s) {
82+
return ROMAN.matcher(s).matches();
83+
}
84+
```
85+
86+
String.matchesκ°€ κ°€μž₯ μ‰½κ²Œ μ •κ·œ ν‘œν˜„μ‹μ— λ§€μΉ˜κ°€ λ˜λŠ”μ§€ ν™•μΈν•˜λŠ” 방법이긴 ν•˜μ§€λ§Œ μ„±λŠ₯이 μ€‘μš”ν•œ μƒν™©μ—μ„œ 반볡적으둜 μ‚¬μš©ν•˜κΈ°μ— μ μ ˆν•˜μ§€ μ•Šλ‹€
87+
88+
## 2. λΆˆλ³€ 객체λ₯Ό μž¬μ‚¬μš©ν•  λ•Œ μœ„ν—˜ν•œ λΆ€λΆ„
89+
90+
λΆˆλ³€ 객체인 κ²½μš°μ— μ•ˆμ •ν•˜κ²Œ μž¬μ‚¬μš©ν•˜λŠ” 것이 맀우 λͺ…ν™•ν•˜λ‹€ ν•˜μ§€λ§Œ λͺ‡λͺ‡ κ²½μš°μ— λΆ„λͺ…ν•˜μ§€ μ•Šμ€ κ²½μš°κ°€ μžˆλ‹€. μ–΄λŒ‘ν„°λ₯Ό 예둜 λ“€λ©΄, μ–΄λŒ‘ν„°λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œ 뒀에 μžˆλŠ” 객체둜 μ—°κ²°ν•΄μ£ΌλŠ” 객체라 μ—¬λŸ¬κ°œ λ§Œλ“€ ν•„μš”κ°€ μ—†λ‹€.
91+
92+
Map μΈν„°νŽ˜μ΄μŠ€κ°€ μ œκ³΅ν•˜λŠ” keySet은 Map이 뒀에 μžˆλŠ” Set μΈν„°νŽ˜μ΄μŠ€μ˜ λ·°λ₯Ό μ œκ³΅ν•œλ‹€. keySet을 ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ 객체가 λ‚˜μ˜¬κ±° κ°™μ§€λ§Œ 사싀 같은 객체λ₯Ό λ¦¬ν„΄ν•˜κΈ° λ•Œλ¬Έμ— 리턴 받은 Set νƒ€μž…μ˜ 객체λ₯Ό λ³€κ²½ν•˜λ©΄, 결ꡭ에 κ·Έ 뒀에 μžˆλŠ” Map 객체λ₯Ό λ³€κ²½ν•˜κ²Œ λœλ‹€.
93+
94+
```java
95+
public class UsingKeySet {
96+
public static void main(String[] args) {
97+
Map<String, Integer> menu = new HashMap<>();
98+
menu.put("Burger", 8);
99+
menu.put("Pizza", 9);
100+
101+
Set<String> names1 = menu.keySet();
102+
Set<String> names2 = menu.keySet();
103+
104+
// μž¬μ‚¬μš©ν•˜λŠ” μ „μ—­μ—μ„œ μ‚¬μš©ν•˜λŠ” Map일 경우 λ‹€λ₯Έ μͺ½μ—λ„ 영ν–₯을 쀄 수 μžˆλ‹€
105+
names1.remove("Burger");
106+
System.out.println(names2.size()); // 1
107+
System.out.println(menu.size()); // 1
108+
}
109+
}
110+
```
111+
112+
## 3. 아무생각없이 μ‚¬μš©ν•˜λ©΄ λ¬Έμ œλ˜λŠ” 뢀뢄인 μ˜€ν† λ°•μ‹±/μ–Έλ°•μ‹±
113+
114+
λΆˆν•„μš”ν•œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 또 λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ μ˜€ν† λ°•μ‹±μ΄ μžˆλ‹€. μ˜€ν† λ°•μ‹±μ€ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ ν”„λ¦¬λ―Έν‹°λΈŒ νƒ€μž…κ³Ό λ°•μŠ€ νƒ€μž…μ„ μ„žμ–΄ μ“Έ 수 있게 ν•΄μ£Όκ³  λ°•μ‹±κ³Ό 언박싱을 μžλ™μœΌλ‘œ ν•΄μ€€λ‹€.
115+
116+
μ˜€ν† λ°•μ‹±μ€ ν”„λ¦¬λ―Έν‹°λΈŒ νƒ€μž…κ³Ό λ°•μŠ€ νƒ€μž…μ˜ 경계가 μ•ˆλ³΄μ΄κ²Œ ν•΄μ£Όμ§€λ§Œ κ·Έλ ‡λ‹€κ³  κ·Έ 경계λ₯Ό μ—†μ• μ£Όμ§„ μ•ŠλŠ”λ‹€.
117+
118+
```java
119+
public class AutoBoxingExample {
120+
public static void main(String[] args) {
121+
long start = System.currentTimeMillis();
122+
Long sum = 0l;
123+
for (long i = 0 ; i <= Integer.MAX_VALUE ; i++) {
124+
sum += i;
125+
}
126+
System.out.println(sum);
127+
System.out.println(System.currentTimeMillis() - start);
128+
}
129+
}
130+
```
131+
μœ„ μ½”λ“œμ—μ„œ sum λ³€μˆ˜μ˜ νƒ€μž…μ„ Long으둜 λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ— λΆˆν•„μš”ν•œ Long 객체λ₯Ό 2의 31 제곱개 만큼 λ§Œλ“€κ²Œ 되고 λŒ€λž΅ 6초 쑰금 λ„˜κ²Œ κ±Έλ¦°λ‹€. νƒ€μž…μ„ ν”„λ¦¬λ―Έν‹°λΈŒ νƒ€μž…μœΌλ‘œ λ°”κΎΈλ©΄ 600 λ°€λ¦¬μ΄ˆλ‘œ μ•½ 10λ°° μ΄μƒμ˜ 차이가 λ‚œλ‹€.
132+
133+
λΆˆν•„μš”ν•œ μ˜€ν† λ°•μ‹±μ„ ν”Όν•˜λ €λ©΄ λ°•μŠ€ νƒ€μž… λ³΄λ‹€λŠ” ν”„λ¦¬λ―Έν‹°λΈŒ νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
134+
135+
## 4. ν”„λ‘œκ·Έλž˜λ¨Έμ˜ 톡찰λ ₯이 ν•„μš”ν•œ λΆ€λΆ„
136+
137+
객체생성은 λΉ„μ‹Έλ‹ˆ ν”Όν•΄μ•Ό ν•œλ‹€λ‘œ μ˜€ν•΄ν•˜λ©΄ μ•ˆλœλ‹€. 특히 JVMμ—μ„œλŠ” 별닀λ₯Έ 일을 ν•˜μ§€ μ•ŠλŠ” μž‘μ€ 객체에 λŒ€ν•΄μ„œλŠ” 큰 뢀담이 λ˜μ§€ μ•ŠλŠ”λ‹€κ³  ν•œλ‹€
138+
139+
ν”„λ‘œκ·Έλž¨μ˜ λͺ…ν™•μ„±, κ°„κ²°μ„±, κΈ°λŠ₯을 μœ„ν•΄μ„œλŠ” 객체λ₯Ό μΆ”κ°€λ‘œ λ§Œλ“€ μˆ˜λ„ μžˆμ–΄μ•Ό ν•œλ‹€
140+
141+
또 객체 생성을 효율적으둜 해보겠닀고 μ‚¬μ†Œν•œ 것듀도 λ‹€ μΊμ‹±ν•˜κ±°λ‚˜ 자체 ν’€(pool)을 λ§Œλ“€μ–΄μ„œ μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ–΄λ €μš΄ λ³΅μž‘ν•œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“œλŠ” 것도 ν”Όν•΄μ•Ό ν•˜λŠ” 뢀뢄이닀 (JVMμ—κ²Œ μœ„μž„ν•  뢀뢄은 μœ„μž„ν•΄λΌ κ°€λΉ„μ§€ 컬렉터λ₯Ό μ‹ λ’°ν•˜μž)
142+
143+
[Item50]방어적 볡사(defensive copy) 와 λŒ€λΉ„λ˜λŠ” λ‚΄μš©μ΄κΈ° λ•Œλ¬Έμ— 객체 생성을 ν•΄μ•Όν•˜λŠ” κ²½μš°μ™€ ν•˜μ§€ μ•Šκ³  κΈ°μ‘΄ 것을 μž¬μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 뢀뢄은 개발자의 μ—­λŸ‰μ— λ‹¬λ €μžˆλ‹€ (ν˜Ήμ€ μ„±λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό 직접 ν•΄μ„œ 비ꡐ해보아라)
144+
145+
μƒˆλ‘œ λ§Œλ“  μƒμ„±μžκ°€ ν•„μš”ν•œ κ²½μš°μ™€ μž¬μ‚¬μš© κ°€λŠ₯ν•œ λΆˆλ³€ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” ꡬ뢄을 ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€

0 commit comments

Comments
 (0)
Please sign in to comment.