๐ ์ด๋ฒ์ฃผ ๋ฉํ ๋ง ์๊ฐ์ <์๋ฐ์ ์ > ์ฑ ์ ๊ผผ๊ผผํ ์ฝ์๋ค๊ณ ์๊ฐํ๋๋ฐ ๋ง์ ์ง๋ฌธ ์ฃผ์ ๊ฒ์ ๋ํด ๋ต๋ณ์ ๋ชปํ๋ค. ๊ทธ ์ด์ ๋ ์จ์ ํ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค์ง ๋ชปํ๊ธฐ ๋๋ฌธ์๋ผ๊ณ ์๊ฐํ๋ค. ์ด๋ฒ์ฃผ๋ถํฐ๋ ์ฝ์ ๋ด์ฉ๊ณผ ์ดํดํ ๋ด์ฉ์ ๋ชจ๋ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๋ฉฐ "~~๊ฐ ๋ญ๊ฐ์?"๋ผ๋ ์ง๋ฌธ์ ๋๋ตํ ์ ์๊ฒ๋ ๊ณต๋ถํ ๋ด์ฉ์ ๋จธ๋ฆฟ์์ ์ง์ด๋ฃ์ ์์ ์ด๋ค.
๋ถ๋ณ ๊ฐ์ฒด(immutable object) ๋?
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์ด์ ๋ถ๋ณ๊ฐ์ฒด(immutable object)๋ ์์ฑ ํ ๊ทธ ์ํ๋ฅผ ๋ฐ๊ฟ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์์ฑ์ด ๋๋ฉด ์ ๋ขฐํ ์ ์๋ ๊ฐ์ฒด๊ฐ ๋๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ๋ถ๋ณ๊ฐ์ฒด๋ก๋ String, Integer, Boolean, BigDecimal ...์ด ์๋ค. ์๋์ ์์ ๋ String์ ์๋ก ๋ค์๋ค.
String str = "a"; //(1)
str = "b"; //(2)
str = "Immutable"; //(3)
String์ ์ฐธ์กฐ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ heap์์ญ์ ์ ์ฅ์ด ๋๋ค. ์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด ์์ฑ๊ณผ ์ฐธ์กฐ๊ฐ ์ด๋ป๊ฒ ์ผ์ด๋๋์ง ์ดํด๋ณด์.
(1)์ ์คํํ๋ฉด heap์์ญ์ str์ด ์ฐธ์กฐํ๊ณ ์๋ "a"๋ผ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
(2)๋ฅผ ์คํํ๋ฉด "a"๋ผ๋ ๊ฐ์ฒด๊ฐ "b"๋ผ๋ ๊ฐ์ผ๋ก ๋ณํ๋ ๊ฒ์ด ์๋๋ผ "b"๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ (1)์์ ์์ฑ๋์๋ str์ "b"๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.
(3)์ ์คํํ๋ฉด "Immutable"์ด๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ (1)์์ ์์ฑ๋์๋ str์ "Immutable"๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.
์์ ์ฝ๋๋ฅผ (3)๊น์ง ์คํํ๊ฒ ๋๋ฉด (1),(2)์์ ์์ฑํ๋ "a","b"๋ผ๋ ๊ฐ์ฒด๋ ์๋ฌด๊ฒ๋ ์ฐธ์กฐํ๊ณ ์์ง ์๋ ๊ฐ์ฒด๊ฐ ๋์ด GC์ ๋์์ด ๋๋ค.
์์ ์์ ์์ ๋ณผ ์ ์๋ฏ์ด String์ ๋ถ๋ณ๊ฐ์ฒด๋ผ "a"์์ "b" ๋ก ๋ณํ๋ ๊ฒ์ด ์๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋๊ฐ?
1. ๋ถ๋ณ๊ฐ์ฒด๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ฐ๋ ๋์ ์์ ํ์ฌ ๋๊ธฐํ๋ฅผ ์ํฌ ํ์๊ฐ ์๋ค.
ํ ๋ฒ ์์ฑ๋ ๋ถ๋ณ๊ฐ์ฒด์ ๋ํด์๋ ๋ค๋ฅธ ์ด๋ค ์ฐ๋ ๋๋ ๋ค๋ฅธ ์ฐ๋ ๋์ ์ํฅ์ ์ค ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ๊ฐ์ฒด๋ ์์ฌํ๊ณ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค.
2. ๋ถ๋ณ๊ฐ์ฒด๋ ๊ทธ ์์ฒด๋ก ์คํจ ์์์ฑ์ ์ ๊ณตํ๋ค.
์คํจ ์์์ฑ์ด๋ ํธ์ถ๋ ๋ฉ์๋๊ฐ ์คํจํ๋๋ผ๋ ํด๋น ๊ฐ์ฒด๋ ๋ฉ์๋ ํธ์ถ ์ ์ํ๊ฐ ์ ์ง๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๋ถ๋ณ๊ฐ์ฒด๋ ์ํ๊ฐ ์ ๋๋ก ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ๊ณตํ๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ๋ง๋๋๊ฐ?
1. setter๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. (๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋ ๋ฏธ์ ๊ณต)
2. private์ผ๋ก ์ ์ธํ๋ค.
3. final์ ์ ์ธํ๋ค. (final์ ๋ํด์ ๊ถ๊ธํ๋ค๋ฉด "final ์ ์์๋ณด์ "๊ฒ์๋ฌผ์ ์ฐธ๊ณ ํด๋ณด์)
์์ ์ธ๊ฐ๋ฅผ ๊ธฐ์ตํ๊ณ ๋ถ๋ณ๊ฐ์ฒด๋ฅผ ์ง์ ๋ง๋ค์ด๋ณด์.
public class ImmutablePhone {
private final String name; //final๋ก ์ ์ธ
private final int number; //final๋ก ์ ์ธ
public ImmutablePhone(String name, int number) { // ๊ฐ์ฒด์์ฑ ๋ฐ ๋ณ์ ๊ฐ ๋ถ์ฌ๋ ์์ฑ์๋ฅผ ํตํด์๋ง
this.name = name;
this.number = number;
}
// setter๋ฏธ์กด์ฌ
}
์์ฒ๋ผ ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์์ฑ์๋ฅผ ํตํด์๋ง name, number์ ๊ฐ์ ๋ฃ์ ์ ์๊ณ , ์ธ๋ถ์์๋ final๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ณ๊ฒฝ์ด ๋์ง ์๋๋ค.
ํ์ง๋ง ๋ถ๋ณ๊ฐ์ฒด ๋ด์ ๊ฐ๋ณ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ฐ๊ณ ์๋ค๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค. ์๋์ ์์๋ฅผ ๋ณด์
public class ImmutablePhone { // (1)
private final Iphone iphone;
public ImmutablePhone(final Iphone iphone) {
this.iphone = iphone;
}
public Iphone getIphone() {
return iphone;
}
}
class Iphone { // (2)
private int version;
public Iphone(int version) {
this.version = version;
}
public void setVersion(int version) {
this.version = version;
}
public int getVersion() {
return version;
}
}
(1) ์ final์ ์ด์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ์๊ณ , setter๋ฉ์๋ ์ญ์ ๋ง๋ค์ง ์์๋ค. (2)๋ฅผ ์ฐธ์กฐ ๋ณ์๋ก ๋ฐ๊ณ ์๋ค.
(2) ๋ ๊ทธ๋ฅ ์ผ๋ฐ ๊ฐ์ฒด์ด๋ค. setter์ getter๊ฐ ์กด์ฌ.
// ์คํ์ฝ๋
public static void main(String[] args) {
Iphone iphone = new Iphone(10);
ImmutablePhone phone = new ImmutablePhone(iphone);
System.out.println(phone.getIphone().getVersion()); // 10
phone.getIphone().setVersion(14);
System.out.println(phone.getIphone().getVersion()); // 14
}
}
phone์ด๋ผ๋ ์ผ๋ฐ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค ImmutablePhone ๊ฐ์ฒด๋ฅผ ์์ฑ ํ ์ฐธ์กฐ๊ฐ์ฒด๋ก Iphone์ ๋ฃ๋๋ค. ์ผ๋ฐ๊ฐ์ฒด๋ก ์ฐธ์กฐ๋ณ์๋ฅผ ๋ฐ์์ ์ผ๋ฐ๊ฐ์ฒด์ ์ ๊ทผํ์ฌ setter๋ฅผ ์กฐ์ํ ์ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ (1)์ ์๋ฌด๋ฆฌ final์ ์ ์ธํ๊ณ setter๋ฅผ ์์ค๋ค ํด๋ ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๊ฐ ๋ถ๋ณ๊ฐ์ฒด๊ฐ ์๋๋ผ๋ฉด ์ ๊ทผํ์ฌ ๊ฐ ์กฐ์์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ๊ฐ์ฒด๊ฐ ๋๋ ค๋ฉด ์ฐธ์กฐ๊ฐ์ฒด ์ญ์ ๋ถ๋ณ๊ฐ์ฒด์ฌ์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด List๊ฐ์ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊น?
public class ListObject {
private final List<ImmutablePhone> phone;
public ListObject(final List<ImmutablePhone> phone) { // ์๋ก์ด List๋ฅผ ๋ง๋ค์ด ์๋ณธ ๊ฐ์ฒด์ ์ ๊ทผ ๋ชปํ๋๋ก ํ๋ค.
this.phone = new ArrayList<>(phone);
}
public List<ImmutablePhone> getPhone() {
// return์ ๋ณต์ฌ๋ณธ์ returnํ๋ฉด ๋๋ค
// unmodifiableList()๋ก ๋ฆฌํด๋๋ ๊ฐ์ฒด๋ ์๋ณธ์ ์์ ํ ์ ์๋ค.
// ์ฆ, read-only๋ง ๊ฐ๋ฅํ ๋ฉ์๋์ด๋ค.
return Collections.unmodifiableList(phone);
}
}
์์ ์ฝ๋์ ๊ฐ์ด ๋ณต์ฌ๋ณธ์ return์ํจ๋ค. Collection.unmodifiableList() ๋ฉ์๋๋ก ์ธํด return๋๋ ๊ฐ์ฒด๋ ์๋ณธ ์ปฌ๋ ์ ์ผ๋ก ์ ๊ทผ์ด ๋ถ๊ฐํ๋ฉฐ read-only์ํ๊ฐ ๋๋ค.
public class ImmutableTest {
public static void main(String[] args) {
List<ImmutablePhone> immutablePhone = new ArrayList<>();
immutablePhone.add(new ImmutablePhone(new Iphone(3)));
immutablePhone.add(new ImmutablePhone(new Iphone(4)));
ListObject listObject = new ListObject(immutablePhone);
for (ImmutablePhone list : listObject.getPhone()) {
System.out.println(list.getIphone().getVersion()); // 3 // 4
}
immutablePhone.add(new ImmutablePhone(new Iphone(5)));
immutablePhone.add(new ImmutablePhone(new Iphone(6)));
for (ImmutablePhone list : listObject.getPhone()) {
System.out.println(list.getIphone().getVersion()); // 3 // 4
}
}
}
์ด์ฒ๋ผ ๋ถ๋ณ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ฐธ์กฐ๊ฐ์ฒด ์ญ์ ๋ถ๋ณ์ด์ด์ผ ํ๋ค๋ ์ ์ ๊ผญ ์ ์ํด์ผ ํ๋ค.
'Language > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java]Java ์์์ I/O(์ ์ถ๋ ฅ)-Stream (0) | 2021.09.11 |
---|---|
[Java]Serializable(์ง๋ ฌํ)๋? (0) | 2021.09.05 |
[Java]equals()์ hashCode()์ ๋ํด์ ์์๋ณด์(๋๋ฑ์ฑ ๋์ผ์ฑ) (0) | 2021.08.29 |
[Java] ConcurrentHashMap์ ๋ํด ์์๋ณด์ (1) | 2021.08.28 |
[Java] String literal ๊ณผ new String() ์ ์ฐจ์ด (0) | 2021.08.22 |
๋๊ธ