์ž๋ฐ”์˜ ์ •์„ - ์ง๋ ฌํ™”(Serialization)

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ integer.blog



์ž๋ฐ”์˜ ์ •์„(๋‚จ๊ถ์„ฑ ์ €) 2๊ถŒ ํ•™์Šต๋‚ด์šฉ ์ •๋ฆฌ

1. ์ง๋ ฌํ™”๋ž€?

๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ
๊ฐ์ฒด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆผ์— ์“ฐ๊ธฐ ์œ„ํ•ด ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ
์ŠคํŠธ๋ฆผ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์—ญ์ง๋ ฌํ™”

* ๊ฐ์ฒด ์ •์˜

๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์— ์ •์˜๋œ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜์˜ ์ง‘ํ•ฉ.
๊ฐ์ฒด์—๋Š” ํด๋ž˜์Šค๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
๊ฐ์ฒด๋Š” ์˜ค์ง ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜๋“ค๋กœ๋งŒ ๊ตฌ์„ฑ.

๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ์ฒด์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ.
๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ ๋‘ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜์˜ ๊ฐ’๋“ค์ด ๊ฐ™์€์ง€์— ๋”ฐ๋ฅธ๋‹ค.

2. ObjectInputStream, ObjectOutputStream

์ง๋ ฌํ™” = ์ŠคํŠธ๋ฆผ์— ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅ = ObjectOutputStream ์‚ฌ์šฉ
์—ญ์ง๋ ฌํ™” = ์ŠคํŠธ๋ฆผ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด๋ฅผ ์ž…๋ ฅ = ObjectInputStream ์‚ฌ์šฉ

2.1. ObjectInputStream๊ณผ ObjectOutputStream์€ ๋ณด์กฐ์ŠคํŠธ๋ฆผ์ด๋ผ ๊ธฐ๋ฐ˜์ŠคํŠธ๋ฆผ์ด ํ•„์š”ํ•˜๋‹ค.

ObjectInputStream(InputStream in)
ObjectOutputStream(OutputStream out)

2.2. ํŒŒ์ผ์— ๊ฐ์ฒด๋ฅผ ์ €์žฅ(์ง๋ ฌํ™”) ๋ฐฉ๋ฒ•

FileOutputStream fos = new FileOutputStream("objectfile.ser");
ObjectOutputStream out = new ObjectOutputStream(fos);

out.writeObject(new Member());  //objectfile.ser ํŒŒ์ผ์— Member ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ €์žฅ

2.3. ์—ญ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•

FileInputStream fis = new FileInputStream("objectfile.ser");
ObjectInputStream in = new ObjectInputStream(fis);

Member member = (Member)in.readObject();  //readObject()์˜ ๋ฐ˜ํ™˜ํƒ€์ž…์ด Object๋ผ์„œ ํ˜•๋ณ€ํ™˜ ํ•„์š”

3. ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

์ง๋ ฌํ™”ํ•˜๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

3.1. Serializable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„๋„ ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

public class SuperMember implements Serializable  {
  String name;
  String password;
}
public class Member extends SuperMember {
  int age;
}

3.2. Object๊ฐ์ฒด๋Š” ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์‹ค์ œ ์ €์žฅ๋œ ๊ฐ์ฒด์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ๋‹ค.

public class Member implements Serializable {
  String name;
  String password;
  int age;
  
  Object obj = new Object();  // Object๊ฐ์ฒด๋Š” ์ง๋ ฌํ™” ๋ถˆ๊ฐ€๋Šฅ
  Object obj2 = new String("abc");  // ์‹ค์ œ ์ €์žฅ๋œ ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๊ฐ€ String ์ด๋ฏ€๋กœ ์ง๋ ฌํ™” ๊ฐ€๋Šฅ.
}

3.3. ์ œ์–ด์ž transient๋กœ ์ง๋ ฌํ™” ๋Œ€์ƒ์—์„œ ์ œ์™ธ์‹œํ‚ค๊ธฐ

public class Memebr implements Serializable {
  String name;
  transient String password;  // ์ง๋ ฌํ™” ๋Œ€์ƒ์—์„œ ์ œ์™ธ
  int age;
  transient Object obj = new Object();  // ์ง๋ ฌํ™” ๋Œ€์ƒ์—์„œ ์ œ์™ธ

4. ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ์˜ˆ์ œ

4.1. ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ํŒŒ์ผ์— ์ €์žฅ

public static void main(String[] args)  {
  
  try {
      String fileName = "Member.ser";
      
      FileOutputStream fos = new FileOutputStream(fileName);
      BufferedOutputStream bos = new BufferedOutputStream(fos);
      ObjectOutputStream out = new ObjectOutputStream(bos);
      
      Member m1 = new Member("JavaMan", "1234", 29);
      Member m2 = new Member("JavaWoman", "0000", 29);
      
      ArrayList<Member> list = new ArrayList<>();
        list.add(m1);
        list.add(m2);
      
      // ๊ฐ์ฒด ์ง๋ ฌํ™”
      out.writeObject(m1);
      out.writeObject(m2);
      out.writeObject(list);
      
      out.close();
      
  } catch(IOException e)  {
      e.printStackTrace();
  }
}

4.2. ์œ„์˜ ์ง๋ ฌํ™”ํ•œ ๊ฐ์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™”

public static void main(String[] args)  {
  
  try {
      String fileName = "Member.ser";
      FileInputStream fis = new FileInputStream(fileName);
      BufferedInputStream bis = new BufferedInputStream(fis);
      ObjectInputStream in = new ObjectInputStream(bis);
      
      // ๊ฐ์ฒด๋ฅผ ์ฝ์„ ๋•Œ๋Š” ์ถœ๋ ฅํ•œ ์ˆœ์„œ์™€ ์ผ์น˜ํ•ด์•ผํ•จ.
      // ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ์ฒด๊ฐ€ ๋งŽ์„ ๋•Œ๋Š” ArrayList ๊ฐ™์€ ์ปฌ๋ ‰์…˜์— ์ €์žํ•ด์„œ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•จ.
      Memebr m1 = (Member)in.readObject();
      Member m2 = (Member)in.readObject();
      ArrayList list = (ArrayList)in.readObject();
      
      in.close();
  } catch (Exception e) {
    e.printStackTrace();
  }
}