์ด๋ฒ ๊ธ์ ๋ฆฌ์คํธ ์ฌ์ฉ์ ๋ฐ๋ณต๋ฌธ ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
์๋ง๋ ๊ฐ๋ฐ์ ์งํ ํ๋ฉด์ ๋ฆฌ์คํธ(List) ๋๋ ์ด๋ ์ด(Array) ํ์ ์ ๋ํด์๋ ์์ฃผ ์ฌ์ฉํด ๋ด์ ๋ฌด์จ ํํ์ ํ์ ์ธ์ง๋ ๋ค๋ค ์๊ณ ์์ ๊ฒ์ด๋ค.
๋ฆฌ์คํธ(List)๋ ์ด๋ค ํํ์ ํ์ ์ ์ฌ๋ฌ ๊ฐ ๋ด์ ์ ์๋๋ก ํด์ฃผ๋ ๋ฐ์ดํฐ ํ์ ์ค ํ๋์ธ๋ฐ, ๋ฆฌ์คํธ์ ์๋ ๋ง์ ๊ธฐ๋ฅ๋ค ์ค ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ์ ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ์ข์์ง์ ๋ํด์ ๊ฒฝํ์ด๋ ์๊ณ ์๋ ๋ฒ์ ๋ด์์ ์์ฑํด ๋ณด๋ ค๊ณ ํ๋ค.
"์ ๋ชป๋ ๋ด์ฉ์ด ์์ ์๋ ์์ผ๋ ๋๊ธ ๋จ๊ฒจ ์ฃผ์๋ฉด ์ ๋ฐ์ดํธ ํ๋๋ก ํ๊ฒ ์ต๋๋ค."
๋จผ์ , ๋ฆฌ์คํธ(List)๋ฅผ ์ฌ์ฉํด ๋ฐ๋ณต๋ฌธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์์๊น?
์ด ๋ถ๋ถ์ ๋ํด์๋ ๊ฒฝํ์ ํด๋ณด์ ๋ถ๋ค๋ ์์ ๊ฒ์ด๊ณ , ์์ง ๊ฒฝํํ์ง ๋ชปํ ๋ถ๋ ์์ ๊ฒ์ด๋ค. ๋ฌผ๋ก ์ด๋ฐ ์ผ์ด์ค๋ก ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃจ์ง ์์ ์๋ ์๋ค.
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ์ ๋ฆฌ์คํธ ์ธ๋ฑ์ค์ ์ ๊ทผํด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ์.
๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ๋ถ์์๋ ๋น์ฐํ ๋ฌธ์ ๊ฐ ์๋ค. ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ๊ฒ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น ?
๋ฆฌ์คํธ(List)์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์คํํ ๋์ ๋ฆฌ์คํธ์ ์ญ์ ๋๋ ์ถ๊ฐ๋ก ์ธํ์ฌ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค๋ฅผ ๋ณด์ฅํ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
์์ ๋ฅผ ๋ง๋ค์ด์ ํ์ธํด ๋ณด์.
0-9๊น์ง 10๊ฐ์ ์ ์ํ(int) ํ์ ์ ๋ด๊ณ ์๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ , ๋ฆฌ์คํธ์ ๊ธธ์ด ๋งํผ ๋ฐ๋ณต๋ฌธ์ ์คํํ๋ฉด์, ๋ฐ์ดํฐ๋ฅผ 2๋ก ๋๋ ๋ชซ์ด 0์ด๋ฉด ์ ๊ฑฐํ๋๋ก ํด๋ณด์.
์ฌ๊ธฐ๊น์ง๋ ๋ฌธ์ ๊ฐ ์์ด ์ ์คํ์ด ๋๋ค.
void main() {
List<int> _numbers = List.generate(10, (i) => i);
print(_numbers);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for (int i = 0; i < _numbers.length; i++) {
if (_numbers[i] % 2 == 0) {
_numbers.removeAt(i);
}
}
print(_numbers);
// [1, 3, 5, 7, 9]
}
์ด์ ์กฐ๊ฑด์ ํ๋ ๋ ์ถ๊ฐํด์ 2๋ก ๋๋ ๋ชซ์ด 0์ด ์๋ ๊ฒฝ์ฐ์๋ 2๋ฅผ ๊ณฑํ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝํ๋๋ก ํด๋ณด์.
2๋ฅผ ๊ณฑํด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด ์ฃผ์์ง๋ง, ๊ฒฐ๊ณผ ๊ฐ์ ๋ณด๋ฉด 2๋ก ๊ณฑํด์ฃผ์ง ๋ชปํ๊ณ ์๋ค.
for (int i = 0; i < _numbers.length; i++) {
if (_numbers[i] % 2 == 0) {
_numbers.removeAt(i);
} else {
_numbers[i] = _numbers[i] * 2;
}
}
print(_numbers);
// [1, 3, 5, 7, 9]
์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์์๊น ? ๋ฐ๋ก ๋ฐ๋ณต๋ฌธ ์์์ ๋ฆฌ์คํธ(List)์ ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝ ์์ผฐ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค.
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ์ค์ด๋ค๋ฉด์ ๋ฆฌ์คํธ์ ์์๋ ๋ณ๊ฒฝ๋์ง ์์ง๋ง, ์ธ๋ฑ์ค ์์์ ํด๋นํ๋ ์์๊ฐ ๋ณ๊ฒฝ ๋์ด์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ฌผ๋ก , ๋ฆฌ์คํธ ํ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์๋ ์๊ณ , ๋ณ์๋ฅผ ์ถ๊ฐํด์ ์ฌ์ฉํ ์๋ ์์ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋ฐ์์ผ๋ก ๋ถํ์ํ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค.
void main() {
List<int> _numbers = List.generate(10, (i) => i);
List<int> _newNumbers = [];
for (int i = 0; i < _numbers.length; i++) {
if (_numbers[i] % 2 != 0) {
_newNumbers.add(_numbers[i] * 2);
}
}
print(_newNumbers);
// [2, 6, 10, 14, 18]
}
์์์ ์๋ก์ด ๋ณ์๋ฅผ ์ถ๊ฐํด ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ์ ์ข์ง ๋ชปํ ๊ฑธ๊น ?
์ด๊ฑธ ์ดํดํ๊ธฐ ์ํด์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ immutable, mutable์ ๋ํด์ ์ง๊ณ ๋์ด๊ฐ์ผ ํ๋ค.
์ ํํ ๋ด์ฉ์ ๋ํด์๋ ๋ณ๋๋ก ๊ธ์ ์์ฑํ ์์ ์ด๊ณ , ๊ฐ๋จํ๊ฒ๋ง ์๊ณ ๊ฐ๋๋ก ํ์.
์ด ๋ถ๋ถ์ Dart ์ธ์ด ์ธ์ ๋๋ถ๋ถ์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํด๋น๋๋ ๋ด์ฉ์ด๊ธฐ๋ ํ๋ค.
immutable์ ๋ถ๋ณํ ์ฑ์ง์ ๋ํ๋ด๊ณ mutable์ ๊ทธ ๋ฐ๋์ธ ๋ณํ ์ ์๋ ์ฑ์ง์ ๋ปํ๋ค.
Flutter์ ์ฌ์ฉ๋๋ ๋ณ์ ํ์ ์ค ๋ํ์ ์ธ immutable ์ฑ์ง์ ๊ฐ์ง๊ณ ์๋ String ํ์ ์ ์ดํด๋ณด๋๋ก ํ์.
๋ฌธ์์ด์ ์ฒ์์ "NewYork"์ด๋ผ๊ณ ๊ฐ์ ํ ๋น ํ์๋ค. ๊ทธ ํ์ "Seoul"๋ก ๊ฐ์ ๋ณ๊ฒฝ์ ํ๋ค. ๋น์ฐํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ์ด ๋์๋ค.
๊ทผ๋ฐ ์ String์ immutable ์ฑ์ง์ธ ๋ถ๋ณํ ํ์ ์ธ ๊ฑธ๊น ? ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ฐ..
void main() {
String city = "NewYork";
city = "Seoul";
print(city);
// seoul
}
๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ ํํ๊ฒ ๋งํ๋ฉด String์ immutable ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ณํ ๊ฒ์ด ์๋ ์๋ก์ด ๊ฐ์ ์ ์ธํ๊ฒ ๋ ๊ฒ์ด๋ค. ์ฆ ์ฒ์์ city์ ๋ณ๊ฒฝ๋ city๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๊ฐ ์๋๊ณ , ๊ฐ๋ณ์ ์ผ๋ก ๊ฐ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์๋ ์ํ๊ฐ ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด city๋ฅผ ์ ์ธํ ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ์ด "00000000" ์ด๋ผ๊ณ ํ์.
city์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ์ธ "00000000" ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ "00000001" ์ด๋ผ๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ city๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์ ๊ฐ์ ๋ณ๊ฒฝํด ์ฃผ๊ธฐ ๋๋ฌธ์ immutable์ด์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ํ๋ง๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋ ์ฃผ์ ๊ฐ์ด ๋ณต์ฌ๋๋ ๊ฒ์ด๋ค.
๊ฐ์ฅ ์ฝ๊ฒ Flutter์์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ hashCode๋ฅผ ์ถ๋ ฅํด ํ์ธํด ๋ณด๋ฉด ๋๋ค. hashCode๊ฐ ๋ค๋ฅด๊ฒ ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋์ผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋๋ผ๋ ์๋ฏธ๋ค.
"HashCode๋ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ์์ฑ๋ ์๋ณ ๊ฐ๋ฅํ ์ ์ํ์ ๊ณ ์ ํ ๊ฐ์ด๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋ง๋ค ๊ฐ์ ๋ณ๊ฒฝ๋จ"
void main() {
String city = "NewYork";
print(city.hashCode);
// 929241207
city = "Seoul";
print(city.hashCode);
// 518004294
}
๊ทธ๋ ๋ค๋ฉด mutable ํ์ ์ ์ด๋ป๊ฒ ๋ค๋ฅธ ๊ฒ์ผ๊น ?
๋น์ฐํ ๊ฐ์ ๋ณ๊ฒฝ ํ๋๋ผ๋ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์ ๋ณต์ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ , ๋์ผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝ์ด ๋๋ ๊ฒ์ด๋ค.
๋ฆฌ์คํธ(List)๋ ๋ํ์ ์ธ mutable์ฑ์ง์ ํ์ ์ด๋ค.
HashCode๊ฐ ๋์ผํ๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
void main() {
List<String> platform = ["iOS", "Android", "Web", "Linux"];
print(platform.hashCode);
// 170602879
platform[3] = "Windows";
print(platform.hashCode);
// 170602879
}
์ง๊ธ๊น์ง ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ๋ฐ๋ณต๋ฌธ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๋ค ๋ง๊ณ ์ immutable, mutable ์ฑ์ง์ ๋ํด์ ๋ค๋ฃฌ๊ฑด์ง๋ ๋ฐ๋ก ์์์ ๋ค๋ฃฌ ์ผ์ด์ค ๋๋ฌธ์ด๋ค.
๋ฆฌ์คํธ(List)๋ฅผ ์ฌ์ฉํด ๋ฐ๋ณต๋ฌธ์์ ๋ฆฌ์คํธ์ ์์๊ฐ ๋ณด์ฅ๋์ง ์์ ์ ํํ ์์๋ฅผ ๋ค๋ฃจ์ง ๋ชปํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณผ ๋์, ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ก ๋ค๋ค์๋ค.
๊ทธ ์์ ๋ฅผ ๋ค๋ฃจ๋ฉด์ ๊ทธ๋ฆฌ ์ข์ง ๋ชปํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์ด์ ๊ฐ ๋ฐ๋ก ํ์
์ ์ฑ์ง ๋๋ฌธ์ด๋ค.
๋ฆฌ์คํธ(List)๋ mutable(๋ณํ ์ ์๋) ํ์ ์ด์ด์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ฐ, ๊ตณ์ด ์๋ก์ด ๋ณ์๋ฅผ ์ถ๊ฐํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์ ์ฌ์ฉํ ํ์๊ฐ ์์๊น ?
๋ฌผ๋ก , ๋ช ๋ฒ ๊ทธ๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ง๊ณ ํฌ๋์๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ด ์ฆ์ ๋ฐ์ํ์ง๋ ์๋๋ค. ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋๋ฉด ์๋นํ ๋ถ๋ด์ด ์ค๋ ๊ฒ๋ ์ฌ์ค์ด๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ ๋งํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๋กญ๊ฒ ๋ฐ๊ฒ ๋๊ณ , ๊ธฐ์กด์ ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์ฌ์ฉ๋์ง ์์ผ๋ฉด GC(Garbage Collector)์ ์ํด ๋ฐ๋ฉ๋์ด ๊ฐ์ฉ ์ํ์ ์์ญ์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ๋ ํ์ง๋ง GC๋ ์์คํ ์ ์ํด ์๋์ผ๋ก ์ฒ๋ฆฌ ๋์ด์ง๊ณ , ์์ ์ด ์ผ์ ํ์ง ์์ ๋น๋ฒํ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฌ๋ผ๊ฐ๊ฒ ๋๋ค.
์งง๊ฒ ๋ค๋ฃจ๋ ค๊ณ ํ์ง๋ง, ์ด ๋ถ๋ถ์ ๊ฐ๋จํ๊ฒ ๋๋์ง ์์ ๋ด์ฉ์ด ๊ธธ์ด์ก๋ค.
์์ธํ ๋ด์ฉ์ ๋ณ๋๋ก ๋ค๋ค๋ณด๊ธฐ๋ก ํ๊ณ , ์ด์ ๋ฐ๋ณต๋ฌธ์์ ๋ฆฌ์คํธ(List)๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ์ข์์ง์ ๋ํด์ ๊ณ์ํด์ ์์๋ณด์.
Case๋ฅผ ์ดํด๋ณธ ๋ด์ฉ ์ค ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ๋ณ๊ฒฝ ๋์์ ๋์ ๋ฌธ์ ๊ฐ ์์๋ค.
์ด๋ป๊ฒ ๋ค๋ฃจ๋ฉด ์ข์๊น ?
๋ฐฉ๋ฒ์ ์ฌ์ค ๊ฐ๋จํ๋ค.
๋ฐ๋ณต๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ 0์ผ๋ก ์์ํด ์ฆ๊ฐ์ํค์ง ์๊ณ ๋ฆฌ์คํธ์ ๊ธธ์ด๋ก ์์ํด ๊ฐ์์์ผ ๋๊ฐ๋ฉด์ ์ญ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํด ๊ฐ๋ฉด ์ ์ฒด ์์์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
๋ฆฌ์คํธ์์ 0~9๊น์ง ์ซ์ 10๊ฐ๋ฅผ ์์ฑํด์ฃผ์.
๋ฐ๋ณต๋ฌธ์ ์์์ด i=0์ด ์๋ i = length - 1 ๋ก ํด์ฃผ๋ฉด ๋๋ค.
-1์ ์ ํด์ค์ผ ํ ๊น ? ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค๋ 1์ด ์๋ 0๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ -1์ ํด์ฃผ๋ฉด ๋๋ค.
์ด์ ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 10-1์ธ 9๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ ์ข ๋ฃ ๋๋ ์์ ๋ 0๊น์ง ์คํ๋ ์ ์๋๋ก -1๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ง ์คํ๋๋๋ก ํด์ฃผ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก i++๊ฐ ์๋๋ผ ๊ฐ์๋ฅผ ํด์ผํ๊ธฐ ๋๋ฌธ์ i--๋ก ๊ฐ์๋ฅผ ์์ผ์ฃผ์.
void main() {
List<int> numbers = List.generate(10, (i) => i);
for (int i = numbers.length - 1; -1 < i; i--) {
print(i);
}
}
์ด์ ๋์ผํ ์กฐ๊ฑด์ ์ญ์์ผ๋ก ์ธ๋ฑ์ค์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑํ ๋ฐ๋ณต๋ฌธ ์์ ๋ฃ์ด์ ์คํํด๋ณด์.
์ ์์ ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ์ด ๋์๋ค.
void main() {
List<int> numbers = List.generate(10, (i) => i);
for (int i = numbers.length - 1; -1 < i; i--) {
if (numbers[i] % 2 == 0) {
numbers.removeAt(i);
} else {
numbers[i] = numbers[i] * 2;
}
}
print(numbers);
// [2, 6, 10, 14, 18]
}
๋ฆฌ์คํธ(List)๋ฅผ ์ฌ์ฉํด ๋ฐ๋ณต๋ฌธ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํด์ผ ํ ๋์๋ ๋ฐ๋์ ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ๋ณ๊ฒฝ์ด ๋๋ค๋ ๊ฒ์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
์ด๋ฒ์๋ ๋ฆฌ์คํธ(List)์ ๊ธธ์ด๊ฐ ๊ฐ์ ํ๋๊ฒ ์๋ ์ฆ๊ฐ ํ ๊ฒฝ์ฐ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ์ดํด๋ณด๋๋ก ํ์.
๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ์ฆ๊ฐํ๊ฒ ๋๋ฉด, ๋ฐ๋ณต๋ฌธ์ ์คํ ํ์๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ตฌ์ฑํ๋ฉด ์๋๋ ๋ก์ง ์ค ํ๋์ด๋ค.
๋ฐ๋ณต๋ฌธ์ ์คํ์ ๋ฐ๋ณต ํ์๊ฐ ์ ํด์ ธ ์์ด์ผ ํ๋๋ฐ, ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ๋์ด๋จ์ ๋ฐ๋ผ ๋ฐ๋ณต ํ์๊ฐ ๊ณ์ ์ฆ๊ฐํ๊ฒ ๋ ์๋ ์๊ณ ์ต์ ์ ๊ฒฝ์ฐ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์๋ ์์ด์ ์ด ์ ์ ๋ฐ๋์ ์ฃผ์ํ์ ์ผ ํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ ๊ณ ์ ๊ธธ์ด ์กฐ๊ฑด์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
void main() {
List<int> numbers = List.generate(10, (i) => i);
for (int i = 0; i < 10; i++) {
if (numbers[i] % 2 == 0) {
numbers.add(numbers[i] * 10);
}
}
print(numbers);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 20, 40, 60, 80]
}
์ฌ์ค ๋ฆฌ์คํธ(List)๋ฅผ ์ฌ์ฉํด ๋ฐ๋ณต๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ๋ฐ๋ณต๋ฌธ ํน์ฑ์ ๋ฐ๋ณต ํ์๊ฐ ๋ฆฌ์คํธ์ ๊ธธ์ด์ ์์กด๋๊ธฐ ๋๋ฌธ์, ๋ฐ๋ณต๋ฌธ ๋ด์์ ๋ฆฌ์คํธ์ ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋ก์ง ์์ฒด๋ฅผ ๋ง๋ค์ง ์์์ผ ํ๋ค.
๋ฆฌ์คํธ(List)๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋์๋ ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค.
๋ฐ๋ก ์์์ ์ดํด๋ณธ immutable ์ฑ์ง๋ก ์์ฑ๋ ๋ฆฌ์คํธ(List)๋ฅผ ์ฌ์ฉํ ๋์ด๋ค.
Flutter์์ Code Generator๋ฅผ ์ฌ์ฉํ ํน์ ํจํค์ง์์ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๋ฆฌ์คํธ(List)์ ์ฑ์ง์ด immutable(๋ถ๋ณ)๋ก ์์ฑ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์ ๋ณต์ฌ๋ฅผ ํตํด ๋ฐ์ดํฐ ๊ฐ์ ๋ณ๊ฒฝ์ํค๊ฒ ๋๋ค.
๋ฆฌ์คํธ(List)๋ฅผ immutable(๋ถ๋ณ) ์ฑ์ง์ ํ์ ์ผ๋ก ์์ฑํด ๋ณด๋๋ก ํ์.
์ด์ numbers ๋ฆฌ์คํธ๋ ๋ณํ ์ ์๋ ์ฑ์ง์ด ๋์๋ค.
void main() {
List<int> numbers = UnmodifiableListView(<int>[0, 1, 2, 3, 4, 5]);
}
์ง์ง ๋ณํ ์ ์๋์ง ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด ๋ณด๋๋ก ํ์.
void main() {
List<int> numbers = UnmodifiableListView(<int>[0, 1, 2, 3, 4, 5]);
numbers[2] = 20;
print(numbers);
}
์์ ์ฝ๋๋ฅผ ์คํ ํด๋ณด๋ฉด ์๋ ์๋ฌ๊ฐ ์ถ๋ ฅ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
"Unhandled exception:
Unsupported operation: Cannot modify an unmodifiable list"
๊ทธ๋ ๋ค๋ฉด immutable(๋ถ๋ณ) ์ฑ์ง์ ๋ฆฌ์คํธ๋ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ ํด์ผ ํ ๊น ?
List.from์ ์ฌ์ฉํด numbers์ ์๋ก์ด ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ๋๋ก ํด์ฃผ๋ฉด ๋๋ค.
void main() {
List<int> numbers = UnmodifiableListView(<int>[0, 1, 2, 3, 4, 5]);
numbers = List.from(numbers)
..removeAt(2)
..insert(2, 20);
print(numbers);
// [0, 1, 20, 3, 4, 5]
}
HashCode๋ฅผ ์ถ๋ ฅํด ๋ณด๋ฉด ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋ ๊ฒ์ ์ ์์๋ค. ์ฆ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น ๋ฐ์ numbers์ ์ฃผ์ ๋ณต์ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ฒ์ ํ ๋น๋ 431824049 ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ GC์ ๋์์ด ๋๊ณ ์์คํ ์ ์ํด ์๋์ ์ผ๋ก ๊ฐ์ฉ ๋์์ผ๋ก ๋ณ๊ฒฝ์ด ๋๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ก์ด 652108807 ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋กญ๊ฒ ์์ฑํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ผ์ ์๊ฐ ๋์์ 2๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๊ฒ ๋๋ ์ํฉ์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
void main() {
List<int> numbers = UnmodifiableListView(<int>[0, 1, 2, 3, 4, 5]);
print(numbers.hashCode);
// 431824049
numbers = List.from(numbers)
..removeAt(2)
..insert(2, 20);
print(numbers.hashCode);
// 652108807
}
์ด์ฉ ์ ์์ด immutable(๋ถ๋ณ) ์ฑ์ง์ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ค์ผ ํ๋ ๊ฒฝ์ฐ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ๊ตณ์ด ๋ถํธํ๊ฒ immutable(๋ถ๋ณ) ์ฑ์ง์ ์ฌ์ฉํ ๊น ? ์ด ๋ถ๋ถ์ ๋ํด์๋ ๋ค๋ฅธ ๊ธ์์ ์์ธํ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
๋ณธ์ธ์ด ๊ฐ๋ฐ ํ๋ฉด์ ์์ฑํ ๋ฆฌ์คํธ ํ์ ์ด immutable์ธ์ง, mutable์ธ์ง๋ฅผ ํ์ธํด ๋ณด๋ฉด์ ๋ค๋ค๋ณด๋ฉด ์ข์ ํ๋ก๊ทธ๋๋ฐ์ ๋ง๋ค ์ ์์ ๊ฒ์ด๋ค.
๊ธ์ ์ฃผ๋ ๋ด์ฉ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ๋ฐ๋ณต๋ฌธ ์คํ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ธ์ ์์ฑํด ๋ณด๋ ค๊ณ ํ์ง๋ง, ์ฐ๊ฒฐ๋ ๋ด์ฉ์ด ๋ค์ ์๊ธฐ๋ ํ๊ณ ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ ํ ๋์๋ ๋์ค์ง ์์ ์ผ์ด์ค์ธ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง๋ค๋ณด๋, immutable, mutable ๋ฑ์ ์ฑ์ง์ ๋ํด์ ๋ค๋ฃฌ ๋ด์ฉ์ด ๋ ๋ง์์ง ๊ฒ ๊ฐ๋ค.
๋ค์ ๋ฒ์๋ immutable, mutable์ ๊ด๋ จ๋ ๋ด์ฉ์ ์ถ๊ฐ๋ก ์์ธํ ๋ค๋ค ๋ณผ ์์ ์ด๋ค. ์ฌ์ค ์ด ๊ธ์์ ๋ค๋ฃฌ ๋ด์ฉ์ 10%๋ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ๋ก ๋ฆฌ์คํธ(List)์ ๋ํด์๋ ์์ธํ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
๊ถ๊ธํ์ ๋ถ๋ถ ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์ !