item 87 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

๊ฐœ๋ฐœ ์ผ์ •์— ์ซ“๊ธฐ๋Š” ์ƒํ™ฉ์ด๋ผ ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ๊ทธ๋ƒฅ ๋™์ž‘๋งŒ ํ•˜๋„๋ก ๋งŒ๋“ค์–ด ๋†“๊ณ  ๋‹ค์Œ ๋ฆด๋ฆฌ์ฆˆ์—์„œ ์ œ๋Œ€๋กœ ๊ตฌํ˜„์„ ํ•˜๋Š”๊ฒŒ ์ข…์ข… ์ผ์–ด๋‚˜์ง€๋งŒ ํด๋ž˜์Šค๊ฐ€ Serializable์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค ๋•Œ ๋ฒ„๋ฆฌ๋ ค ํ•œ ํ˜„์žฌ์˜ ๊ตฌํ˜„์— ์˜์›ํžˆ ๋ฐœ์ด ๋ฌถ์ด๊ฒŒ ๋œ๋‹ค.

๋จผ์ € ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ๊ดœ์ฐฎ๋‹ค๊ณ  ํŒ๋‹จ๋  ๋–„๋งŒ ๊ธฐ๋ณธ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

  • ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ์œ ์—ฐ์„ฑ, ์„ฑ๋Šฅ, ์ •ํ™•์„ฑ ์ธก๋ฉด์—์„œ ์‹ ์ค‘ํžˆ ๊ณ ๋ฏผํ•œ ํ›„ ํ•ฉ๋‹นํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ๊ฐ์ฒด๊ฐ€ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ๋“ค๊ณผ ๊ทธ ๊ฐ์ฒด์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋‹ด์•„๋‚ด๋จ€, ์‹ฌ์ง€์–ด ์ด ๊ฐ์ฒด๋“ค์ด ์—ฐ๊ฒฐ๋œ ์œ„์ƒ๊นŒ์ง€ ๊ธฐ์ˆ ํ•œ๋‹ค.
  • ๋ฐ˜๋ฉด ์ด์ƒ์ ์ธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๋ชจ์Šต๊ณผ ๋…๋ฆฝ๋œ ๋…ผ๋ฆฌ์ ์ธ ๋ชจ์Šต๋งŒ์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด์˜ ๋ฌผ๋ฆฌ์  ํ‘œํ˜„๊ณผ ๋…ผ๋ฆฌ์  ๋‚ด์šฉ์ด ๊ฐ™๋‹ค๋ฉด ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ผ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

public class Name implements Serializable {
    
    /**
     * ์„ฑ. null์ด ์•„๋‹ˆ์–ด์•ผํ•จ
     * @serial
     */
    private final String lastName;
    
    /**
     * ์ด๋ฆ„. null์ด ์•„๋‹ˆ์–ด์•ผ ํ•จ.
     * @serial
     */
    private final String firstName;
    
    /**
     * ์ค‘๊ฐ„์ด๋ฆ„. ์ค‘๊ฐ„์ด๋ฆ„์ด ์—†๋‹ค๋ฉด null.
     * @serial
     */
    private final String middleName;
}
  • ์„ฑ๋ช…์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ด๋ฆ„, ์„ฑ, ์ค‘๊ฐ„์ด๋ฆ„์ด๋ผ๋Š” 3๊ฐœ์˜ ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์•ž ์ฝ”๋“œ์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋“ค์€ ์ด ๋…ผ๋ฆฌ์  ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
  • ์„ธ ํ•„๋“œ ๋ชจ๋‘ private์ž„์—๋„ ๋ฌธ์„œํ™” ์ฃผ์„์ด ๋‹ฌ๋ ค์žˆ๋‹ค. ์ด ํ•„๋“œ๋“ค์€ ๊ฒฐ๊ตญ ํด๋ž˜์Šค์˜ ์ง๋ ฌํ™” ํ˜•ํƒœ์— ํฌํ•จ๋˜๋Š” ๊ณต๊ฐœ API์— ์†ํ•˜๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๊ฐ€ ์ ํ•ฉํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ๋”๋ผ๋„ ๋ถˆ๋ณ€์‹ ๋ณด์žฅ๊ณผ ๋ณด์•ˆ์„ ์œ„ํ•˜ readObject ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

์•ž์˜ Name ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ์—๋Š” readObject ๋ฉ”์„œ๋“œ๊ฐ€ lastName๊ณผ firstName ํ•„๋“œ๊ฐ€ null์ด ์•„๋‹˜์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.

public final class StringList implements Serializable {
    private int size = 0;
    private Entry head = null;
    
    private static class Entry implements Serializable {
        String data;
        Entry next;
        Entry previous;
    }
}

์ด ํด๋ž˜์Šค๋Š” ์ง๋ ฌํ™” ํ˜•ํƒœ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

๋…ผ๋ฆฌ์ ์œผ๋กœ ์ด ํด๋ž˜์Šค๋Š” ์ผ๋ จ์˜ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•œ๋‹ค. ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” ๋ฌธ์ž์—ด๋“ค์„ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ํด๋ž˜์Šค์— ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋…ธ๋“œ์˜ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด ๋ชจ๋“  Entry ๋ฅผ ์ฒ ๋‘์ฒ ๋ฏธํ•˜๊ฒŒ ๊ธฐ๋กํ•œ๋‹ค.

๊ฐ์ฒด์˜ ๋ฌผ๋ฆฌ์  ํ‘œํ˜„๊ณผ ๋…ผ๋ฆฌ์  ํ‘œํ˜„์˜ ์ฐจ์ด๊ฐ€ ํด ๋•Œ ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๋ฉด์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

  1. ๊ณต๊ฐœ API๊ฐ€ ํ˜„์žฌ์˜ ๋‚ด๋ถ€ ํ‘œํ˜„ ๋ฐฉ์‹์— ์˜๊ตฌํžˆ ๋ฌถ์ธ๋‹ค.
  2. ๋„ˆ๋ฌด ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ง๋ ฌํ™” ๋กœ์ง์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„์˜์œ„์ƒ์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ์—†์œผ๋‹ˆ ๊ทธ๋ž˜ํ”„๋ฅผ ์ง์ ‘ ์ˆœํšŒํ•ด ๋ณผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

  1. ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

ํ•ฉ๋ฆฌ์ ์ธ ์ปค์Šคํ…€ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ๊ฐ–์ถ˜ StringList

public final class StringList implements Serializable {
    private transient int size = 0;
    private transient Entry head = null;
    
    // ์ด์ œ๋Š” ์ง๋ ฌํ™”๋˜์ง€ ์•Š๋Š”๋‹ค.
    private static class Entry {
        String data;
        Entry next;
        Entry previous;
    }
    
    // ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์„ ์ด ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    public final void add(String s) {...}
    
    /**
     * ์ด {@code StringList} ์ธ์Šคํ„ด์Šค๋ฅผ ์ง๋ ฌํ™”ํ•œ๋‹ค.
     * 
     * @serialData ์ด ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ(ํฌํ•จ๋œ ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜)๋ฅผ ๊ธฐ๋กํ•œ ํ›„
     * ({@code int}), ์ด์–ด์„œ ๋ชจ๋“  ์›์†Œ๋ฅผ(๊ฐ๊ฐ์€ {@code String})
     * ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋กํ•œ๋‹ค.
     */
    private void writeObject(ObjectOutputStream s) throws IOException {
     	//๊ธฐ๋ณธ ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
        s.defaultWriteObject();
        s.writeInt(size);
        
        // ์ปค์Šคํ…€ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
        // ๋ชจ๋“  ์›์†Œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๊ธฐ๋กํ•œ๋‹ค.
        for (Entry e = head; e != null; e = e.next)
            s.writeObject(e.data);
    }
    
    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
        //๊ธฐ๋ณธ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
        s.defaultReadObject();
        int numElements = s.readInt();
        
        // ์ปค์Šคํ…€ ์—ญ์ง๋ ฌํ™” ๋ถ€๋ถ„
        // ๋ชจ๋“  ์›์†Œ๋ฅผ ์ฝ์–ด ์ด ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…ํ•œ๋‹ค.
        for(int i = 0; i < numElements; i++) {
            add((String) s.readObject());
        }
    }
}

transient: ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ํ•„๋“œ๊ฐ€ ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํ‘œ์‹œ

  • StringList๋ฅผ ์œ„ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ๋‹จ์ˆœํžˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ ์€ ๋‹ค์Œ, ๊ทธ ๋’ค์˜ค ๋ฌธ์ž์—ด๋“ค์„ ๋‚˜์—ดํ•˜๋Š” ์ˆ˜์ค€์ด๋ฉด ๋  ๊ฒƒ์ด๋‹ค. StringList์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ƒ์„ธ ํ‘œํ˜„์€ ๋ฐฐ์ œํ•œ ์ฑ„ ๋…ผ๋ฆฌ์ ์ธ ๊ตฌ์„ฑ๋งŒ ๋‹ด๋Š” ๊ฒƒ์ด๋‹ค.
  • writeObject์™€ readObject๊ฐ€ ์ง๋ ฌํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ StringList์˜ ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ transient๋”๋ผ๋„ ์ € ๋‘˜์€ ๊ฐ๊ฐ ๊ฐ€์žฅ ๋จผ์ € defaultWriteObject์™€ defaultReadObject๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ์ง๋ ฌํ™” ๋ช…์„ธ๋Š” ์ด ์ž‘์—…์„ ๋ฌด์กฐ๊ฑด ํ•ด์•ผ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ transient๊ฐ€ ์•„๋‹Œ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ์ƒํ˜ธ ํ˜ธํ™˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ด์™€ ๊ฐ™์€ ์‹์ด๋ผ๋ฉด StringList ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ์›๋ž˜ ๋ฒ„์ „์˜ ์ ˆ๋ฐ˜ ์ •๋„์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฉฐ ์‹คํ–‰๋˜๋Š” ์†๋„๋„ ๋‘ ๋ฐฐ ์ •๋„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋„ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ์‹ค์งˆ์ ์œผ๋กœ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ ์ œํ•œ์ด ์—†์–ด์กŒ๋‹ค.

StringList ๊ธฐ๋ณธ ์ง๋ ฌํ™” ๋ณด๋‹ค ์ƒํƒœ๊ฐ€ ๋” ์‹ฌ๊ฐํ•œ ํด๋ž˜์Šค๋“ค

StringList์—์„œ๋„ ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ๋น„๋ก ์œ ์—ฐ์„ฑ๊ณผ ์„ฑ๋Šฅ์ด ๋–จ์–ด์กŒ๋”๋ผ๊ณ , ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•œ ํ›„ ์—ญ์ง๋ ฌํ™”ํ•˜๋ฉด ์›๋ž˜ ๊ฐ์ฒด๋ฅผ ๊ทธ ๋ถˆ๋ณ€์‹๊นŒ์ง€ ํฌํ•จํ•ด ์ œ๋Œ€๋กœ ๋ณต์›ํ•ด๋‚ธ๋‹ค๋Š” ์ ์—์„œ ์ •ํ™•ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถˆ๋ณ€์‹์ด ์„ธ๋ถ€ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ์ฒด์—์„œ๋Š” ์ด ์ •ํ™•์„ฑ๋งˆ์ € ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์˜ˆ๋กœ ์ƒ๊ฐํ•ด๋ณด์ž.

  • ํ•ด์‹œํ…Œ์ด๋ธ”์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ๋Š” ํ‚ค-๊ฐ’ ์—”ํŠธ๋ฆฌ๋“ค์„ ๋‹ด์€ ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ฐจ๋ก€๋กœ ๋‚˜์—ดํ•œ ํ˜•ํƒœ๋‹ค.
  • ์–ด๋–ค ์—”ํŠธ๋ฆฌ๋ฅผ ์–ด๋–ค ๋ฒ„ํ‚ท์— ๊ฐ์„์ง€๋Š” ํ‚ค์—์„œ ๊ตฌํ•œ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ, ๊ทธ ๊ณ„์‚ฐ ๋ฐฉ์‹์€ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ๊ณ„์‚ฐํ•  ๋•Œ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๊ธฐ๋„ ํ•œ๋‹ค.
  • ๋•Œ๋ฌธ์— ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์ง๋ ฌํ™”ํ•œ ํ›„ ์—ญ์ง๋ ฌํ™”ํ•˜๋ฉด ๋ถˆ๋ณ€์‹์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ํ›ผ์†๋  ๊ฐ์ฒด๋“ค์ด ์ƒ๊ฒจ๋‚  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ์ƒํƒœ์™€ ๋ฌด๊ด€ํ•œ ํ•„๋“œ๋ผ๊ณ  ํ™•์‹ ํ•  ๋•Œ๋งŒ transient ํ•œ์ •์ž๋ฅผ ์ƒ๋žตํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์ปค์Šคํ…€ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์•ž์„œ์˜ StringList ์˜ˆ์—์„œ์ฒ˜๋Ÿผ ๋Œ€๋ถ€๋ถ„์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ transient๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

  • ๊ธฐ๋ณธ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด transient ํ•„๋“œ๋“ค์€ ์—ญ์ง๋ ฌํ™” ๋  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ์„ ์žŠ์ง€ ๋ง์ž.
  • ๊ธฐ๋ณธ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋ฉด readObject ๋ฉ”์„œ๋“œ์—์„œ defaultReadObject๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ, ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ณต์›ํ•˜์ž. ํ˜น์€ ๊ทธ ๊ฐ’์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

๊ฐ์ฒด์˜ ์ „์ฒด ์ƒํƒœ๋ฅผ ์ฝ๋Š” ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง๋ ฌํ™”์—๋„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

private synchronized void writeObject(ObjectOutputStream s) throws IOException {
    s.defaultWriteObject();
}

sunchronized๋กœ ์„ ์–ธํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“  ๊ฐ์ฒด์—์„œ ๊ธฐ๋ณธ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด writeObject๋„ ์œ„์ฒ˜๋Ÿผ synchronized๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

  • writeObject ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋™๊ธฐํ™” ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ ์ˆœ์„œ๋ฅผ ๋˜‘๊ฐ™์ด ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž์› ์ˆœ์„œ ๊ต์ฐฉ์ƒํƒœ์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์–ด๋–ค ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ํƒํ•˜๋“  ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ํด๋ž˜์Šค ๋ชจ๋‘์— ์ง๋ ฌ ๋ฒ„์ „ UID๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ€์—ฌํ•˜์ž.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง๋ ฌ ๋ฒ„์ ผ UID๊ฐ€ ์ผ์œผํ‚ค๋Š” ์ž ์žฌ์ ์ธ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. ์„ฑ๋Šฅ๋„ ์กฐ๊ธˆ ๋นจ๋ผ์ง€๋Š”๋ฐ, ์ง๋ ฌ ๋ฒ„์ ผ UID๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„์— ์ด ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š๋ผ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

private static final long serialVersionUID = -232923283928929;

์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ํด๋ž˜์Šค์—์„œ๋Š” ์–ด๋–ค long๊ฐ’์„ ์„ ํƒํ•˜๋“  ์ƒ๊ด€์—†๋‹ค. ๊ทธ๋ƒฅ ์ƒ๊ฐ๋‚˜๋Š” ์•„๋ฌด ๊ฐ’์ด๋‚˜ ์„ ํƒํ•ด๋„ ๋œ๋‹ค.

์ง๋ ฌ ๋ฒ„์ ผ UID๊ฐ€ ์—†๋Š” ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ฒ„์ „์œผ๋กœ ์ง๋ ฌํ™”๋œ ์ธ์Šคํ„ด์Šค์™€ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•œ ์ฑ„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ตฌ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•œ ์ž๋™ ์ƒ์„ฑ๋œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋ณธ ๋ฒ„์ „ ํด๋ž˜์Šค์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๋Š๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ์ง๋ ฌ ๋ฒ„์ „ UID๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

๊ตฌ๋ฒ„์ „์œผ๋กœ ์ง๋ ฌํ™”๋œ ์ธ์Šคํ„ด์Šค๋“ค๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๋Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ง๋ ฌ ๋ฒ„์ „ UID๋ฅผ ์ ˆ๋Œ€ ์ˆ˜์ •ํ•˜์ง€ ๋ง์ž.

ํ•ต์‹ฌ์ •๋ฆฌ

  • ํด๋ž˜์Šค๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๋ฉด ์–ด๋–ค ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์‹ฌ์‚ฌ์ˆ™์กฐ ํ•˜๊ธฐ
  • ์ž๋ฐ”์˜ ๊ธฐ๋ณธ ์ง๋ ฌํ™” ํ˜•ํƒœ๋Š” ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ํ‘œํ˜„์— ๋ถ€ํ•ฉํ• ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ปค์Šคํ…€ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ๊ณ ์•ˆํ•˜๋ผ.
  • ์ง๋ ฌํ™” ํ˜•ํƒœ๋„ ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ์— ์ค€ํ•˜๋Š” ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•œ๋ฒˆ ๊ณต๊ฐœ๋œ ๋ฉ”์„œ๋“œ๋Š” ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋“ฏ์ด, ์ง๋ ฌํ™” ํ˜•ํƒœ์— ํฌํ•จ๋œ ํ•„๋“œ๋„ ๋งˆ์Œ๋Œ€๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ž˜๋ชป๋œ ์ง๋ ฌํ™” ํ˜•ํƒœ๋ฅผ ์„ ํƒํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ณต์žก์„ฑ๊ณผ ์„ฑ๋Šฅ์— ์˜๊ตฌํžˆ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋‚จ๊ธด๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ