๋ง์ ํ๋ฌํฐ ํ๋ก์ ํธ๋ค์ด ๋ชจ๋ธ ์ ์ธ์ ํ ๋ Freezed ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ค. ์ ๋ค๋ค Freezed ๋ฅผ ์ฌ์ฉํ ๋ ๊ฑธ๊น? ๊ผญ ํจํค์ง๋ฅผ ์จ์ผํ๋๊ฑธ๊น? ๋ฑ๋ฑ ๋ช๊ฐ์ง ์๋ฌธ์ ์ด ๋ค๊ฒ๋์๊ณ ๊ณต๋ถํ ๊ธฐ๋ก์ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ก ๋จ๊ฒจ๋ณด๋ คํ๋ค.
๋จผ์ ๋ชจ๋ธ ์ ์ธ์ ์์ด์ ์ ์ ์กฐ๊ฑด์ ๋ชจ๋ธ์ ํตํด ๋ง๋ค์ด์ง ์ธ์คํด์ค๊ฐ ๊ฐ์ ๋ ์์ธ์ง ๋ค๋ฅธ ๋ ์์ธ์ง ๋น๊ตํ ์ ์์ด์ผํ๋ค. ์ด๋ฅผ ๋๋ฑ์ฑ ๋น๊ต๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ์ ๋ชจ๋ธ ์ ์ธ์ ์์ด์ ๋๋ฑ์ฑ ๋น๊ต๊ฐ ์ค์ํ ๊น? ์ด์ ๋ 3๊ฐ์ง๋ก ์์ฝํ ์ ์๋ค.
1. ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ํ์ธ
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด๋ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์ด ์ ํํ ์ํ(state)์์ ๋ณด์ฅํ ์ ์์์ ์๋ฏธํ๋ค. ์ฆ ๋ฐ์ดํฐ์ ์ค๋ณต์ด ์๊ฒจ์ ์๋๋ค๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์์ง๋ผ๋ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ๋๋ง๋ฆฌ ๊ฐ์์ง ์ธ์คํด์ค๋ฅผ ๋ง๋ค์๋ค๊ณ ํ์. ๋ง์ฝ ๋๋ง๋ฆฌ ๊ฐ์์ง ์ธ์คํด์ค์ ์์ฑ (์ด๋ฆ, ๋์ด, ์ฑ๋ณ, ์ ์ ์) ์ด ๊ฐ์ผ๋ฉด ๋๊ฐ์์ง๋ ํ ๋ง๋ฆฌ์ ๊ฐ์์ง๋ก ์ทจ๊ธ๋์ด์ผํ๋ค. ๋ง์ฝ ์๋ก ๋ค๋ฅธ ๊ฐ์์ง๋ก ์ทจ๊ธ๋๋ ์ํฉ์ ๊ฐ์ ํด๋ณด์. ๋๋ ์์ธ์ผ! ์ด๋ ๊ฒ ๋ถ๋ฅด๋ฉด ํ ๋ง๋ฆฌ ๊ฐ์์ง๋ง ๋ฌ๋ ค์ค๋ ๊ฒ์ ๊ธฐ๋ํ๋๋ฐ ๋๋ง๋ฆฌ ์๋ฅ์ด ๊ฐ์์ง๊ฐ ๋ฌ๋ ค์ค๊ฒ ๋๋ ์ํฉ์ ๋ชฉ๊ฒฉํ ๊ฒ์ด๋ค. ์ฆ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๋ณด์ฅ๋์ง ๋ชปํ๋ฉด ํด๋น ๋ชจ๋ธ์ ์ฌ์ฉํ ์คํ ๋ก์ง์ ๋์ ์์ธก์ ๋ณด์ฅํ ์ ์๊ฒ๋์ด ์ฐพ๊ธฐ ๋งค์ฐํ๋ ์๋ฌ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
2. ์ปฌ๋ ์ ์์์ ์ค๋ณต์ ๊ฑฐ
์์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ด์ด์ง๋ ๋ฌธ์ ๋ก ์ธ์ด์ ๊ธฐ๋ณธ์ผ๋ก ๊ตฌํ๋์ด์๋ ์ปฌ๋ ์ ํ์ ๋ค (Set, List, Map) ์ ๊ธฐ๋ณธ ๋์์ ์ด๋ฌํ ๊ฐ์ฒด์ ๋๋ฑ์ฑ ๋น๊ต๋ก ๋์ํ๋ค. ๋ค์๋งํด ๋๊ฐ์ ๊ฐ์์ง value๋ฅผ ๊ฐ์ง ์ธ์คํด์ค๊ฐ ๊ฐ์ ๊ฐ์์ง๋ก ์ธ์์ด ๋์ง๋ชปํ๋ฉด Set ์์๋ ์๋ก ๋ค๋ฅธ ๊ฐ์์ง๋ก ์ทจ๊ธํด ์ฌ์ ํ ๋๋ง๋ฆฌ ๊ฐ์์ง๊ฐ ๋จ๊ฒ๋๊ณ , Map ์์๋ ๋๋ง๋ฆฌ์ ๊ฐ์์ง๊ฐ ์๋ก ๋ค๋ฅด๋ค๊ณ ์ทจ๊ธํด ๋๊ฐ์ ์ค๋ณต๋ key๊ฐ์ด ๋ง๋ค์ด์ง ์ ์๋ ๊ฒ์ด๋ค.
3. UI ์ ๋ฐ์ดํธ
SwiftUI, Flutter, Android Compose๋ ๋ชจ๋ ํธ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ฐ์ํ ํ๋ ์์ํฌ์ด๋ค. ์ด ์ธ๊ฐ์ UIํ๋ ์์ํฌ๋ฅผ ํฌ๊ฒ ๋ณด๋ฉด ๊ฐ์ ๊ตฌ์กฐ์ธ๋ฐ Single Source of Truth ๋ฅผ ํตํด ์ํ๋ค์ ํ ๊ณณ์ ๋ชจ์๋๊ณ ๋ถ๋ณ์์ฑ์ ์ง๋ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ํ๋ฅผ ์ฃผ์ ํ๊ฒ ๋๋ค. ๋ง์ฝ ์ํ์ ๋ณ๊ฒฝ์ ์ด ์์ ๊ฒฝ์ฐ ํด๋น๋๋ ๋ถ๋ณ UI๋ฅผ ์๋กญ๊ฒ ๊ทธ๋ ค๋ธ๋ค. ์ด ๋ ์ํ๊ฐ ๋ฐ๋๋ฉด ์ ์ฒด UI ํธ๋ฆฌ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋ ๊ฒ์ด ์๋ ์ํ์ ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ํตํด ๋ณ๊ฒฝ์ ์ด ์๋ UI๋ง ์ ๋ฐ์ดํธํ๊ฒ ๋๋๋ฐ ๋ง์ฝ ๋๋ฑ์ฑ ๋น๊ต๊ฐ ์ ๋๋ก ๋์ํ์ง ์๋ ๋ชจ๋ธ์ด ์๋ค๋ฉด ์๋์น ์์ UI๊ฐ ๊ณ์ํด์ ๋ค์ ๊ทธ๋ ค์ง ๊ฒ์ด๋ค.
์ 3๊ฐ์ง์ ์ด์ ๋ฅผ ํตํด ์ ๋ชจ๋ธ ์ ์ธ์ ์์ด์ ๋๋ฑ์ฑ ๋น๊ต๊ฐ ๊ผญ ํ์ํ์ง ์์๋ณด์๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ค์์ผ๋ก ์๊ธฐ๋ ์๋ฌธ, ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ์ด๋ค๊ฑธ ๊ธฐ์ค์ผ๋ก ํ๋๊ฑธ๊น?
Swift, Kotlin ๋ฑ๋ฑ ๋ง์ ์ธ์ด๋ค์ ํ์ ์ ํฌ๊ฒ ๋๊ฐ์ง ์ฐธ์กฐํ์ ๊ณผ ๊ฐํ์ ์ ๋๋ ์ ์๋ค. ์ฐธ์กฐํ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅ๋๋ฉฐ ๊ฐํ์ ์ ์คํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋จธ๋ฌด๋ฅด๊ฒ ๋๋ค. ์ด๋ ์ฐธ์กฐํ์ ์ ๊ฐ์ ํ์ธํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐ๋ผ๊ฐ ์ฃผ์์ ๋ง๋ ๋ฉ๋ชจ๋ฆฌ ์๋์ ์ด์ด์ผ์ง ํ์ธํ ์ ์๊ณ ๊ฐํ์ ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์๋์ ๋ฐ๋ก ์ ์ฅ๋์ง ์๊ณ ๊ฐ ๊ทธ ์์ฒด๋ฅผ ๋ฐ๋ก ํ์ธํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ํฌ์ธํธ๋ ์ฐธ์กฐํ์ ์ "๋ฉ๋ชจ๋ฆฌ ์ฃผ์"๋ฅผ ํตํด ๊ฐ์ ํ์ธํ๊ณ , ๊ฐํ์ ์ "๊ฐ" ์์ฒด๋ฅผ ํตํด ๊ฐ์ ํ์ธํ๋ค. ๋ฐ๋ผ์ ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ํ ๋๋ ์ฐธ์กฐํ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋น๊ตํ๊ณ ๊ฐํ์ ์ ๊ฐ์ ๋น๊ตํ๊ฒ ๋๋ค. ๋ง์ฝ ํด๋์ค๋ก ๋ชจ๋ธ์ ์ ์ธํ ๋ค ์ธ์คํด์ค๋ฅผ ๋น๊ตํ๊ฒ ๋๋ค๋ฉด ํด๋์ค๋ ์ฐธ์กฐํ์ ์ด๊ธฐ ๋๋ฌธ์ "๋ฉ๋ชจ๋ฆฌ ์ฃผ์"๋ฅผ ํตํด ๋น๊ตํ๊ฒ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ฐ์์ง๋๋ผ๋ ์ด ๊ฐ์์ง๊ฐ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅ๋์ด์๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์์ง๋ก ์ธ์๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฐธ์กฐํ์ ๋ชจ๋ธ์ ์ ์ธํด์ค ๋๋ ๋๋ฑ์ฑ ๋น๊ต(==) ์ฌ์ ์๋ฅผ ํตํด ๊ฐ์ด ๊ฐ์ผ๋ฉด ๊ฐ์ ๋ ์์ด๋ผ๊ณ ์์ ํด์ฃผ์ด์ผํ๋ค.
์ด์๊ฐ์ด ํด๋์ค๋ฅผ ์ด์ฉํด ๋ชจ๋ธ์ ์ ์ธํ๋ค๋ฉด ์ ์ด๋ ๋๊ฐ์ง "=="์ฐ์ฐ์์ "hashCode" ๋ฅผ ์ฌ์ ์ํด ์ฃผ์ด์ผํ๋ค. ๊ทธ๋ผ ์ฌ๊ธฐ์ ๋ ๊ฐ์ง ์๋ฌธ์ด ๋ค ์ ์๋ค.
1. HashCode๋ ์ ์ฌ์ ์ํ๋๊ฑฐ์ผ?
๋คํธ์์ ๋ชจ๋ object๋ ๊ณ ์ ํ hashcode๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์์ ์ปฌ๋ ์ ์์๋ ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ํ๋ค๊ณ ํ๋๋ฐ ์ด๋ Set์ด๋ Map์ ๊ฐ์ฒด์ hashcode๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ํ๊ฒ๋๋ค. ๋ฐ๋ผ์ hashcode๋ฅผ ํตํด ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ํ๋ ์น๊ตฌ๋ค์ ์ํด ํด๋์ค ๋ชจ๋ธ ์ ์ธ์ hashcode๋ ์ฌ์ ์ํด์ฃผ์ด์ผํ๋ค.
2. ์ ์ด์ ๊ฐํ์ ์ผ๋ก ๋ชจ๋ธ์ ์ ์ํ๋ฉด ๋์์
๋ง๋ค. ๊ฐํ์ ์ผ๋ก ๋ชจ๋ธ์ ์ ์ํ๋ฉด ๊ท์ฐฎ๊ฒ ์ฌ์ ์ํ ํ์๋ ์๊ณ ๋ฌด์๋ณด๋ค ๋ชจ๋ธ ์์ฒด๊ฐ ๋ถ๋ณ์ฑ์ด ๋ณด์ฅ๋๋ค. ๋ฐ๋ผ์ ๋์์ฑ ํ๊ฒฝ์ race condition์ผ๋ก๋ถํฐ ์์ ๋กญ๊ฒ๋๋ค. ์๋ก ๋ค๋ฅธ ๋ฉ์๋์์ ์ฃผ์๋ฅผ ํตํด ํ๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ํ๋ฅผ ๋ฐ๊พธ๊ฒ ๋๋ฉด ์๋์น์๊ฒ ๊ฒฝ์์ํฉ์ด ๋ฐ์ํ๋๋ฐ ๊ฐํ์ ์ "์ ์ผ ์ํ"๋ฅผ ๋ณด์ฅํจ์ผ๋ก์จ ์ํ๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ ์ํ๊ฒ๋ Dart์๋ ๊ตฌ์กฐ์ฒด๊ฐ ์๋ค(..) ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋คํธ์๋ ํน๋ณํ ๊ธฐ๋ฅ์ด ์๋๋ฐ ๋ฐ๋ก @immutable ์ด๋ ธํ ์ด์ ์ด๋ค.
ํด๋์ค์ @immutable ์ด๋ ธํ ์ด์ ์ด ๋ถ๊ฒ๋๋ฉด ํด๋น ํด๋์ค์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ง๊ทธ๋๋ก "๋ถ๋ณ"์ด ๋๋ค. ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ๊ฐ์ง๋ง ๊ฐ์ ์์ ํ๊ฒ ๋๋ฉด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ฐ์ ์์ ํ๋ ๊ฒ์ด ์๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์์ ๊ฐ์ ๊ณ ์ ๋๊ณ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ณ๊ฒฝ๋ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ์ฃผ์์ ์๋ ๊ฐ์ ๊ฐ๋น์ง์ปฌ๋ ํฐ์ ์ํด ์ ๋ฆฌ๋๋ค. ๋ฌผ๋ก immutable ์ ๋ถ์ธ๋ค๊ณ ํด์ ๋ชจ๋ ๊ฒ์ด ์ฅ์ ์ธ ๊ฒ์ ์๋๋ค. ์ ์ฌ์ง์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ ํ ๋๋ง๋ค ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ๊ฒ ๋์ด ๋ฉ๋ชจ๋ฆฌ ์ด์๊ฐ ์์ ์ ์๊ณ ๋ณ๊ฒฝ ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ๋น์ง์ปฌ๋ ํฐ์ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ์ฃผ๋ ๊ณผ์ ์ ๊ณ์ํด์ ํด์ผํ๋ค๋ณด๋ ์ฑ๋ฅ์ ๋จ์ ๋ ์์ ์ ์๋ค. ํ์ง๋ง ์ต๊ทผ ์ค๋งํธํฐ์ ์ฑ๋ฅ์ด ์๋ ์ข์์ ธ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ๋ณด๋ค๋ ๋์์ฑ ํ๊ฒฝ ์ด์์ ์ง์คํ๋ค๋ณด๋ @immutable ์ด๋ ธํ ์ด์ ์ ์ธ์ด ์ฌ์ค์ ํ์ค์ด ๋์ด๊ฐ๊ณ ์๋ค.
๊ทธ๋์ ์ง๊ธ๊น์ง ์ธ๊ธํ ๋ชจ๋ธ ์ ์ธ ์กฐ๊ฑด์ ๊ณ ๋ คํด์ ์์ฑํ ์์์ฝ๋๋ฅผ ๋ณด์๋ฉด ์์ ๊ฐ์ด ์ ์ธํด์ค ์ ์๋ค. ์ฌ๊ธฐ์ copywith ๋ฉ์๋๋ ์ด๋ค ๋ฉ์๋์ผ? ๋ผ๊ณ ๋ฌผ์ ์ ์๋๋ฐ copywith ๋ ๋ํ์ ์ธ ์์๋ณต์ฌ(shallow copy) ๋ฉ์๋์ด๋ค.
์์ ๋ณต์ฌ(shallow copy) vs ๊น์ ๋ณต์ฌ(deep copy)
์์ ๋ณต์ฌ๋ ์ฐธ์กฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ค๊ณ ๊น์ ๋ณต์ฌ๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ค๋ ๊ฐ๋ ์ด๋ค. ์์ ์ดํด๋ณด์๋ฏ์ด @immutable ์ด ๋ถ์ ๊ฐ์ฒด๋ ๊ฐ์ ์์ ํ ๋ ๊น์ ๋ณต์ฌ ๊ฐ๋ ์ ์ด์ฉํ๊ฒ ๋๋ค. ํ์ง๋ง ๋ถ๋ช ์์ ๋ณต์ฌ๋ฅผ ํตํด ๊ฐ์ ์์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ ์์ ๊ฒ์ด๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ํด ์์ ๋ณต์ฌ ๊ฐ๋ ์ ์ด์ฉํ๋ copywith() ๋ฉ์๋๋ฅผ ํจ๊ป ์ ์ธํ๊ฒ ๋๋ค.
์ฆ ์ง๊ธ๊ฐ์ด ๊ณ ์ ์์ฑ 3๊ฐ๋ฟ์ธ ๋ชจ๋ธ์ ์ ์ธํ๋๋ฐ๋ ์ด๋ ๊ฒ ๋ง์ ์ฝ๋๋ฅผ ํ์๋ก ํ๊ฒ๋๋ค. ์ฌ์ง์ด ์ ์ฝ๋๋ ๋ชจ๋ธ์ ์ธ์ "๊ธฐ๋ณธ"์ด ๋๋ ์ฝ๋์ด๊ณ ๋ง์ฝ json์ง๋ ฌํ ๊ฐ์ ๋ฉ์๋๊ธฐ๋ฅ์ด๋ toString๊ฐ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๋ชจ๋ธ ์ ์ธ์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๋์ด๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํด์๋ Equtable์ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. Equatable์ ํ์ฅํ๊ฒ ๋๋ฉด ๊ธฐ์กด "==" ์ฐ์ฐ์์ hashcode ์ฌ์ ์ ์ฐ์ฐ์๋ฅผ ๋จ์ํ props ๊ฒํฐ๋ก ์ค์ผ ์ ์๋ค. ํ์ง๋ง Equtable์ ํ์ฅํ์ ๋๋ copywith ๋ฉ์๋๋ json ๋ฉ์๋ ๋ฑ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ์ฌ์ ํ ์กด์ฌํ๊ฒ ๋๋ค.
freezed ํจํค์ง๋ ์ด๋ฌํ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ฌ์ค๋ค. freezed๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์์ ๊ฐ์ ์ฝ๋๋ง ์์ฑํด๋ ์ฝ๋์ ์ ํตํด immutableํ ๋ชจ๋ธ๊ณผ ์ฌ์ ์, ๊ฐ์ข ๊ธฐ๋ฅ์ ์ง๋ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค.
ํนํ ๋ด๊ฐ ์ฌ์ฉํ๋ Freezed์ ์ฃผ์๊ธฐ๋ฅ์ Union(Pattern matching) ๊ธฐ๋ฅ์ธ๋ฐ (Swift์ Result ํ์ ๊ณผ ์ ์ฌํ๊ฒ) ๊ฐ์ข ์๋ฌ์ฒ๋ฆฌ, ๋ธ๋ก์ํ๊ด๋ฆฌ์์ ํจํด๋งค์นญ์ ์ด์ฉํ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ์ข์ ์ฝ๋์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋๋ฑ ๋๋ฌด๋ ์์ฝ๊ฒ ๋ค์ํ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๋ค
์ถ๊ฐ ์ง์
๊ณต๋ถํ๋ ๋์ค ๋ชจ๋ธ ์ ์ธ ๊ด๋ จํด์ ์ ํ ๊ณต์๋ฌธ์(!!)๊ฐ ์๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค. ๋ฌผ๋ก ํ๋ฌํฐ์๋ ํ๋กํ ์ฝ๊ณผ ๊ตฌ์กฐ์ฒด๊ฐ์ ์ธ์ด์ ๊ธฐ๋ฅ์ ์์ง๋ง ๊ณตํต๋์ด ๊ณ ๋ คํด์ผํ ๋ถ๋ถ์ด ์ ์ ๋ฆฌ๋์ด์์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค ์ ํ ๊ณต์๋ฌธ์๋ผ ์ ๋ขฐ๋ 5๋ง ํผ์ผํธ์๋ค.
๋จผ์ 1์ค ์์ฝ์ผ๋ก ๋ชจ๋ธ์ ๊ตฌ์กฐ์ฒด๋ก ์ ์ธํ๋ ๊ฒ์ ๋ํดํธ๋ก ํ๋ผ๋ ๊ฒ์ด ์ ํ ๊ถ๊ณ ์ฌํญ์ด์๋ค. ์ด๋ฅผ ํ๋ฌํฐ์ ๋์ํด๋ณด์๋ฉด ์์ ํ ๊ฐ์ ๊ฐ๋ ์ ์๋์ง๋ง ์ฌ์ค์ @immutable ์ด๋ ธํ ์ด์ ์ ๋ํดํธ๋ก ์ ์ธํ๋ผ๋ ๊ฒ๊ณผ ๊ฐ์๋ค.
As a result, you can look at a section of code and be more confident that changes to instances in that section will be made explicitly, rather than being made invisibly from a tangentially related function call.
์ด์ ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ํ ํ์ ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์ ํ์๋ค. ์ฐธ์กฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ๋ฉด ๋ด๊ฐ ์ง๊ธ ์กฐ์ํ๋ ๋ฐ์ดํฐ ๊ฐ์ด ์ด๊ฒ ๋ง๋์ง ์ด๋์ ๋ฐ๊พธ๊ณ ์๋๊ฑด์ง ํ์ ํ๊ธฐ๊ฐ ํ๋ ๋ฐ ๊ตฌ์กฐ์ฒด๋ก ์ ์ธํ๋ฉด ๋ฐ๋์ง ์๋ ๊ฐ์ด๋ ํ์ ์ ๊ฐ์ง ์ ์๋ค.
ํนํ ์ด๋ถ๋ถ์ด ์ธ์์ ์ด์๋๋ฐ I/O ์์ ์ ํตํด ๋ถ๋ฌ์ค๋ ๋ฐ์ดํฐ์ ๋ชจ๋ธ์ ๊ตฌ์กฐ์ฒด(๋ถ๋ณ)๋ก ์ ์ธํ๋ผ๋ ๋ถ๋ถ์ด์๋ค. ์ธ๋ถ ์์คํ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ๋ฐ์ดํฐ์ ์์ด๋ดํฐํฐ(๋ด์ฉ)๋ ์ด์ฐจํผ ์ธ๋ถ ์์คํ ์์ ๊ด๋ฆฌ๋๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐ์ฒด๋ก ํํํ์ฌ ๋ถ๋ณ์ฑ์ ์ ์งํ๊ณ , ๊ฐ ํ์ ์ ์ด์ ์ ํ์ฉํ๋ผ๊ณ ๊ถ๊ณ ํ๊ณ ์์๋ค.
์ด๋ถ๋ถ์ ๊ฑฐ๊พธ๋ก ์๊ฐํ๋ค๋ฉด ๋ชจ๋ธ์ identity๋ฅผ ์ปจํธ๋กคํด์ผํ ๊ฒฝ์ฐ์๋ "๋ฐ๋์" ํด๋์ค(mutable)๋ก ์ ์ธํด์ผํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์๋ฅผ ๋ค์ด, ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ํ๋ด๋ ํ์ ์ ์๊ฐํด๋ณด๋ฉด ๋ฐ๋์ ํด๋์ค๋ก ์ ์ธํด์ผํจ์ ์ ์ ์๋๋ฐ ๊ตฌ์กฐ์ฒด(immutable)๋ก ์ ์ธ๋๋ค๋ฉด ์๋ก ๋ค๋ฅธ ๋ก์ปฌ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐํต๋ก๋ฅผ ์ด์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ๊ทธ๋ฐ์ง ๋ก์ปฌ ๋ฐ์ดํฐ ์ ์ฅ (Core Data, RealmDB) ๋ชจ๋ธ์ mutable๋ก ์ ์ธ๋๋ ๊ฒ์ ์ ์ ์์๋ค (๋ฌผ๋ก ์ต์ -C ์ํฅ๋ ์๊ฒ ์ง๋ง..) -> ์ด๋ฅผ ํ๋ฌํฐ๋ก ๋ณํํด์ ์๊ฐํ๋ฉด Hive ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ mutableํ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ์ง์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
ํญํ ๊ตฌ๊ธ๋ง ๊ฒฐ๊ณผ hive๋ mutableํ ๋ชจ๋ธ๋ง์ด๊ณ freezed๋ immutableํ ๋ชจ๋ธ๋ง์ด๋ผ ํจ๊ป์ฐ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ์ด์๋ ์ฐพ์๋ณผ ์ ์์๋ค.