Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions ๊น€์ˆ˜๋นˆ/5์žฅ/item32.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
## ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๋ผ


### ๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฉ”์„œ๋“œ

ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€๋ณ€์ ์ธ ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›



๊ฐ€๋ณ€์ธ์ˆ˜(Varargs)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Java ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐ์—ด์„ ์ƒ์„ฑ

```java
public static void varargsExample(String... args) {
// args๋Š” ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌ๋จ
System.out.println("Length: " + args.length);
}
```
ํ˜ธ์ถœ์‹œ ์•„๋ž˜์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ

```java
varargsExample(new String[]{"A", "B", "C"});
```

### ์ด ๋ฐฐ์—ด์€ ๋‚ด๋ถ€๋กœ ๊ฐ์ถฐ์ ธ์•ผ ํ•˜๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ์— ๊ณต๊ฐœ๋˜๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.



๊ฐ€๋ณ€์ธ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ œ๋„ค๋ฆญ์ด๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์ด ํฌํ•จ๋˜๋ฉด ์ปดํŒŒ์ผ ๊ฒฝ๊ณ  ๋ฐœ์ƒ

warning: [unchecked] Possible heap pollution from

parameterized vararg type List<String>

<b>๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์˜ ๋ณ€์ˆ˜๊ฐ€ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ํž™ ์˜ค์—ผ์ด ๋ฐœ์ƒํ•œ๋‹ค.</b>



ex)
```java
static void dangerous(List<String>... stringLists) {
List<Integer> intList = List.of(42);
Object[] objects = stringLists;
objects[0] = intList; // ํž™ ์˜ค์—ผ ๋ฐœ์ƒ
String s = stringLists[0].get(0); // ClassCastException
}
```

๋งˆ์ง€๋ง‰ ์ค„์— ์ปดํŒŒ์ผ๋กœ๊ฐ€ ์ƒ์„ฑํ•œ ํ˜•๋ณ€ํ™˜์ด ์ˆจ์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ClassCastException ๋ฐœ์ƒ.
```java
String s = (String)stringLists[0].get(0); // ClassCastException
```





-> ์ด์ฒ˜๋Ÿผ ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๊นจ์ง€๋‹ˆ ์ œ๋„ค๋ฆญ ๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฐฐ์—ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.



### ์ œ๋„ค๋ฆญ ๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ์ด์œ ?

์‹ค๋ฌด์—์„œ ์œ ์šฉ!

์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ ์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฟ ์ œ๊ณต (ํƒ€์ž… ์•ˆ์ „)

ex. Arrays.asList(T... a), Collections.addAll(Collection<? super T> c, T... elements)



ํƒ€์ž… ์•ˆ์ „ํ•œ ๋ฉ”์„œ๋“œ์˜ ์กฐ๊ฑด

1. ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์— ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. ๊ทธ ๋ฐฐ์—ด์˜ ์ฐธ์กฐ๊ฐ€ ๋ฐ–์œผ๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

-> ๊ฐ€๋ณ€์ธ์ˆ˜(Varargs)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ์ฝ๊ณ  ์‚ฌ์šฉ๋งŒ ํ•  ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

(๊ฐ€๋ณ€์ธ์ˆ˜์˜ ๋ชฉ์  : ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ž„์˜์˜ ๊ฐœ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ „๋‹ฌ)



### @SafeVarargs

- ๋ฉ”์„œ๋“œ ์ž‘์„ฑ์ž๊ฐ€ ๊ทธ ๋ฉ”์„œ๋“œ๊ฐ€ ํƒ€์ž… ์•ˆ์ „ํ•จ์„ ๋ณด์žฅํ•˜๋Š” ์žฅ์น˜

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์•ฝ์†์„ ๋ฏฟ๊ณ  ๊ทธ ๋ฉ”์„œ๋“œ๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋” ์ด์ƒ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฉ”์„œ๋“œ๊ฐ€ ์•ˆ์ „ํ•œ ๊ฒŒ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ ˆ๋Œ€ @SafeVarargs ์• ๋„ˆํ…Œ์ด์…˜์„ ๋‹ฌ์•„์„œ๋Š” ์•ˆ ๋œ๋‹ค.



### ์ œ๋„ค๋ฆญ ๊ฐ€๋ณ€์ธ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ
```java
@SafeVarargs
static <T> List<T> flatten(List<? extends T>... lists) {
List<T> result = new ArrayList<>();
for (List<? extends T> list : lists)
result.addAll(list);
return result;
}
```

flatten ๋ฉ”์„œ๋“œ๋Š” ์ž„์˜ ๊ฐœ์ˆ˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„, ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ ๊ทธ ์•ˆ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋กœ ์˜ฎ๊ฒจ ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ด ๋ฉ”์„œ๋“œ์—๋Š” @SafeVarargs ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‹ฌ๋ ค์žˆ์œผ๋‹ˆ ์„ ์–ธํ•˜๋Š” ์ชฝ๊ณผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ ๋ชจ๋‘์—์„œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
์ œ๋„ค๋ฆญ์ด๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์˜ varargs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— @SafeVarargs ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์ž


### ์ œ๋„ค๋ฆญ varargs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ List๋กœ ๋Œ€์ฒดํ•œ ์˜ˆ - ํƒ€์ž… ์•ˆ์ „
```java
static <T> List<T> flatten(List<List<? extends T>> lists) {
List<T> result = new ArrayList<>();
for (List<? extends T> list : lists)
result.addAll(list);
return result;
}
```



### ์ •๋ฆฌ

๋ฉ”์„œ๋“œ์— ์ œ๋„ค๋ฆญ ๏ผˆํ˜น์€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ๏ผ‰ varargs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ๋จผ์ € ๊ทธ ๋ฉ”์„œ๋“œ๊ฐ€ ํƒ€์ž… ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•œ ๋‹ค์Œ

@SafeVarargs ์• ๋„ˆํ…Œ์ด์…˜์„ ๋‹ฌ์•„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ ๋ถˆํŽธํ•จ์ด ์—†๊ฒŒ๋” ํ•˜์ž.
87 changes: 87 additions & 0 deletions ๊น€์ˆ˜๋นˆ/8์žฅ/item53.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
## ๊ฐ€๋ณ€์ธ์ˆ˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•˜๋ผ

- ๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฉ”์„œ๋“œ : ๋ช…์‹œํ•œ ํƒ€์ž…์˜ ์ธ์ˆ˜๋ฅผ 0๊ฐœ ์ด์ƒ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

```java
static int sum(int...args){
int sum=0;
for(int arg:args)
sum+=arg;
return sum;
}
```

### ์ธ์ˆ˜๊ฐ€ 1๊ฐœ ์ด์ƒ์ด์–ด์•ผ ํ• ๋•Œ

- ์ž˜๋ชป ๊ตฌํ˜„ํ•œ ์˜ˆ

-- ์ธ์ˆ˜๋ฅผ 0๊ฐœ ๋„ฃ์–ด ํ˜ธ์ถœํ•˜๋ฉด ์ปดํŒŒ์ผ์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ์‹คํŒจ. ์ฝ”๋“œ ์ง€์ €๋ถ„

```java
static int min(int...args){
if(args.length=0)
throw new IllegalArgumentException("์ธ์ˆ˜๊ฐ€ 1๊ฐœ ์ด์ƒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.");

int min=args[0];
for(int i=1;i<args.length;i++)
if(args[i]<min)
min=args[i];
return min;
}
```

- ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

: ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 2๊ฐœ ๋ฐ›๊ธฐ - ํ•˜๋‚˜๋Š” ํ‰๋ฒ”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋‘๋ฒˆ์งธ๋Š” ๊ฐ€๋ณ€์ธ์ˆ˜
```java
static int min(int firstArg, int... remainingArgs) {
int min = firstArg; for (int arg : remainingArgs)
if (arg < min) min = arg; return min;
}
```


### ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•ด์•ผํ• ๋•Œ

: ๊ฐ€๋ณ€ ์ธ์ˆ˜ ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋ฐฐ์—ด์„ ์ƒˆ๋กœ ํ•˜๋‚˜ ํ• ๋‹นํ•˜๊ณ  ์ดˆ๊ธฐํ™” -> ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•˜๋ฉด ๊ฑธ๋ฆผ๋Œ์ด ๋  ์ˆ˜ ์žˆ์Œ

-> ๋‹ค์ค‘์ •์˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ
```java
public void foo() { }
public void foo(int a1) { }
public void food(int a1, int a2) { }
public void foo(int a1, int a2,int a3) { }
public void foo(int a1, int a2, int a3, int... rest) { }
```


- EnumSet์˜ ์ •์  ํŒฉํ„ฐ๋ฆฌ๋„ ์ด ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์—ด๊ฑฐ ํƒ€์ž… ์ง‘ํ•ฉ ์ƒ์„ฑ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•จ.
```java
EnumSet<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);
```

```java
public static <E extends Enum<E>> EnumSet<E> of(E e) {
EnumSet<E> result = noneOf(e.getDeclaringClass()); result.add(e);
return result;
}

...
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5){
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
result.add(e3);
result.add(e4);
result.add(e5);
return result;
}

@SafeVarargs public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
EnumSet<E> result = noneOf(first.getDeclaringClass());
result.add(first);
for (E e : rest) result.add(e);
return result;}
```


77 changes: 77 additions & 0 deletions ๊น€์ˆ˜๋นˆ/8์žฅ/item54.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
## null์ด ์•„๋‹Œ, ๋นˆ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ผ



- ๋”ฐ๋ผํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ฝ”๋“œ (์ปฌ๋ ‰์…˜์ด ๋น„์—ˆ์œผ๋ฉด null์„ ๋ฐ˜ํ™˜)
```java
private final List<Cheese> cheesesInStock = ...;
/**
* @return ๋งค์žฅ ์•ˆ์˜ ๋ชจ๋“  ์น˜์ฆˆ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
* ๋‹จ, ์žฌ๊ณ ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
*/
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? null
: new ArrayList<>(cheesesInStock);
}
```



-- null์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ญ์ƒ ๋ฐฉ์–ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค˜์•ผํ•จ, ๋ฐฉ์–ด์ฝ”๋“œ๋ฅผ ๋นผ๋จน์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ

getCheeses()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” null ํ™•์ธ์„ ์ถ”๊ฐ€๋กœ ํ•ด์•ผํ•œ๋‹ค.
```java
if (cheeses != null && cheeses.contains(Cheese.STILTON)) {
... }
```



### null ๋Œ€์‹  ๋นˆ ์ปฌ๋ ‰์…˜ ํ• ๋‹น์‹œ ๋น„์šฉ.

1. ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•ด๋„ ์‚ฌ์‹ค์ƒ ์‹ ๊ฒฝ ์“ธ ๋งŒํ•œ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

2. ๋นˆ ์ปฌ๋ ‰์…˜๊ณผ ๋ฐฐ์—ด์€ ์ƒˆ๋กœ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋นˆ ๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜ ๋ฐ˜ํ™˜ : Collections.emptyList(), Collections.emptySet(), Collections.emptyMap()

: ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ.



### ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ
```java
public List<Cheese> getCheeses() {
return new ArrayList<>(cheesesInStock);
}
```



### ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ
```java
public Cheese[] getCheeses() {
return cheesesInStock.toArray(new Cheese[0]);
}
```



- ์ตœ์ ํ™”
```java
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];

public Cheese[] getCheeses() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
```





### ํ•ต์‹ฌ ์ •๋ฆฌ

null์ด ์•„๋‹Œ, ๋นˆ ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•˜๋ผ. null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” API๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋„ ๋Š˜์–ด๋‚œ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์€ ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.
Loading