Item 17. Minimize Mutability
๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๋ผ
๋ถ๋ณ ์ธ์คํด์ค๋ก ์์ฑ๋ ์ ๋ณด๋ ๊ฐ์ฒด๊ฐ ์๋ฉธํ๋ ์๊ฐ๊น์ง ์ ๋ ๋ฌ๋ผ์ง์ง ์๋๋ค. ์ด ํน์ง์ ๊ฐ๋ณ ํด๋์ค๋ณด๋ค ์ค๊ณํ๊ณ ๊ตฌํํ๊ธฐ ์ฝ๊ณ , ์ค๋ฅ๊ฐ ์๊ธธ ์ฌ์ง๋ ์ ๊ณ , ํจ์ฌ ์์ ํ๊ฒ ํด์ค๋ค.
๋ถ๋ณ ํด๋์ค ์์ฑ์ 5๊ฐ์ง ๊ท์น
๊ฐ๋จํ ๋งํ๋ฉด ์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ด ์์ฑ๋ ์์ ๋ถํฐ ์๋ฉธ๋ ๋๊น์ง ์ ๋ ๋ฌ๋ผ์ง์ง ์๋๋ก ํ๋ฉด ๋๋ค.
๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋(๋ณ๊ฒฝ์) ์ ๊ณต X
ํด๋์ค ํ์ฅ ๊ธ์ง
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ํด๋์ค๋ฅผ final๋ก ์ ์ธํ์ฌ ํ์ ํด๋์ค ์์ฑ์ ๋ง๋ ๊ฒ์ด ์กด์ฌ
๋ชจ๋ ์์ฑ์๋ฅผ private ํน์ package-private์ผ๋ก ์ ์ธํ ๋ค, public ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌ(๋ ์ ์ฐํ ๋ฐฉ๋ฒ)
๋ชจ๋ ํ๋ final ์ ์ธ
๋ชจ๋ ํ๋ private ์ ์ธ
์์ ์ธ ๋ด๋ถ์ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋ํ ์ ๊ทผ ์ ๊ณต X
ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐํ X
์ ๊ทผ์ ๋ฉ์๋๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด ์ฐธ์กฐ ์ง์ ๋ฐํ X
์์ฑ์ / ์ ๊ทผ์ / readObject ๋ฉ์๋์์ ๊ฐ๋ณ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ด์ ์ผ๋ก ๋ณต์ฌ๋ฅผ ์ํํด์ผ ํจ
์์ ๊ท์น์ ์งํจ ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ๊ธฐ์ ์ฌ์น ์ฐ์ฐ ๋ฉ์๋(plus
, minus
, times
, dividedBy
)๋ ๋ชจ๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์๋ ์ธ์คํด์ค์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
๋๋ฌธ์ ๋ฉ์๋ ์ด๋ฆ๋ add
๊ฐ์ ๋์ฌ๊ฐ ์๋ plus
๊ฐ์ ์ ์น์ฌ๋ฅผ ์ฌ์ฉํ ๊ฒ๋ ์ ์ ์๋ค.(BigInteger
, BigDecimal
ํด๋์ค๋ ํด๋น ๋ช
๋ช
๊ท์น์ ์งํค์ง ์์ ํผ๋์ ์ฃผ๊ณ ์๋ค.)
๋ถ๋ณ ํด๋์ค์ ์ฅ์
์ค๋ ๋ ์์ ๊ณผ ์ธ์คํด์ค ์บ์ฑ
๊ทผ๋ณธ์ ์ผ๋ก ๋ณํ์ง ์์ ์ค๋ ๋ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋๊ธฐํํ ํ์๊ฐ ์์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฌ์ฉํด๋ ์์ ํ๋ค. ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๋๋ ๊ฒ์ด ์ค๋ ๋ ์์ ์ฑ์ ์ป์ ์ ์๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ๋ค.
๋ถ๋ณ๊ฐ์ฒด๋ ๋ค๋ฅธ ์ค๋ ๋์ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ฅ์ ์ ์ด๋ ค ํ ๋ฒ ๋ง๋ ์ธ์คํด์ค๋ฅผ ์ค๋ณต ์์ฑํ์ง ์๊ณ ์ฌํ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ณตํด์ค ์ ์๋๋ฐ, 2๋ฒ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํด๋ผ์ด์ธํธ๋ฅผ ์์ ํ์ง ์๊ณ ํ์์ ๋ฐ๋ผ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์บ์ฑํ์ฌ ์ฌํ์ฉํ ์ ์๋ ์ฅ์ ์ด ์๊ธด๋ค.
๋ด๋ถ ๋ฐ์ดํฐ ๊ณต์
๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฆฌ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ฌ ๋ณต์ฌํ์ง ์๊ณ ์ฌ์ฉํ ์ ์๋ค.
๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ ๊ฐ์ฒด์ธ ๋ด๋ถ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด๋ค.
์คํจ ์์์ฑ ์ ๊ณต
๋ด๋ถ ์ํ๋ฅผ ๋ฐ๊พธ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋์์ ์์ธ๊ฐ ๋ฐ์ํ ํ์๋ ๊ทธ ๊ฐ์ฒด๋ ์ฌ์ ํ ์ ํจํ ์ํ์ฌ์ผ ํ๋ค(์คํจ ์์์ฑ)๋ ๊ท์น์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ฅด๊ฒ ๋๋ค.
๋ถ๋ณ ํด๋์ค์ ๋จ์
์ฅ์ ์ด์ ๋จ์ ์ธ ๋ถ๋ถ์ผ๋ก, ๊ฐ์ ์์ฃผ ์กฐ๊ธ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์ ์ด๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋์ฒํ๊ธฐ ์ํด, ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ถ๋ณ ํด๋์ค์ ๋จ์ ์ด ์กด์ฌํ๋ ์ฐ์ฐ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ก ํด๊ฒฐํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์ฐ์ฐ์ ์์ธก ๊ฐ๋ฅํ ๊ฒฝ์ฐ: package-private์ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ฅผ ๋์ด ์ฐ์ฐ์ ์ํ(
BigInteger
)ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์ฐ์ฐ์ ์์ธกํ ์ ์๋ ๊ฒฝ์ฐ:
StringBuilder
์ ๊ฐ์ ๋ณ๋์ ๊ฐ๋ณ ๋๋ฐ ํด๋์ค๋ฅผ ์ ๊ณต
Last updated