61. ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ๋ณด๋ค๋ ๊ธฐ๋ณธ ํ์ ์ ์ฌ์ฉํ๊ธฐ
int, double, boolean ๐ ๊ธฐ๋ณธํ์
String, List ๐ ์ฐธ์กฐํ์
Integer, Double, Boolean ๐ ๊ฐ๊ฐ์ ๊ธฐ๋ณธ ํ์ ์ ๋์ํ๋ ์ฐธ์กฐํ์ ๐ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์
โณ๏ธ ๊ธฐ๋ณธ ํ์ ๊ณผ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ์ฐจ์ด์
- ๊ธฐ๋ณธ ํ์
์ ๊ฐ๋ง ๊ฐ์ง๊ณ ์์ผ๋, ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์
์ ๊ฐ์ ๋ํด ์๋ณ์ฑ์ด๋ ์์ฑ์ ๊ฐ์ง
๐ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ๋ ์ธ์คํด์ค๋ ๊ฐ์ด ๊ฐ์๋ ์๋ก ๋ค๋ฅด๋ค๊ณ ์๋ณ๋ ์ ์์ - ๊ธฐ๋ณธ ํ์ ์ ๊ฐ์ ์ธ์ ๋ ์ ํจํ๋, ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ์ ํจํ์ง ์์ ๊ฐ์ธ null์ ๊ฐ์ง ์ ์์
- ๊ธฐ๋ณธ ํ์ ์ด ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ๋ณด๋ค ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฉด์์ ๋ ํจ์จ์
โณ๏ธ ์ฃผ์ํด์ผํ ์
Comparator<Integer> naturalOrder =
(i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
naturalOrder.compare(new Integer(42), new Integer(42)) ๐ ๋ Integer ์ธ์คํด์ค ๊ฐ์ด 42๋ก ๊ฐ์ผ๋ฏ๋ก 0์ ์ถ๋ ฅํ ๊ฒ ๊ฐ์ง๋ง, ์ค์ ๋ก๋ 1์ ์ถ๋ ฅํจ (์ฒซ ๋ฒ์งธ Integer๊ฐ ๋ ๋ฒ์งธ๋ณด๋ค ํฌ๋ค๋ ๋ป)
- ์ฒซ ๋ฒ์งธ ๊ฒ์ฌ์ธ (i < j)๋ ์ ์๋ํ๋, i์ j๊ฐ ์ฐธ์กฐํ๋ ์คํ ๋ฐ์ฑ๋ Integer ์ธ์คํด์ค๋ ๊ธฐ๋ณธ ํ์
๊ฐ์ผ๋ก ๋ณํ๋๊ณ ์ฒซ ๋ฒ์งธ ์ ์ซ๊ฐ์ด ๋ ๋ฒ์งธ ๊ฐ๋ณด๋ค ์์์ง ํ๊ฐ
์์ง ์์ผ๋ฉด ๋ ๋ฒ์งธ ๊ฒ์ฌ์ธ (i==j)๊ฐ ์ด๋ฃจ์ด์ง๋๋ฐ, ์ด ๊ฒ์ฌ์์ ๋ ๊ฐ์ฒด ์ฐธ์กฐ์ ์๋ณ์ฑ์ ๊ฒ์ฌํ๊ฒ ๋จ - i์ j๊ฐ ๊ฐ์ ๊ฐ๋๋ผ๋ ์๋ก ๋ค๋ฅธ Integer ์ธ์คํด์ค๋ผ๋ฉด ๋น๊ต ๊ฒฐ๊ณผ false๊ฐ ๋๊ณ , ๋น๊ต์๋ 1์ ๋ฐํ
- ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ์ง ์๊ณ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ == ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ ๋ฐ์
๐ท ํด๊ฒฐ๋ฒ
- ๊ธฐ๋ณธ ํ์ ์ ๋ค๋ฃจ๋ ๋น๊ต์๊ฐ ํ์ํ๋ฉด Comparator.naturalOrder() ์ฌ์ฉ
- ์ง์ญ๋ณ์ 2๊ฐ๋ฅผ ๋์ด ๊ฐ๊ฐ ๋ฐ์ฑ๋ Integer ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๊ธฐ๋ณธ ํ์ ์ ์๋ก ์ ์ฅํ ๋ค์, ๋ชจ๋ ๋น๊ต๋ฅผ ์ด ๊ธฐ๋ณธ ํ์ ๋ณ์๋ก ์ํ
Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> {
int i = iBoxed, j = jBoxed;
return i < j ? -1 : (i == j ? 0 : 1);
};
public Class Unbelievable {
static Integer i;
public static void main(String[] args){
if (i==42) // Integer์ int๋ฅผ ๋น๊ต -> NullPointerException ๋ฐ์
System.out.println("Unbelievable !");
}
}
- ๊ธฐ๋ณธ ํ์ ๊ณผ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ํผ์ฉํ ์ฐ์ฐ์์๋ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ฑ์ด ์๋์ผ๋ก ํ๋ฆผ
- null ์ฐธ์กฐ๋ฅผ ์ธ๋ฐ์ฑํ๋ฉด NullPointerException ๋ฐ์ (i์ ์ด๊น๊ฐ์ด null)
public static void main(String[] args){
Long sum = 0L; // ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์
์ผ๋ก ์ ์ธํ์ฌ ๋๋ ค์ง
for (long i=0; i<=Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
- ๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ์ด ๋ฐ๋ณตํด์ ์ผ์ด๋๋ฉด ์ฑ๋ฅ์ด ๋๋ ค์ง
โณ๏ธ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ์จ์ผ ํ๋ ๊ฒฝ์ฐ
- ์ปฌ๋ ์ ์ ์์, ํค, ๊ฐ ๐ ์ปฌ๋ ์ ์ ๊ธฐ๋ณธ ํ์ ์ ๋ด์ ์ ์์ผ๋ฏ๋ก ์ด์ฉ ์ ์์ด ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ฌ์ฉ
- ๋งค๊ฐ๋ณ์ํ ํ์ ์ด๋ ๋งค๊ฐ๋ณ์ํ ๋ฉ์๋์ ํ์ ๋งค๊ฐ๋ณ์ ๐ ์๋ฐ๊ฐ ํ์ ๋งค๊ฐ๋ณ์๋ก ๊ธฐ๋ณธ ํ์ ์ง์ X
public class Box<T> { // T๋ ํ์
๋งค๊ฐ๋ณ์
private T item;
public void set(T item) {
this.item = item;
}
public T get() {
return item;
}
}
public class Utils {
// T๋ ๋ฉ์๋์ ํ์
๋งค๊ฐ๋ณ์
public static <T> void print(T item) {
System.out.println(item);
}
public static <T> T getFirst(T[] items) {
return items[0];
}
}
public class Main {
public static void main(String[] args) {
Utils.print("Hello"); // T๋ฅผ String์ผ๋ก ์ถ๋ก
Utils.print(42); // T๋ฅผ Integer๋ก ์ถ๋ก
String[] names = {"Alice", "Bob"};
String first = Utils.getFirst(names); // T๋ฅผ String์ผ๋ก ์ถ๋ก
System.out.println(first); // ์ถ๋ ฅ: Alice
}
}
- ๋ฆฌํ๋ ์ ์ ํตํด ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ
62. ๋ค๋ฅธ ํ์ ์ด ์ ์ ํ๋ค๋ฉด ๋ฌธ์์ด ์ฌ์ฉ ํผํ๊ธฐ
๋ฌธ์์ด์ ์๋ชป ์ฌ์ฉํ๋ฉด ๋ฒ๊ฑฐ๋ฝ๊ณ , ๋ ์ ์ฐํ๊ณ , ๋๋ฆฌ๊ณ , ์ค๋ฅ ๊ฐ๋ฅ์ฑ๋ ํผ
- ๋ฌธ์์ด์ ๋ค๋ฅธ ๊ฐ ํ์ ์ ๋์ ํ๊ธฐ์ ์ ํฉํ์ง X
- ์ด๊ฑฐ ํ์ ์ ๋์ ํ๊ธฐ์ ์ ํฉํ์ง X
- ํผํฉ ํ์ ์ ๋์ ํ๊ธฐ์ ์ ํฉํ์ง X ๐ ์ฌ๋ฌ ์์๊ฐ ํผํฉ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ฌธ์์ด๋ก ํํํ๋ ๊ฒ์ ์ข์ง X
- ๊ถํ์ ํํํ๊ธฐ์ ์ ํฉํ์ง X
public class ThreadLocal {
private ThreadLocal() { } // ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ
// ํ ์ค๋ ๋์ ๊ฐ์ ํค๋ก ๊ตฌ๋ถํด ์ ์ฅ
public static void set(String key, Object value);
// (ํค๊ฐ ๊ฐ๋ฆฌํค๋) ํ ์ค๋ ๋์ ๊ฐ ๋ฐํ
public static Object get(String key);
}
๐ ์ค๋ ๋ ๊ตฌ๋ถ์ฉ ๋ฌธ์์ด ํค๊ฐ ์ ์ญ ์ด๋ฆ ๊ณต๊ฐ์์ ๊ณต์ ๋๋ฏ๋ก ์๋๋๋ก ๋์ํ๋ ค๋ฉด ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ๊ณ ์ ํ ํค๋ฅผ ์ ๊ณตํด์ผ ํจ
// ๋งค๊ฐ๋ณ์ํํ์ฌ ํ์
์์ ์ฑ ํ๋ณด
public final class ThreadLocal<T> {
public ThreadLocal();
public void set(T value);
public T get();
}
63. ๋ฌธ์์ด ์ฐ๊ฒฐ์ ๋๋ฆฌ๋ ์ฃผ์ํ๊ธฐ
์ฑ๋ฅ์ ์ ๊ฒฝ ์จ์ผ ํ๋ค๋ฉด ๋ง์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ ๋๋ ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์ (+) ํผํ๊ธฐ
๋์ , StringBuilder์ append ๋ฉ์๋ ์ฌ์ฉ, ๋ฌธ์ ๋ฐฐ์ด ์ฌ์ฉ, ๋ฌธ์์ด์ ํ๋์ฉ ์ฒ๋ฆฌํ๋ ๋ฑ ๋ค๋ฅธ ๋ฐฉ๋ฒ ์ ํ
- ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์๋ก ๋ฌธ์์ด n๊ฐ๋ฅผ ์๋ ์๊ฐ์ n^2์ ๋น๋กํจ
- ๋ฌธ์์ด์ ๋ถ๋ณ์ด๋ผ์ ๋ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ ์์ชฝ์ ๋ด์ฉ์ ๋ชจ๋ ๋ณต์ฌํด์ผ ํจ
- String ๋์ StringBuilder ์ฌ์ฉํ๊ธฐ ๐ ์ฑ๋ฅ ํฌ๊ฒ ๊ฐ์ ๋จ !
public String statement2() {
StringBuilder sb = new StringBuilder(numItems() * LINE_WIDTH);
for(int i=0; i<numItems(); i++){
sb.append(lineForItem(i));
}
return sb.toString();
}
64.๊ฐ์ฒด๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ์ฐธ์กฐํ๊ธฐ
- ์ ํฉํ ์ธํฐํ์ด์ค๋ง ์๋ค๋ฉด ๋งค๊ฐ๋ณ์๋ฟ ์๋๋ผ ๋ฐํ๊ฐ, ๋ณ์, ํ๋๋ฅผ ์ ๋ถ ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์ ์ธ
// ์ธํฐํ์ด์ค ํ์
์ผ๋ก ์ฌ์ฉ ๐ ๊ถ์ฅ
Set<Son> sonSet = new LinkedHashSet<>();
// ํด๋์ค ํ์
์ผ๋ก ์ฌ์ฉ
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();
- ๋์ค์ ๊ตฌํ ํด๋์ค๋ฅผ ๊ต์ฒดํ๊ณ ์ ํ๋ค๋ฉด ๊ทธ์ ์ ํด๋์ค์ ์์ฑ์ ํน์ ๋ค๋ฅธ ์ ์ ํฉํ ๋ฆฌ๋ฅผ ํธ์ถํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋จ
Set<Son> sonSet = new HashSet<>();
โณ๏ธ ์ ํฉํ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋์ค๋ก ์ฐธ์กฐ
- String, BigInteger์ ๊ฐ์ ๊ฐ ํด๋์ค
- ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ค ๐ OutputStream ๋ฑ java.io ํจํค์ง์ ์ฌ๋ฌ ํด๋์ค
- ์ธํฐํ์ด์ค์๋ ์๋ ํน๋ณํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ํด๋์ค ๐ PriorityQueue ํด๋์ค์ comparator ๋ฉ์๋
'Java > ๐ Effective Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๐ Effective Java] ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์์น ไธ (0) | 2024.11.19 |
---|---|
[๐Effective Java] ์ด๊ฑฐ ํ์ ๊ณผ ์ด๋ ธํ ์ด์ ไธ (1) | 2024.11.18 |
[๐ Effective Java] ์ด๊ฑฐ ํ์ ๊ณผ ์ด๋ ธํ ์ด์ ไธ (0) | 2024.11.10 |
[๐ Effective Java] ์ ๋ค๋ฆญ ไธ (0) | 2024.10.12 |
[๐ Effective Java] ํด๋์ค์ ์ธํฐํ์ด์ค ไธ (1) | 2024.10.06 |