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
Empty file removed κΉ€ν˜„μ’…/delete_me
Empty file.
18 changes: 0 additions & 18 deletions ν•˜μ€ν˜œ/3μ£Όμ°¨ item 6~8.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@
```

- μžλ°”λ… 생성 μ‹œ, μƒμ„±μžλŠ” μƒμ„±μžμ˜ μ˜μ—­μ΄ λ”°λ‘œ μ‘΄μž¬ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μ–΄λ–»κ²Œ 생성할 수 μžˆλŠ” μ§€λ₯Ό ν•œ λˆˆμ— λ³Ό 수 μžˆλŠ” 반면 정적 νŒ©ν† λ¦¬ λ§€μ„œλ“œλŠ” λ©”μ„œλ“œ 뢀뢄에 λ“€μ–΄κ°€ μžˆμ–΄ ν•΄λ‹Ή ν΄λž˜μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œκ°€ λ§Žμ•„μ§€λŠ” 경우 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ£ΌλŠ” μš©λ„μ˜ λ©”μ„œλ“œλ₯Ό μ°ΎκΈ°κ°€ μ–΄λ ΅κ²Œ λ μˆ˜λ„ μžˆλ‹€.
![image.png](image/javadoc_settings.png)
![image.png](../image/javadoc_settings.png)

- 이에 μ±…μ—μ„œλŠ” 넀이밍 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ μ•Œμ•„λ³΄κΈ° μ‰½κ²Œ ν•˜λŠ” 것과 λ¬Έμ„œν™”λ₯Ό μ œμ•ˆν•˜κ³  μžˆλ‹€. λ¬Έμ„œν™”μ˜ μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™λ‹€.
```java
Expand All @@ -405,4 +405,4 @@

}
```
![image.png](image/javadoc_settings2.png)
![image.png](../image/javadoc_settings2.png)
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# ITEM 9. try-finally 보닀 try-with-resoucesλ₯Ό μ‚¬μš©ν•˜λΌ

> **κΌ­ νšŒμˆ˜ν•΄μ•Όν•˜λŠ” μžμ›μ„ λ‹€λ£° λ•ŒλŠ” try-finally 말고, try-with-resourcesλ₯Ό μ‚¬μš©ν•˜μž. μ˜ˆμ™ΈλŠ” μ—†λ‹€. μ½”λ“œλŠ” 더 μ§§κ³  λΆ„λͺ…ν•΄μ§€κ³ , λ§Œλ“€μ–΄μ§€λŠ” μ˜ˆμ™Έ 정보도 훨씬 μœ μš©ν•˜λ‹€. try-finally둜 μž‘μ„±ν•˜λ©΄ μ‹€μš©μ μ΄μ§€ λͺ»ν•  만큼 μ½”λ“œκ°€ μ§€μ €λΆ„ν•΄μ§€λŠ” κ²½μš°λΌλ„, try-with-resourcesλ‘œλŠ” μ •ν™•ν•˜κ³  μ‰½κ²Œ μžμ›μ„ νšŒμˆ˜ν•  수 μžˆλ‹€.**

## Try-Finally

- try-finallyλŠ” 더이상 μ΅œμ„ μ˜ 방법이 μ•„λ‹ˆλ‹€.(μžλ°”7λΆ€ν„°)
- μ΄μ „μ—λŠ” try-finally ꡬ문을 μ΄μš©ν•΄μ„œ μžμ›μ„ νšŒμˆ˜ν•˜λŠ” κ²½μš°κ°€ λ§Žμ•˜λŠ”λ°, νšŒμˆ˜ν•΄μ•Ό ν•  μžμ›μ΄ λ§Žμ•„μ§€λ©΄ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€λ©΄μ„œ 가독성이 λ‚˜λΉ μ§€κ³  μžμ›μ„ μ œλŒ€λ‘œ νšŒμˆ˜ν•˜μ§€ λͺ»ν•  수 μžˆλ‹€.

```java
// μ½”λ“œ 9-1 : κ°„λ‹¨ν•œ try-finally 예제
// 문제 없이 μ •μƒλ™μž‘ν•œλ‹€.
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
}finally {
br.close();
}
}
```

```java
// μ½”λ“œ 9-2 : νšŒμˆ˜ν•΄μ•Όν•  μžμ›μ΄ λ‘˜ 이상인 try-finally 예제
// μ½”λ“œκ°€ λ³΅μž‘ν•΄μ Έ 가독성이 λ‚˜λΉ μ§„λ‹€.
public class Copy {

private static final int BUFFER_SIZE = 8 * 1024;

static void copy(String src, String dst) throws IOException {

FileInputStream in = new FileInputStream(src);
try {
FileOutputStream out = new FileOutputStream(dst);
try {
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n = in.read(buf)) >= 0)
out.write(buf, 0, n);
}finally {
out.close();
}
}finally {
in.close();
}

}

}
```

```java
// 단일 try-finally둜 κ΅¬μ„±ν•œ 예제
// 였λ₯˜ λ°œμƒ μ‹œ μžμ›μ΄ μ œλŒ€λ‘œ νšŒμˆ˜λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.
static void copyLeak(String src, String dst) throws IOException {
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dst);
try {
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n = in.read(buf)) >= 0)
out.write(buf, 0, n);
}finally {
// μ—¬κΈ°μ„œ μ—λŸ¬ λ°œμƒν•˜λ©΄
out.close();
// 이건 μ‹€ν–‰ μ•ˆλ¨.
in.close();
}
}
```

## Try-With-Resources

- try-with-resourcesλ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ 더 μ§§κ³  λΆ„λͺ…ν•˜λ‹€.

```java
static String firstLineOfFileWithResources(String path) throws IOException {
try(BufferedReader br = new BadBufferReader(new FileReader(path));) {
return br.readLine();
}
}
```

- λ§Œλ“€μ–΄μ§€λŠ” μ˜ˆμ™Έ 정보도 훨씬 μœ μš©ν•˜λ‹€.
- try-finally둜 μž‘μ„±ν•  경우, 첫번째 λ°œμƒν•œ μ˜ˆμ™ΈλŠ” 보여주지 μ•Šκ³ , λ§ˆμ§€λ§‰ μ˜ˆμ™Έλ§Œ λ³΄μ—¬μ§€λŠ” ν˜•νƒœκ°€ λœλ‹€
- ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” 첫번째 λ°œμƒν•œ μ˜ˆμ™Έκ°€ 후속 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” κ²½μš°κ°€ λ§Žμ•„ μ–΄λ–€ μ§€μ μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒλ˜μ—ˆλŠ”μ§€λ₯Ό λͺ…ν™•ν•˜κ²Œ νŒŒμ•…ν•˜κΈ° μœ„ν•΄μ„œλŠ” 첫번째 λ°œμƒν•œ μ˜ˆμ™Έκ°€ μ€‘μš”ν•˜λ‹€.
- try-with-resources λͺ¨λ“  μ˜ˆμ™Έλ₯Ό 보여쀀닀.
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# ITEM 10. equalsλŠ” 일반 κ·œμ•½μ„ μ§€μΌœ μž¬μ •μ˜ν•˜λΌ

> **κΌ­ ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ equalsλ₯Ό μž¬μ •μ˜ν•˜μ§€ 말자. λ§Žμ€ κ²½μš°μ— Object의 equalsκ°€ μ—¬λŸ¬λΆ„μ΄ μ›ν•˜λŠ” 비ꡐλ₯Ό μ •ν™•νžˆ μˆ˜ν–‰ν•΄μ€€λ‹€. μž¬μ •μ˜ν•΄μ•Ό ν•  λ•ŒλŠ” κ·Έ 클래슀의 핡심 ν•„λ“œ λͺ¨λ‘λ₯Ό 빠짐없이, λ‹€μ„― κ°€μ§€ κ·œμ•½μ„ ν™•μ‹€νžˆ μ§€μΌœκ°€λ©° 비ꡐ해야 ν•œλ‹€.**

## equalsλ₯Ό μž¬μ •μ˜ ν•˜μ§€ μ•ŠλŠ” 것이 μ΅œμ„ 

- λ‹€μŒμ˜ κ²½μš°μ— ν•΄λ‹Ήν•œλ‹€λ©΄ equalsλ₯Ό μž¬μ •μ˜ ν•  ν•„μš”κ°€ μ—†λ‹€.
- 각 μΈμŠ€ν„΄μŠ€κ°€ 본질적으둜 κ³ μœ ν•˜λ‹€.
- μΈμŠ€ν„΄μŠ€μ˜ β€˜λ…Όλ¦¬μ  λ™μΉ˜μ„±β€™μ„ 검사할 ν•„μš”κ°€ μ—†λ‹€.
- Stringκ³Ό 같은 μžλ£Œν˜•
- μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•œ equlsκ°€ ν•˜μœ„ ν΄λž˜μŠ€μ—λ„ μ μ ˆν•˜λ‹€.
- listλ‚˜ set의 경우, listλŠ” abstract list에 set은 abstract set에 κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€.
- ν΄λž˜μŠ€κ°€ privateμ΄κ±°λ‚˜ package-private이고 equals λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  일이 μ—†λ‹€.
- publicν΄λž˜μŠ€λŠ” ν•΄λ‹Ή 클래슀λ₯Ό μ΄μš©ν•΄ equals λ©”μ„œλ“œκ°€ 호좜될 일이 μžˆμ„ μ§€ 아닐 μ§€ μ•Œ μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— equals λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šμ„ 것이라 μž₯λ‹΄ν•  수 μ—†λ‹€. ν•˜μ§€λ§Œ μ œν•œλ˜μ–΄ μžˆλŠ” 클래슀인 경우, equalsλ₯Ό μ•ˆμ“ΈκΊΌλΌλŠ” 것을 μ–΄λŠμ •λ„ 보μž₯ν•  수 μžˆλ‹€.
- equalsλ₯Ό μž¬μ •μ˜ ν•΄μ•Ό ν•˜λŠ” 경우
- 객체 식별성(object identity, 두 객체가 물리적으둜 같은가)이 μ•„λ‹Œ β€œλ…Όλ¦¬μ  λ™μΉ˜μ„±β€μ„ 확인해야 ν•˜λŠ”λ°, μƒμœ„ 클래슀의 equalsκ°€ 논리적 λ™μΉ˜μ„±μ„ λΉ„κ΅ν•˜λ„λ‘ μž¬μ •μ˜ λ˜μ§€ μ•Šμ•˜μ„ λ•Œ (주둜 κ°’ 클래슀)

## equals κ·œμ•½

- λ°˜μ‚¬μ„± : A.equals(A) == true
- λŒ€μΉ­μ„± : A.equals(B) == B.equals(A)
- CaseInsensitiveString
- Date와 TimestampλŠ” 이 λŒ€μΉ­μ„± κ·œμ•½μ΄ κΉ¨μ Έμžˆλ‹€.(λ‘˜μ€ 상속관계)
- μ•ˆμ •μ μœΌλ‘œ λŒ€μΉ­μ„±μ΄ μœ μ§€λœ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μ‹Άλ‹€λ©΄ 상속관계λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•˜μ—¬ 각각의 ν•„λ“œκ°€ 같은지 ν™•μΈν•˜λŠ” μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€.
- 좔이성 : A.equals(B) && B.equal(C), A.equals(C)
- Point, ColorPoint(inherit), CounterPointer, ColorPoint(comp)
- 일관성 : A.equals(B) == A.equals(B)
- 일관성을 μ§€ν‚€κ³  μ‹Άλ‹€λ©΄ λ„ˆλ¬΄ λ³΅μž‘ν•˜κ²Œ κ΅¬μ„±ν•˜λ©΄ μ•ˆλœλ‹€.
- λ³΅μž‘ν•˜κ²Œ λ˜μ–΄μžˆλŠ” μ˜ˆμ‹œλ‘œλŠ” URL에 μžˆλŠ” equals 이닀. URL에 μžˆλŠ” equalsλŠ” κ·Έ URL이 κ°€λ₯΄ν‚€λŠ” ipκΉŒμ§€λ₯Ό ν™•μΈν•˜κΈ° λ•Œλ¬Έμ— 일관성이 κΉ¨μ§„λ‹€.
- null-μ•„λ‹˜ : A.equals(null) == false

## equals κ΅¬ν˜„ 방법

- == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ 자기 μžμ‹ μ˜ 참쑰인지 ν™•μΈν•œλ‹€.
- instanceof μ—°μ‚°μžλ‘œ μ˜¬λ°”λ₯Έ νƒ€μž…μΈμ§€ ν™•μΈν•œλ‹€.
- μž…λ ₯된 값을 μ˜¬λ°”λ₯Έ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ ν•œλ‹€.
- μž…λ ₯ 객체와 자기 μžμ‹ μ˜ λŒ€μ‘λ˜λŠ” 핡심 ν•„λ“œκ°€ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
- μΆ”κ°€.
- floatμ΄λ‚˜ doubleκ³Ό 같은 λΆ€λ™μ†Œμˆ˜μ μ˜ 영ν–₯을 λ°›λŠ” μžλ£Œν˜•λ“€μ€ equalsκ°€ μ•„λ‹Œ ν•΄λ‹Ή μžλ£Œν˜•μ—μ„œ μ œκ³΅ν•˜λŠ” compare()ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ λΉ„κ΅ν•˜λΌ.
- 레퍼런슀 νƒ€μž…μ˜ κ²½μš°λŠ” 레퍼런슀 νƒ€μž…μ΄ κ°€μ§€κ³  μžˆλŠ” equalsλ₯Ό μ‚¬μš©ν•˜μ—¬ λΉ„κ΅ν•˜λ©΄ λœλ‹€.
- null을 ν—ˆμš©ν•˜κ³  μ‹Άλ‹€λ©΄ Objecs.equals()λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

- κ΅¬κΈ€μ˜ AutoValue λ˜λŠ” Lombok을 μ‚¬μš©ν•œλ‹€.
- IDE의 μ½”λ“œ 생성 κΈ°λŠ₯을 μ‚¬μš©ν•œλ‹€.
- μ½”λ“œκ°€ μ•½κ°„ μ§€μ €λΆ„ν•΄μ§ˆ 수 있고, ν•„λ“œκ°€ λŠ˜μ–΄λ‚  λ•Œλ§ˆλ‹€ λ‹€μ‹œ λ§Œλ“€μ–΄μ€˜μ•Όν•œλ‹€λŠ” 단점이 μžˆλ‹€.
- Record κΈ°λŠ₯
- μžλ°”14버전뢀터 λ“€μ–΄κ°€ 있고, μžλ°” λ²„μ „μ˜ 15버전뢀터 본격적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.
- μžλ°” 17버전이상을 μ‚¬μš©ν•œλ‹€λ©΄ κ³ λ €ν•  수 μžˆλŠ” 방법.

- μ£Όμ˜μ‚¬ν•­
- equalsλ₯Ό μž¬μ •μ˜ ν•  λ•Œ hashCode도 λ°˜λ“œμ‹œ μž¬μ •μ˜ν•˜μž(μ•„μ΄ν…œ11)
- λ„ˆλ¬΄ λ³΅μž‘ν•˜κ²Œ ν•΄κ²°ν•˜μ§€ 말자.
- Objectκ°€ μ•„λ‹Œ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ” equals λ©”μ„œλ“œλŠ” μ„ μ–Έν•˜μ§€ 말자.
- 논리적인 λ™μΉ˜μ„±μ„ 보μž₯ν•˜λ €λ©΄ λ°˜λ“œμ‹œ equals λ©”μ†Œλ“œλ₯Ό orverride ν•΄μ•Όν•œλ‹€.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# ITEM 11. equalsλ₯Ό μž¬μ •μ˜ν•˜λ €κ±°λ“  hashCode도 μž¬μ •μ˜ν•˜λΌ

> **equalsλ₯Ό μž¬μ •μ˜ν•  λ•ŒλŠ” hashCode도 λ°˜λ“œμ‹œ μž¬μ •μ˜ν•΄μ•Ό ν•œλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ œλŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ 것이닀. μž¬μ •μ˜ν•œ hashCodeλŠ” Object의 APIλ¬Έμ„œμ— 기술된 일반 κ·œμ•½μ„ 따라야 ν•˜λ©°, μ„œλ‘œ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€λΌλ©΄ λ˜λ„λ‘ ν•΄μ‹œμ½”λ“œλ„ μ„œλ‘œ λ‹€λ₯΄κ²Œ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. μ΄λ ‡κ²Œ κ΅¬ν˜„ν•˜κΈ°κ°€ μ–΄λ ΅μ§€λŠ” μ•Šμ§€λ§Œ 쑰금 λ”°λΆ„ν•œ 일이긴 ν•˜λ‹€. ν•˜μ§€λ§Œ κ±±μ •λ§ˆμ‹œλΌ. μ•„μ΄ν…œ 10μ—μ„œ μ΄μ•ΌκΈ°ν•œ AutoValue ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©‹μ§„ equals와 hashCodeλ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€. IDE듀도 이런 κΈ°λŠ₯을 일뢀 μ œκ³΅ν•œλ‹€.**

## hashCode κ·œμ•½

- equals 비ꡐ에 μ‚¬μš©ν•˜λŠ” 정보가 λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€λ©΄ hashCodeλŠ” 맀번 같은 값을 리턴해야 ν•œλ‹€. ( λ³€κ²½λ˜κ±°λ‚˜, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‹€μ‹œ μ‹€ν–‰ν–ˆλ‹€λ©΄ λ‹¬λΌμ§ˆ 수 μžˆλ‹€. )
- **두 객체에 λŒ€ν•œ equalsκ°€ κ°™λ‹€λ©΄, hashCode의 값도 κ°™μ•„μ•Ό ν•œλ‹€.**
- 두 객체에 λŒ€ν•œ equalsκ°€ λ‹€λ₯΄λ”라도, hashCode의 값은 같을 수 μžˆμ§€λ§Œ ν•΄μ‹œ ν…Œμ΄λΈ” **μ„±λŠ₯을 κ³ λ €ν•΄ λ‹€λ₯Έ 값을 λ¦¬ν„΄ν•˜λŠ” 것이 μ’‹λ‹€.**
- 항상 같은 hashCodeλ₯Ό λ¦¬ν„΄ν•˜κ²Œ 되면 μ„±λŠ₯이 O(1) μ—μ„œ O(n) 으둜 λ–¨μ–΄μ§€κ²Œ λœλ‹€.

## hashCode κ΅¬ν˜„ 방법

```java
@Override public int hashCode() {
int result = Short.hashCode(areaCode); // 1
result = 31 * result + Short.hashCode(prefix); // 2
result = 31 * result + Short.hashCode(lineNum); // 3
return result;
}

// areacode, prefix, lineNum은 PhoneNumber(μ„ μ–Έν•œ 클래슀)클래슀의 λ³€μˆ˜λ‹€.
```

1. 핡심 ν•„λ“œ ν•˜λ‚˜μ˜ κ°’μ˜ 해쉬값을 κ³„μ‚°ν•΄μ„œ result 값을 μ΄ˆκΈ°ν™” ν•œλ‹€.
2. κΈ°λ³Έ νƒ€μž…μ€ Type.hashCode
μ°Έμ‘° νƒ€μž…μ€ ν•΄λ‹Ή ν•„λ“œμ˜ hashCode
배열은 λͺ¨λ“  μ›μ†Œλ₯Ό μž¬κ·€μ μœΌλ‘œ μœ„μ˜ λ‘œμ§μ„ μ μš©ν•˜κ±°λ‚˜, Arrays.hashCode
result = 31 * result + ν•΄λ‹Ή ν•„λ“œμ˜ hashCode 계산값
3. resultλ₯Ό λ¦¬ν„΄ν•œλ‹€.

- 31인 이유
- ν™€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€. (짝수λ₯Ό μ‚¬μš©ν•˜λ©΄ λΉ„νŠΈμ—°μ‚°μ΄ λ°œμƒν•˜μ—¬ 값이 μ™Όμͺ½μœΌλ‘œ λ°€λ¦¬λ©΄μ„œ λ‚ μ•„κ°ˆμˆ˜ μžˆλ‹€.)
- ν•΄μ‹œ 좩돌이 κ°€μž₯ 적게 λ‚˜λŠ” μˆ«μžμ΄λ‹€.

## 기타

- κ·Έλƒ₯ μžλ°”μ˜ Objects.hash()λ₯Ό 써라.
- equals와 hashCodeλ₯Ό κ΅¬ν˜„ν•˜λ©΄ ν•΄λ‹Ή κ΅¬ν˜„μ— λŒ€ν•œ ν…ŒμŠ€νŠΈλ„ ν•΄μ•Όν•œλ‹€. ν•˜μ§€λ§Œ lombok을 μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή 뢀뢄은 ν…ŒμŠ€νŠΈ ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# ITEM 12. toString을 항상 μž¬μ •μ˜ν•˜λΌ

> **λͺ¨λ“  ꡬ체 ν΄λž˜μŠ€μ—μ„œ Object의 toString을 μž¬μ •μ˜ν•˜μž. μƒμœ„ ν΄λž˜μŠ€μ—μ„œ 이미 μ•Œλ§žκ²Œ μž¬μ •μ˜ν•œ κ²½μš°λŠ” μ˜ˆμ™Έλ‹€. toString을 μž¬μ •μ˜ν•œ ν΄λž˜μŠ€λŠ” μ‚¬μš©ν•˜κΈ°λ„ 즐겁고 κ·Έ 클래슀λ₯Ό μ‚¬μš©ν•œ μ‹œμŠ€ν…œμ„ λ””λ²„κΉ…ν•˜κΈ° μ‰½κ²Œ ν•΄μ€€λ‹€. toString은 ν•΄λ‹Ή 객체에 κ΄€ν•œ λͺ…ν™•ν•˜κ³  μœ μš©ν•œ 정보λ₯Ό 읽기 쒋은 ν˜•νƒœλ‘œ λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.**

- toString은 κ°„κ²°ν•˜λ©΄μ„œ μ‚¬λžŒμ΄ 읽기 μ‰¬μš΄ ν˜•νƒœμ˜ μœ μ΅ν•œ 정보λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
- Object의 toString은 ν΄λž˜μŠ€μ΄λ¦„@16μ§„μˆ˜λ‘œ ν‘œμ‹œν•œ ν•΄μ‹œ μ½”λ“œ
- 객체가 κ°€μ§„ λͺ¨λ“  정보λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것이 μ’‹λ‹€.(κ°•μ‚¬λ‹˜μ€ λ™μ˜ν•˜μ§€ μ•ŠμŒ)
- κ°’ 클래슀라면 포맷을 λ¬Έμ„œμ— λͺ…μ‹œν•˜λŠ” 것이 μ’‹μœΌλ©° ν•΄λ‹Ή 포맷으둜 객체λ₯Ό 생성할 수 μžˆλŠ” 정적 νŒ©ν„°λ¦¬λ‚˜ μƒμ„±μžλ₯Ό μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€.
- toString이 λ°˜ν™˜ν•œ 값에 ν¬ν•¨λœ 정보λ₯Ό μ–»μ–΄μ˜¬ 수 μžˆλŠ” APIλ₯Ό μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€.
- κ²½μš°μ— 따라 AutoValue, 둬볡 λ˜λŠ” IDEλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”κ²Œ μ μ ˆν•  수 μžˆλ‹€.
- μ „ν™”λ²ˆν˜Έλ₯Ό μͺΌκ°œμ„œ 각 λ³€μˆ˜λ‘œ μ €μž₯ν•˜λŠ” 클래슀 같은 경우 ν•œ 쀄, ν˜Ήμ€ ν¬λ§·λŒ€λ‘œ λ‚˜μ˜€λŠ” 것이 μ μ ˆν•  수 μžˆλ‹€.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# ITEM 13. clone μž¬μ •μ˜λŠ” μ£Όμ˜ν•΄μ„œ μ§„ν–‰ν•˜λΌ

> **Cloneable이 λͺ°κ³  온 λͺ¨λ“  문제λ₯Ό λ˜μ§šμ–΄λ΄€μ„ λ•Œ, μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€ λ•ŒλŠ” μ ˆλ•Œ Cloneable을 ν™•μž₯ν•΄μ„œλŠ” μ•ˆ 되며, μƒˆλ‘œμš΄ ν΄λž˜μŠ€λ„ 이λ₯Ό κ΅¬ν˜„ν•΄μ„œλŠ” μ•ˆ λœλ‹€. final 클래슀라면 Cloneable을 κ΅¬ν˜„ν•΄λ„ μœ„ν—˜μ΄ 크지 μ•Šμ§€λ§Œ, μ„±λŠ₯ μ΅œμ ν™” κ΄€μ μ—μ„œ κ²€ν† ν•œ ν›„ 별닀λ₯Έ λ¬Έμ œκ°€ 없을 λ•Œλ§Œ λ“œλ¬Όκ²Œ ν—ˆμš©ν•΄μ•Όν•œλ‹€. (μ•„μ΄ν…œ 67). κΈ°λ³Έ 원칙은 β€˜λ³΅μ œ κΈ°λŠ₯은 μƒμ„±μžμ™€ νŒ©ν„°λ¦¬λ₯Ό μ΄μš©ν•˜λŠ” 게 μ΅œκ³ β€™λΌλŠ” 것이닀. 단, λ°°μ—΄λ§Œμ€ clone λ©”μ„œλ“œ 방식이 κ°€μž₯ κΉ”λ”ν•œ, 이 κ·œμΉ™μ˜ ν•©λ‹Ήν•œ μ˜ˆμ™ΈλΌ ν•  수 μžˆλ‹€.**

## μ• λ§€λͺ¨ν˜Έν•œ clone κ·œμ•½

- clone κ·œμ•½
- x.clone() != x `λ°˜λ“œμ‹œ true`
- x.clone().getClass == x.getClass() `λ°˜λ“œμ‹œ true`
- x.clone().equals(x) `trueκ°€ 아닐 μˆ˜λ„ μžˆλ‹€.`
- λΆˆλ³€ 객체라면 λ‹€μŒμœΌλ‘œ μΆ©λΆ„ν•˜λ‹€.
- Cloneable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³ 
- clone λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•œλ‹€. μ΄λ•Œ super.clone()을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

## hashCode κ΅¬ν˜„ 방법

- μ ‘κ·Ό μ œν•œμžλŠ” public, λ°˜ν™˜ νƒ€μž…μ€ μžμ‹ μ˜ 클래슀둜 λ³€κ²½ν•œλ‹€.
- super.clone을 ν˜ΈμΆœν•œ λ’€ ν•„μš”ν•œ ν•„λ“œλ₯Ό 적절히 μˆ˜μ •ν•œλ‹€.
- 배열을 λ³΅μ œν•  λ•ŒλŠ” λ°°μ—΄μ˜ clone λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λΌ.
- κ²½μš°μ— 따라 final을 μ‚¬μš©ν•  수 없을지도 λͺ¨λ₯Έλ‹€.
- ν•„μš”ν•œ 경우 deep copyλ₯Ό ν•΄μ•Όν•œλ‹€.
- super.clone으둜 객체λ₯Ό λ§Œλ“  λ’€, κ³ μˆ˜μ€€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 방법도 μžˆλ‹€.
- μ˜€λ²„λΌμ΄λ”© ν•  수 μžˆλŠ” λ©”μ„œλ“œλŠ” μ°Έμ‘°ν•˜μ§€ μ•Šλ„λ‘ 쑰심해야 ν•œλ‹€.
- μƒμ†μš© ν΄λž˜μŠ€λŠ” Cloneable을 κ΅¬ν˜„ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.
- Cloneable을 κ΅¬ν˜„ν•œ μŠ€λ ˆλ“œ μ•ˆμ „ 클래슀λ₯Ό μž‘μ„±ν•  λ•ŒλŠ” 동기화λ₯Ό ν•΄μ•Ό ν•œλ‹€.

## 기타

- β€œλ³΅μ‚¬ μƒμ„±μžβ€ λ˜λŠ” λ³€ν™˜ μƒμ„±μž, β€œλ³΅μ‚¬ νŒ©ν„°λ¦¬β€ λ˜λŠ” λ³€ν™˜ νŒ©ν„°λ¦¬
- μƒμ„±μžλ₯Ό μ“°μ§€ μ•ŠμœΌλ©°, λͺ¨ν˜Έν•œ κ·œμ•½, λΆˆν•„μš”ν•œ 검사 μ˜ˆμ™Έ, final μš©λ²• λ°©ν•΄ λ“±μ—μ„œ λ²—μ–΄λ‚  수 μžˆλ‹€.
- 또 λ‹€λ₯Έ 큰 μž₯점 쀑 ν•˜λ‚˜λ‘œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 인수둜 받을 수 μžˆλ‹€.
- ν΄λΌμ΄μ–ΈνŠΈκ°€ 볡제본의 νƒ€μž…μ„ κ²°μ •ν•  수 μžˆλ‹€.
Loading