Skip to content

Commit

Permalink
item41
Browse files Browse the repository at this point in the history
  • Loading branch information
cmg1411 committed Feb 23, 2021
1 parent 5be5995 commit 296616c
Showing 1 changed file with 102 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# μ •μ˜ν•˜λ €λŠ” 것이 νƒ€μž…μ΄λΌλ©΄ 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ.

## 마컀 μΈν„°νŽ˜μ΄μŠ€
- μžμ‹ μ„ κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ νŠΉμ • 속성을 가짐을 λ‚˜νƒ€λ‚΄λŠ” μΈν„°νŽ˜μ΄μŠ€
- 좔상 λ©”μ„œλ“œλ“ , ν•„λ“œλ“ , default, static λ©”μ„œλ“œλ“  아무것도 μ—†λ‹€.
- Cloneable, Serializable 같은 μΈν„°νŽ˜μ΄μŠ€

## 마컀 μ–΄λ…Έν…Œμ΄μ…˜
- ν•΄λ‹Ή μš”μ†Œκ°€ νŠΉμ • 속성을 가짐을 λ‚˜νƒ€λ‚΄λŠ” μ—λ„ˆν…Œμ΄μ…˜
- @Override, @FunctionalInterface, @SafeVarargs, @Native


## 마컀 μ—λ„ˆν…Œμ΄μ…˜ vs 마컀 μΈν„°νŽ˜μ΄μŠ€

### 1. 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” [νƒ€μž…] 으둜 μ“Έ 수 μžˆλ‹€ !
- 마컀 μΈν„°νŽ˜μ΄μŠ€μ™€ 마컀 μ—λ„ˆν…Œμ΄μ…˜ λͺ¨λ‘ ν΄λž˜μŠ€κ°€ μ–΄λ–€ 속성을 κ°€μ§„λ‹€λŠ” ν‘œμ‹œλ₯Ό ν•  수 μžˆλ‹€.
- 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ **μ»΄νŒŒμΌνƒ€μž„** 에 였λ₯˜λ₯Ό κ²€μΆœν•  수 μžˆλ‹€.
- 마컀 μ—λ„ˆν…Œμ΄μ…˜μ€ **λŸ°νƒ€μž„**μ—μ„œμ•Ό 였λ₯˜λ₯Ό κ²€μΆœν•  수 μžˆλ‹€.

<br>

[객체λ₯Ό νŒŒμΌμ— μž‘μ„±ν•˜λŠ” λ©”μ„œλ“œ]
```java
// λ§€κ°œλ³€μˆ˜λ‘œ Serializeable νƒ€μž…μ„ 받도둝 ν–ˆλ‹€.
public static void newWriteObject(Serializable object, String path) {
File file = new File(path);

try (ObjectOutputStream oops = new ObjectOutputStream(new FileOutputStream(file))) {
oops.writeObject(object);
} catch (IOException e) {
System.out.println("λŸ°νƒ€μž„μ— μ—λŸ¬ λ°œμƒ");
}
}
```
[λ©”μ„œλ“œ μ‚¬μš©]

![이미지](https://github.com/cmg1411/effectiveJava/blob/master/src/main/java/Chapter6/Day41/%EC%97%90%EB%9F%AC%EC%97%90%EB%9F%AC.png)

- 인자둜 λ„˜κΈ°λ €λŠ” MeetCoder κ°μ²΄λŠ” Serializable 을 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜λ‹€ !
- 결과둜 μ•„λž˜μ™€ 같이 컴파일였λ₯˜κ°€ λ‚œλ¦¬λ₯Ό μΉœλ‹€.
- ν•΄κ²°λ²•μœΌλ‘œλŠ” MeetCoder ν΄λž˜μŠ€μ— Serializable 을 implements ν•˜μ—¬ ν•˜μœ„νƒ€μž…μœΌλ‘œ λ§Œλ“€κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

<br>

[마컀 μ—λ„ˆν…Œμ΄μ…˜]
- 반면 이λ₯Ό 마컀 μ—λ„ˆν…Œμ΄μ…˜μœΌλ‘œ ν•΄κ²°ν•˜λ €λ©΄, μ—λ„ˆν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œλ₯Ό μ΄μš©ν•˜μ—¬ instanceof λ₯Ό μ΄μš©ν•˜μ—¬ λŸ°νƒ€μž„μ—μ•Ό μ—λŸ¬λ₯Ό κ²€μΆœν•  수 μžˆλ‹€.

<br>
<br>

## Serializable 의 writeObject()

writeObject λ©”μ„œλ“œμ—μ„œλŠ” ```writeObject0(obj, false);``` λ₯Ό 톡해 객체λ₯Ό μž‘μ„±ν•œλ‹€.
```java
private void writeObject0(Object obj, boolean unshared)
throws IOException {
...
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
...
```
- Object 둜 객체λ₯Ό 받은 ν›„
- μ—¬λŸ¬ 쑰건을 κ²€μ‚¬ν•˜κ³  λ§ˆμ§€λ§‰μœΌλ‘œ Serializable 을 κ΅¬ν˜„ν–ˆλŠ”μ§€ instanceof 둜 νƒ€μž…κ²€μ‚¬λ₯Ό ν•˜κ³  μžˆλ‹€.
- 마컀 μΈν„°νŽ˜μ΄μŠ€κ°€ νƒ€μž…μœΌλ‘œ μ“Έ 수 μžˆλ‹€λŠ” μž₯점을 살리지 λͺ»ν•˜κ³  μžˆλ‹€.


<br>
<br>

### 2. 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” 적용 λŒ€μƒμ„ 더 μ •λ°€ν•˜κ²Œ 지정할 수 μžˆλ‹€.
- 마컀 μ—λ„ˆν…Œμ΄μ…˜μ€ @Retention(RetentionPolicy.TYPE) μ—λ„ˆν…Œμ΄μ…˜μ„ 톡해 클래슀, μΈν„°νŽ˜μ΄μŠ€, enum, μ—λ„ˆν…Œμ΄μ…˜μ—λ§Œ 달 수 μžˆλŠ” 마컀λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
- ν•˜μ§€λ§Œ 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” 이보닀 더 μ •λ°€ν•œ μ œν•œμ„ λ‘˜ 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, Person μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—λ§Œ MeetCoder μŠ€ν„°λ””μ›μ΄λΌλŠ” 마컀λ₯Ό 달고 μ‹Άλ‹€λŠ” μš”κ΅¬μ‚¬ν•­μ΄ μžˆλ‹€κ³  μƒκ°ν•΄λ³΄μž.
그러면 MeetCoder μΈν„°νŽ˜μ΄μŠ€ Person 둜 ν™•μž₯ν•˜κ³ , MeetCoder μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©΄ λœλ‹€.
MeetCoderλ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λŠ” μžλ™μœΌλ‘œ Person μΈν„°νŽ˜μ΄μŠ€μ˜ ν•˜μœ„ νƒ€μž…μ΄ λ˜λŠ” 것이고, MeetCoder κ°€ 마컀 μΈν„°νŽ˜μ΄μŠ€μΈ 것이닀.

μ±…μ˜ μ˜ˆμ‹œμ—μ„œλŠ” Collection 을 κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œλ§Œ Set μ΄λΌλŠ” 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€κ³  ν•œλ‹€.

<br>
<br>

### 3. μ—λ„ˆν…Œμ΄μ…˜μ€ μ–Έμ œ μ“ΈκΉŒ ?
- λ§ˆν‚Ήν•˜λ €λŠ” 곳이 클래슀, μΈν„°νŽ˜μ΄μŠ€κ°€ 아닐 λ•Œ.
- μ—λ„ˆν…Œμ΄μ…˜μ„ 적극 ν™œμš©ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬μ˜ 일뢀에 마컀λ₯Ό 달 λ•Œ.

<br>
<br>

#### κ²°λ‘ 
- λ§ˆν‚Ήλœ 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  일이 μžˆμ„κΉŒ ? -> [예] 라면 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ“°μž !
- Retention 이 ElementType.TYPE 인 마컀 μ—λ„ˆν…Œμ΄μ…˜μ„ μ“°κ³  μžˆλ‹€ ? -> 마컀 μΈν„°νŽ˜μ΄μŠ€λ‘œ 바꿀지 κ³ λ―Όν•΄λ³΄μž.

[java.util.Collection]

0 comments on commit 296616c

Please sign in to comment.