๐ด ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ(Immutability)๋?
๊ฐ์ฒด๊ฐ immutable ํ๋ค๋ ๊ฒ์ ๊ฐ์ฒด๊ฐ ์ต์ด ์์ฑ๋ ์์ ์ดํ ์ํ ๊ฐ์ด ๋ณํ์ง ์๋๋ค๋ ์๋ฏธ์ด๋ค.
๊ฐ์ฒด๋ฅผ ์ฒ์ ๋ง๋ค์์ ๋์ ์์ฑ์ ํด๋น ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋๊น์ง ๊ทธ๋๋ก ์ ์งํ๋ค๋ ๊ฒ.
๐ด ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด ์ ์ค์ํ ๊น? ์ด๋ค ์ฅ๋จ์ ์ด ์์๊น?
์ดํํฐ๋ธ ์๋ฐ(Effective Java)์์๋ ํน๋ณํ ์ด์ ๊ฐ ์์ง ์์ ์ด์ ํด๋์ค๋ immutableํด์ผ ํ๋ค๊ณ ํ๋ค.
Classes should be immutable unless there's a very good reason to make them mutable....If a class cannot be made immutable, limit its mutability as much as possible.
์ฌ๋ฌ๊ฐ์ง ์ฅ์ ์ด ์กด์ฌํ๋๋ฐ
์ผ๋จ ๊ฐ์ฒด๋ฅผ immutableํ๊ฒ ์์ฑํ๋ค๋ฉด ์์ฑ ์์ ์ดํ ํด๋น ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก, ์คํ ์ค์ธ ์ฐ๋ ๋ ๊ฐ์ ์๋ก ๊ฐ์ญ์ ์ํด ์๊ธธ์ ์๋ ๋๊ธฐํ(synchronization) ๋ฌธ์ ์ ๋ํ ๊ฑฑ์ ์ ์ ํด๋ ๋๊ฒ ํด์ค๋ค.
์์ ๊ฐ์ ๊ฒ์ Thread safeํ๋ค๊ณ ํ๋ค.
์ด๋ฐ ์ด์ ๋๋ฌธ์ ๋์์ฑ์ด ์ค์ํ ํ๋ก๊ทธ๋จ์์ ํนํ ์ ์ฉํ๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ค์ ํ์ฉํ๋ฉด side-effect์ ๋ํ ๊ฑฑ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ค๊ณ, ๊ตฌํ, ๋ฐ ์ฌ์ฉํ๋๋ฐ ํธ๋ฆฌํ๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ๋ก๊ทธ๋จ ์คํ ๊ฐ exception์ด ๋ฐ์ํ๋๋ผ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ค์ ์ํ๊ฐ์ ๋ณํจ์ด ์๊ณ , ์ด๋ฐ ์ฅ์ ๋๋ฌธ์ ์บ์ ํด๋๊ณ ์ฌ์ฉํ๋ค๋ฉด ํจ์จ์ ๊ทน๋ํํ ์ ์๋ค.
ํ์ง๋ง, Immutability๋ฅผ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์๋ ๋จ์ ๋ ์กด์ฌํ๋ค.
๋ชจ๋ ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ๊ฒ ๋๋ค๋ฉด, ์ํ ๋ณํ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผํ๋ค๋ ๋จ์ ๋ ์๊ณ , ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง์ด ์์ฑํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฑฑ์ ๋ ์๋ค.
ํ์ง๋ง Oracle์์๋ ๊ฐ์ฒด ์์ฑ ๋น์ฉ์ ๋ํ ์ํฅ์ ์ข ์ข ๊ณผ๋ ํ๊ฐ๋๋ฉฐ, ๋ถ๋ฉด ๊ฐ์ฒด๋ฅผ ํ์ฉํ ๋์ ์ด์ ๋ค์ด ์ด๋ฐ ๋จ์ ์ ์์ํ๋ค๊ณ ํ๋ค.
๐ด ๊ฐ์ฒด๋ฅผ Immutableํ๊ฒ ์ฐ๋ ๋ฐฉ๋ฒ?
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ถ๋ณ์ฑ์ ์ง์ผ ์์ฑ๋ ์ ์๊ฒ ํด๋์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
1) setter ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ๋ง์
๊ฐ์ฒด์ ์ํ๊ฐ์ ๋ณ๊ฒฝํ๋ setter ๋ฉ์๋๋ฅผ ์์ ๋ง๋ค์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
IDE๋ก ๊ฐ๋ฐํ๋ค๋ณด๋ฉด getter์ setter ๋ฉ์๋๋ฅผ ๋ชจ๋ ํด๋์ค์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ,
์ํ ๊ฐ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ ํด๋์ค์ setter ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ์ํ ๊ฐ์ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์๋๋ฐ getter ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฑด ๋ถํ์ํ ์ฝ๋๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ๋ ๊ผด์ด ๋๋ค.
์์ฝ : ์ํ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๊ธฐ ์ํด setter ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
2) final class๋ก ์ ์ธ
ํด๋์ค ์์ฒด๋ฅผ final๋ก ์ ์ธํ๋ฉด ํด๋น ํด๋์ค๋ฅผ ๋ค๋ฅธ ํด๋์ค์์ ์์ ๋ฐ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๋ถ๋ชจ ํด๋์ค์ ์ ์ธ๋์ด ์๋ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์์์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ ๋ฟ์ด์ง ํด๋น ํด๋์ค ๊ฐ์ฒด๋ค์ด immutability๋ฅผ ๋ณด์ฅํ์ง๋ ์๋๋ค.
์ ์ธํ final class 1๋ฒ setter ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์๋ ๋ฐฉ๋ฒ์ ํจ๊ป ์ฌ์ฉํด์ผ setter๋ฅผ ์ฌ์ฉํ ์ํ๊ฐ ์์ ์ ๋ง์ ์ ์๋ค.
3) ๋ชจ๋ mutable ํ๋๋ฅผ final๋ก ์ ์ธ
java์์ ๋ณ์๋ฅผ final๋ก ์ ์ธํ๋ฉด ํด๋น ๋ณ์๋ฅผ ์ด๊ธฐํ ํ ๋ ํ ๋น๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ค.
์ธ์คํด์ค ๋ณ์๊ฐ primitive type์ด๋ผ๋ฉด final๋ก ์ ์ธํ์ฌ ๋ถ๋ณ์ฑ์ ์ ์งํ ์ ์๋ค.
ํ์ง๋ง ์ธ์คํด์ค ๋ณ์๊ฐ ํน์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์ฐธ์กฐ ๋ณ์๋ผ๋ฉด, ์ฐธ์กฐ ๋์์ด ๋ฐ๋ ์ ์๋ค๋ ๋ป์ผ ๋ฟ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด ์์ฒด์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ ์๋ ์๋ค.
์ด๋ฐ, ๊ฒฝ์ฐ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด ๋ํ immutableํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ๋ ์ฒ๋ฆฌํด์ฃผ์.
4) ๋ชจ๋ ํ๋์ ์ ๊ทผ์ ์ด์๋ฅผ private๋ก ์ ์ธ
ํด๋์ค์ ๋ชจ๋ ํ๋๋ฅผ private์ผ๋ก ์ ์ธํ๋ฉด ํด๋น ํด๋์ค๋ง ํด๋น ํ๋์ ๋ํ ์ ๊ทผ๊ถํ์ ๊ฐ์ง๊ฒ ๋๋ค.
ํด๋์ค์ setter ๋ฉ์๋๊ฐ ์๋ค๋ฉด private์ผ๋ก ์ ์ธํด ์ธ๋ถ ํด๋์ค๋ก๋ถํฐ ์ ๊ทผ์ ์ฐจ๋จํ ์ ์๋ค.
5) ์์ฑ์๋ฅผ ํตํด ์ด๊ธฐํ๋๋ ํ๋๋ค์ ๊น์ ๋ณต์ฌ๋ฅผ ํตํด ์ฐธ์กฐ ๋์ ์ฌํ ๋น
์์ฑ์๋ฅผ ํตํด ์ด๊ธฐํ ๋๋ ์ธ์คํด์ค ๋ณ์๋ค์ด reference ๋ณ์๋ผ๋ฉด ๊น์ ๋ณต์ฌ๋ฅผ ํตํด ์ฐธ์กฐํ๋ ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ์ด ๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
6) getter๋ฉ์๋๋ ๊ฐ์ฒด์ ๊น์ ๋ณต์ฌ๋ณธ์ ๋ฐํ
getter ๋ฉ์๋๋ ์ค์ ๊ฐ์ฒด์ ๋ํ reference๋ฅผ ๋ฐํํ๋ ๋์ ๊น์ ๋ณต์ฌ๋ฅผ ํตํด ์์ฑํ ๊ฐ์ฒด์ ๋ํ reference๋ฅผ ๋ฐํํ์ฌ, ๋ฐํ๋ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์ค์๋ก๋ผ๋ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๊ฑด๋๋ฆด ์ผ์ด ์๊ฒ๋ ๋ง๋ค์.
์ฐธ๊ณ ์๋ฃ :
https://www.baeldung.com/java-immutable-object
https://seunghyunson.tistory.com/24
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ ์ง๋ ฌํ (1) | 2024.03.11 |
---|---|
OOPS์ ๊ฐ๋ (0) | 2024.03.08 |
Arrays.sort() Collections.sort()์์ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ (1) | 2024.03.06 |
.equals์ .hashCode() (1) | 2024.03.06 |
์๋ฐ ๊ฐ์ ๋จธ์ JVM(Java Virtual Machine) (0) | 2024.02.27 |