Skip to content

Latest commit

Β 

History

History
102 lines (77 loc) Β· 4.25 KB

item41.md

File metadata and controls

102 lines (77 loc) Β· 4.25 KB

μ •μ˜ν•˜λ €λŠ” 것이 νƒ€μž…μ΄λΌλ©΄ 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ.

마컀 μΈν„°νŽ˜μ΄μŠ€

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

마컀 μ–΄λ…Έν…Œμ΄μ…˜

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

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

1. 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” [νƒ€μž…] 으둜 μ“Έ 수 μžˆλ‹€ !

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

[객체λ₯Ό νŒŒμΌμ— μž‘μ„±ν•˜λŠ” λ©”μ„œλ“œ]

// λ§€κ°œλ³€μˆ˜λ‘œ 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("λŸ°νƒ€μž„μ— μ—λŸ¬ λ°œμƒ");
         }
     }

[λ©”μ„œλ“œ μ‚¬μš©]

이미지

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

[마컀 μ—λ„ˆν…Œμ΄μ…˜]

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


Serializable 의 writeObject()

writeObject λ©”μ„œλ“œμ—μ„œλŠ” writeObject0(obj, false); λ₯Ό 톡해 객체λ₯Ό μž‘μ„±ν•œλ‹€.

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 둜 νƒ€μž…κ²€μ‚¬λ₯Ό ν•˜κ³  μžˆλ‹€.
  • 마컀 μΈν„°νŽ˜μ΄μŠ€κ°€ νƒ€μž…μœΌλ‘œ μ“Έ 수 μžˆλ‹€λŠ” μž₯점을 살리지 λͺ»ν•˜κ³  μžˆλ‹€.


2. 마컀 μΈν„°νŽ˜μ΄μŠ€λŠ” 적용 λŒ€μƒμ„ 더 μ •λ°€ν•˜κ²Œ 지정할 수 μžˆλ‹€.

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

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

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



3. μ—λ„ˆν…Œμ΄μ…˜μ€ μ–Έμ œ μ“ΈκΉŒ ?

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


κ²°λ‘ 

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

[java.util.Collection]