item 86 Sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
[์์ดํ 86] Serializable์ ๊ตฌํํ ์ง๋ ์ ์คํ ๊ฒฐ์ ํ๋ผ
์ง๋ ฌํ ํ๋ ๋ฐฉ๋ฒ
import java.io.Serializable;
public class Student implements Serializable{
String name;
int grade;
}
Serializable
๋ง ๊ตฌํํ๋ฉด ๋๋ค. ๋๋ฌด ์ฝ๊ฒ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ํน๋ณํ ์ ๊ฒฝ ์ธ ๊ฒ ์๋ค๋ ์คํด๊ฐ ์๊ธธ ์ ์์ง๋ง, ์ง์ค์ ํจ์ฌ ๋ ๋ณต์กํ๋ค. ์ง๋ ฌํ๋ฅผ ์ง์ํ๊ธฐ๋ ์งง๊ฒ ๋ณด๋ฉด ์์ฌ์ ๋ณด์ด์ง๋ง, ๊ธธ๊ฒ ๋ณด๋ฉด ์์ฃผ ๊ฐ๋น์ผ ์ผ์ด๋ค.
์ง๋ ฌํ์ ์ ์คํด์ผ ํ๋ ์ด์
-
๋ฆด๋ฆฌ์คํ ๋ค์๋ ์์ ํ๊ธฐ ์ด๋ ต๋ค.
์ง๋ ฌํํ๊ฒ ๋๋ฉด, ์ง๋ ฌํ๋ ๋ฐ์ดํธ ์คํธ๋ฆผ ์ธ์ฝ๋ฉ๋ ํ๋์ ๊ณต๊ฐ API๊ฐ ๋๋ค. ๊ทธ๋์ ์ด ํด๋์ค๊ฐ ๋๋ฆฌ ํผ์ง๋ค๋ฉด ๊ทธ ์ง๋ ฌํ ํํ๋ ์์ํ ์ง์ํด์ผ ํ๋ค.
private
๊ณผpackage-private
์ธ์คํด์ค ํ๋๋ค๋ง์ API๋ก ๊ณต๊ฐ๋์ด ์บก์ํ๊ฐ ๊นจ์ง๊ฒ ๋๋ค. private์ ํฌํจํ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ์ง๋ ฌํ ํํ๋ ๋ฌ๋ผ์ง๋ค. ๊ตฌ ๋ฒ์ ์ธ์คํด์ค๋ฅผ ์ง๋ ฌํํ๊ณ ๋ค๋ฅธ ์ชฝ์ ์ ๋ฒ์ ํด๋์ค๋ก ์ญ์ง๋ ฌํํ๋ค๋ฉด ์คํจํ๊ฒ ๋๋ค.ex)
Student class
์ ์๋ก์ดfield
๊ฐ ์ถ๊ฐ ๋๋ฉด ์ง๋ ฌํ ํํ๋ ๋ฌ๋ผ์ง๊ฒ ๋๋ ๊ฒ -
๋ฒ๊ทธ์ ๋ณด์ ๊ตฌ๋ฉ์ด ์๊ธธ ์ํ์ด ๋์์ง๋ค.
๊ฐ์ฒด๋ ์์ฑ์๋ฅผ ์ฌ์ฉํด ๋ง๋๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด๋ค. ์ญ์ง๋ ฌํ๋ ๊ฐ์ฒด ์์ฑ ๊ธฐ๋ฒ์ด๊ธฐ์ ๋ถ๋ณ์์ ๋ชจ๋ ๋ณด์ฅํด์ผ ํ๊ณ ์์ฑ ๋์ค ๊ณต๊ฒฉ์๊ฐ ๊ฐ์ฒด ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ณผ ์ ์๋๋ก ํด์ผ ํ๋ฉฐ, ๊ธฐ๋ณธ ์ญ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ณ์ ๊นจ์ง๊ณผ ํ๊ฐ๋์ง ์์ ์ ๊ทผ์ ์ฝ๊ฒ ๋ ธ์ถ๋๊ฒ ๋๋ค. (์์ดํ 88)
-
ํด๋น ํด๋์ค์ ์ ๋ฒ์ ์ ๋ฆด๋ฆฌ์คํ ๋ ํ ์คํธํ ๊ฒ์ด ๋์ด๋๋ค.
์ง๋ ฌํ ๊ฐ๋ฅ ํด๋์ค๊ฐ ์์ ๋๋ฉด ์ ๋ฒ์ ์ธ์คํด์ค๋ฅผ ์ง๋ ฌํํ ํ ๊ตฌ๋ฒ์ ์ผ๋ก ์ญ์ง๋ ฌํํ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ๋๋ ๊ฐ๋ฅํ์ง๋ฅผ ๊ฒ์ฌํด์ผ ํ๋ค.
๋ํ, ๊ฐ์ฒด๋ฅผ ์ถฉ์คํ ๋ณต์ ํด๋ด๋์ง๋ฅผ ๋ฐ๋์ ํ์ธํด์ผ ํ๋ค.
์ง๋ ฌํ ์์
Serializable ๊ตฌํ์ ๋ฐ๋ฅด๋ ๋น์ฉ์ด ์ ์ง ์์ผ๋, ํด๋์ค๋ฅผ ์ค๊ณํ ๋๋ง๋ค ๊ทธ ์ด๋๊ณผ ๋น์ฉ์ ์ ์ ์ธ์งํด์ผ ํ๋ค.
์ญ์ฌ์ ์ผ๋ก BigInteger
์ Instance
๊ฐ์ '๊ฐ'ํด๋์ค์ ์ปฌ๋ ์
ํด๋์ค๋ค์ Serializable
์ ๊ตฌํํ๊ณ , ์ค๋ ๋ ํ์ฒ๋ผ '๋์'ํ๋ ๊ฐ์ฒด๋ฅผ ํํํ๋ ํด๋์ค๋ค์ ๋๋ถ๋ถ Serializable
์ ๊ตฌํํ์ง ์์๋ค.
์์์ฉ์ผ๋ก ์ค๊ณ๋ ํด๋์ค๋ ๋๋ถ๋ถ Serializable
์ ๊ตฌํํ๋ฉด ์ ๋๋ฉฐ, ์ธํฐํ์ด์ค๋ ๋๋ถ๋ถ Serializable
์ ํ์ฅํด์๋ ์ ๋๋ค. ์ด ๊ท์น์ ๋ฐ๋ฅด์ง ์์ผ๋ฉด, ๊ทธ๋ฐ ํด๋์ค๋ฅผ ํ์ฅํ๊ฑฐ๋ ๊ทธ๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ด์๊ฒ ์ปค๋ค๋ ๋ถ๋ด์ ์ง์ฐ๊ฒ ๋๋ค.
์์์ฉ์ผ๋ก ์ค๊ณ๋ ํด๋์ค ์ค Serializable
์ ๊ตฌํํ ์๋ก๋ Throwable
๊ณผ Component
๊ฐ ์๋ค. Throwable
์ ์๋ฒ๊ฐ RMI๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ก ์์ธ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด Serializable
์ ๊ตฌํํ๋ค. Component
๋ GUI๋ฅผ ์ ์กํ๊ณ ์ ์ฅํ๊ณ ๋ณต์ํ๊ธฐ ์ํด Serializable
์ ๊ตฌํํ์ง๋ง, Swing๊ณผ AWT๊ฐ ๋๋ฆฌ ์ฐ์ด๋ ์์ ์๋ ํ์
์์ ์ด๋ฐ ์ฉ๋๋ก๋ ๊ฑฐ์ ์ฐ์ด์ง ์์๋ค.
์ง๋ ฌํ์ ํ์ฅ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ฃผ์ํ ์
-
์ธ์คํด์ค ํ๋ ๊ฐ ์ค ๋ถ๋ณ์์ ๋ณด์ฅํด์ผ ํ ๊ฒ ์๋ค๋ฉด ๋ฐ๋์ ํ์ ํด๋์ค์์
finalize
๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ๋ชปํ๊ฒ ํด์ผ ํ๋ค. ์ฆ,finalize
๋ฉ์๋๋ฅผ ์์ ์ด ์ฌ์ ์ํ๋ฉด์final
๋ก ์ ์ธํ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ํด๋์ง ์์ผ๋ฉดfinalizer
๊ณต๊ฒฉ์ ๋นํ ์ ์๋ค. -
์ธ์คํด์ค ํ๋ ์ค ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ฉด ์๋ฐฐ๋๋ ๋ถ๋ณ์์ด ์๋ค๋ฉด ํด๋์ค์ ๋ค์์
readObjectNoData
๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ถ๊ฐํด์ผ ํ๋ค.์ด ๋ฉ์๋๋ ์๋ฐ 4์ ์ถ๊ฐ๋ ๊ฒ์ผ๋ก, ๊ธฐ์กด์ ์ง๋ ฌํ ๊ฐ๋ฅ ํด๋์ค์ ์ง๋ ฌํ ๊ฐ๋ฅ ์์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ ๋๋ฌธ ๊ฒฝ์ฐ๋ฅผ ์ํ ๋ฉ์๋๋ค.
private void readObjectNoData() throws InvalidObjectException { throw new InvalidObjectException("์คํธ๋ฆผ ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค"); }
์์ ์ฝ๋)
์ง๋ ฌํ ํ ๋ ์ฝ๋
public class Employee implements Serializable { protected String address; static final long serialVersionUID = 1L; public Employee(){ address ="sample address"; } }
์ง๋ ฌํ ํ ์์ ๋ ์ฝ๋
public class Employee extends Person implements Serializable { protected String address; static final long serialVersionUID = 1L; public Employee(){ address ="sample address"; } }
public class Person implements Serializable{ String name; int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } private void readObjectNoData() throws ObjectStreamException { name = "test"; age = 1; } }
-
๋ด๋ถ ํด๋์ค๋ ์ง๋ ฌํ๋ฅผ ๊ตฌํํ์ง ๋ง์์ผ ํ๋ค. ๋จ, ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ Serializable์ ๊ตฌํํด๋ ๋๋ค.
Java.io.NotSerializableException์ด ๋ฐ์ํ๊ฒ ๋๋ค. Outer class์ ์ธ์คํด์ค์ ๋ํ ์ ์๊ฐ ๋ถ๋ช ํํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด๋ผ ํ๋จ๋๋ค.
ํต์ฌ ์ ๋ฆฌ
Serializable์ ๊ตฌํํ๋ค๊ณ ์ ์ธํ๊ธฐ๋ ์์ฃผ ์ฝ์ง๋ง, ๊ทธ๊ฒ์ ๋์์์ผ ๋ฟ์ด๋ค. ํ ํด๋์ค์ ์ฌ๋ฌ ๋ฒ์ ์ด ์ํธ์์ฉํ ์ผ์ด ์๊ณ ์๋ฒ๊ฐ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ์ ๋ ธ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฑ, ๋ณดํธ๋ ํ๊ฒฝ์์๋ง ์ฐ์ผ ํด๋์ค๊ฐ ์๋๋ผ๋ฉด Serializable ๊ตฌํ์ ์์ฃผ ์ ์คํ๊ฒ ์ด๋ค์ ธ์ผ ํ๋ค. ์์ํ ์ ์๋ ํด๋์ค๋ผ๋ฉด ์ฃผ์์ฌํญ์ด ๋์ฑ ๋ง์์ง๋ค.