2023. 1. 11. 11:12ใJAVA/Effective JAVA
item03. private ์์ฑ์๋ ์ด๊ฑฐ ํ์ ์ผ๋ก ์ฑ๊ธํค์์ ๋ณด์ฆํ๋ผ.
" p24. ์ง๋ ฌํ, ์ญ์ง๋ ฌํ, Serializable, transient"
์ง๋ ฌํ Serializable ๋?
: ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ์คํธ๋ฆผ์ผ๋ก ์ํธ ๋ณํํ๋ ๊ธฐ์
์๋ฐ ์์คํ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์ ์๋ฐ ์์คํ ์์๋ ์ฌ์ฉํ ์ ์๋๋ก byte ํํ๋ก ๋ฐ์ดํฐ ๋ณํํ๋ ๊ธฐ์ ์ด๊ณ ,
์ญ์ง๋ ฌํ๋ ์ด๋ ๊ฒ byte ๋ก ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ธฐ์ ์ ๋งํ๋ค.
JVM์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผ(ํ ๋๋ ์คํ) ๋์ด ์๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ ํํ๋ก ๋ณํํ๋ ๊ธฐ์ (์ง๋ ฌํ) ๊ณผ ๋ฐ์ดํธ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํด์ JVM์ผ๋ก ์์ฃผ์ํค๋ ํํ(์ญ์ง๋ ฌํ)
๋ฐ์ดํธ์คํธ๋ฆผ์ผ๋ก ๋ณํ๋ ๊ฐ์ฒด๋ฅผ ํ์ผ๋ก ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ค๋ฅธ ์์คํ ์ผ๋ก ์ ์กํ ์ ์๋ค.
์ง๋ ฌํ Serializable ์ฌ์ฉ ๋ฐฉ๋ฒ
: ์ง๋ ฌํ๋ฅผ ํ๊ธฐ ์ํด์๋ java.io.Serializable ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์์ผ ์ง๋ ฌํ๋ฅผ ํ ์ ์๋ค.
(์ธํฐํ์ด์ค ์์ ์๋ฐ์ผ๋ฉด ์๋ฌ๋จ!)
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
public static String name;
private String isbn;
private String title;
private String author;
private LocalDate published;
private transient int numberOfSold; // transient ๋ฅผ ๋ถ์ด๋ฉด ์ง๋ ฌํ X
public Book(String isbn, String title, String author, LocalDate published) {
this.isbn = isbn;
this.title = title;
this.author = author;
this.published = published;
}
@Override
public String toString() {
return "Book{" +
"isbn='" + isbn + '\'' +
", title='" + title + '\'' +
", author='" + author + '\'' +
", published=" + published +
", numberOfSold=" + numberOfSold +
'}';
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public LocalDate getPublished() {
return published;
}
public void setPublished(LocalDate published) {
this.published = published;
}
public int getNumberOfSold() {
return numberOfSold;
}
public void setNumberOfSold(int numberOfSold) {
this.numberOfSold = numberOfSold;
}
}
๊ทธ๋ฆฌ๊ณ ํน์ ์ง๋ ฌํ๋ฅผ ์ํ์ง ์๋ ํ๋๊ฐ ์๋ค๋ฉด transient๋ฅผ ์ฌ์ฉํ๋ฉด ์ง๋ ฌํ ํ์ง ์์ ํ๋๋ฅผ ์ ์ธํ ์ ์๋ค.
์๋ฐ ์ง๋ ฌํ๋ java.io.ObjectOutputStream ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ค.
private void serialize(Book book) {
try (ObjectOutput out = new ObjectOutputStream(new FileOutputStream("book.obj"))) {
out.writeObject(book);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
์ญ์ง๋ ฌํ๋ฅผ ํ ๋์๋ ์ง๋ ฌํ๋ ๊ฐ์ฒด์ ํด๋์ค๊ฐ classpath์ ์กด์ฌํด์ผ ํ๊ณ , import ๋์ด ์์ด์ผ ํ๋ค.
์๋ฐ ์ญ์ง๋ ฌํ๋ java.io.ObjectInputStream ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ค.
private Book deserialize() {
try (ObjectInput in = new ObjectInputStream(new FileInputStream("book.obj"))) {
return (Book) in.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
Book book = new Book("12345", "์ดํํฐ๋ธ ์๋ฐ ์๋ฒฝ ๊ณต๋ต", "๋ฐฑ๊ธฐ์ ", LocalDate.of(2023, 1, 11));
book.setNumberOfSold(200);
Book.name = "hyejin";
SerializationExample example = new SerializationExample();
example.serialize(book);
Book.name = "whiteship";
Book deserialize = example.deserialize();
System.out.println("book = " + book);
System.out.println("deserialize = " + deserialize);
}
์ด๋ ๊ฒ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ๋ฅผ ํ ๊ฒ์ ํ์ธํ ์๋ ์๋ค.
์ฌ๊ธฐ์ ์ ์ ๋ณ์ static variable ๊ฐ์ธ name์ ์ง๋ ฌํ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ํ๋ฉด ์ ์ ๋ณ์๋ ์ ์ฅ๋์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ํ ๋ ํ์ฌ ์ ์ ๋ณ์์ ๋ค์ด์๋ ๊ฐ์ ๋ฐ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ ์ ๋ณ์์ ๋ค์ด๊ฐ ์๋ ๊ฐ์ ๋ฐ๊ฒ ๋๋๋ฐ ์์ Book.name = "hyejin"์ด ์๋ ๋ง์ง๋ง์ ์ ์ธํ "whiteship"์ ๋ฐ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ง๋ ฌํํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋๋ ๋์ ์ผ๋ก ๋ฐ๋ ์ ์๋ ์ ์ ๋ณ์์ ์์กดํ์ง ์๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.
SerialVersionUID๋ฅผ ์ฌ์ฉํ๋ ์ด์
์์ Book์์๋ ๋ณด๋ฉด SerialZable ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ , serialVersionUID๋ฅผ ์ ์ธํด์ค ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ฅผ ์ ์ธํด์ฃผ์ง ์์๋ ์๋์ผ๋ก ์์์ serialVersionUID๋ฅผ ์ ์ธํด์ฃผ๋๋ฐ, ์ด๋ ์คํํ ๋ ๋ง๋ค ๋๋ค๊ฐ์ ํ ๋นํด์ฃผ๊ธฐ ๋๋ฌธ์,
๋ง์ฝ ์ง๋ ฌํ๋ฅผ ํ๊ณ , ์ญ์ง๋ ฌํ๋ฅผ ํ๋ ค๋๋ฐ ๋ง์ฝ ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ทผ๋ฐ SerialVersionUID๋ฅผ ์ ์ธํด์ฃผ๊ณ , ์ง์ ๊ด๋ฆฌํด์ฃผ๊ฒ ๋๋ฉด ํด๋์ค์ ๋ณ๊ฒฝ์ด ์๋๋ผ๋ ์ญ์ง๋ ฌํ๋ฅผ ํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํด๋์ค์ ๋ณ๊ฒฝ์ ๋ฏผ๊ฐํ์ง ์๋ค๋ฉด ์ข ๋ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ค.
๋ค์ํ ์ง๋ ฌํ ๋ฐฉ๋ฒ
: ์ง๋ ฌํํ๋ ๋ฐฉ๋ฒ์๋ csv, json, ์ง๋ ฌํ ๋ฑ์ ๋ฐฉ๋ฒ์ด ์๋ค.
์ด ์ค์์๋ json์ ์์ฆ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ค.
์ง๋ ฌํ ๋ฐฉ๋ฒ์ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ ์๋ฐ ์ง๋ ฌํ๋ ์ฌ์ค ์๋ฐ ์์คํ ์์ ์๋ฐ ์์คํ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ฉด ๋๋ค.