
1. 컬렉션
List<int> nums = [1,2,3,4];
var nums2 = [1,2,3,4];
final List<int> nums3 = [1,2,3,4]; //한번 만들면 변경 불가능 -> 불변 유지/객체 복사만 가능
final nums4 = [1,2,3,4]; // final은 내부에 var을 포함하고 있기에 타입 생략 가능
2. 불변을 쓰는 이유 : 변경 감지

- 값을 추가하고 싶을때 restAPI로 통신 요청
- 4개를 json으로 받아서 그림
- 다시 통신 요청해서 값이 그대로면 그릴게 없음
다시 요청해서 값이 변경되어있으면 (추가) 기존의 4개를 다지우고 다시 그려야함 / 비효율적
- json으로 그림을 그리기전에 상태를 보관하고 있음 → 비교 가능함
컬렉션을 만들어서 컬렉션에 최초의 통신 결과를 들고 있음
그 결과를 기반으로 뿌림
- 1도 문자열이니 클래스 타입이 보관되는 리스트 타입임
- 다시 5개를 찾으면 json으로 받아서 리스트에 5가 추가가되고 변했다는 것을 알 수 있을까?
기존 값을 건드려서 이전값을 알 수 없기에 알 수 없음
그 값을 for문 돌려서 뿌림
- final로 불변을 유지해서 기존의 데이터를 두고 추가로 불변을 유지하는 리스트를 생성
깊은 복사해서 하나 더 만들어서 이전 리스트와 현재 리스트를 비교
다른 부분만 다시 그릴 수 있음
⇒ 이전 값을 알아야 비교가 가능함 → 변경 감지
비교 로직
- 직접 하려면 이중for문이 돌아서 각 번호 별로 같은 값이 있는지 찾아야 함
비교하는 로직이 복잡함
- 같은 번지끼리 비교해서 같은지 확인하기
언제 다음으로 넘어갈지 알 수 없음
- 길이만 비교해도 변경이 감지 됨
길이로 변경을 감지해보고 값 검증 하기
길이가 같아도 변경될 수 있기에 값 검증도 필요함
플러터가 해줌 : 상태 관리 엔진 / 리액트로 마찬가지
- 데이터만 보고 그림을 그림
- 수정
List<int> nums = [1, 2, 3, 4];
var nums2 = [1, 2, 3, 4];
final List<int> nums3 = [1, 2, 3, 4]; //한번 만들면 변경 불가능 -> 불변 유지/객체 복사만 가능
final nums4 = [1, 2, 3, 4]; // final은 내부에 var을 포함하고 있기에 타입 생략 가능
void main() {
// for 문 : No Expression(기본 for문은 리턴이 안됨)
// 순회
nums.forEach((n) => print(n));
// for 문 : Expression
var k1 = nums.map((e) => e + 1);
print(k1);
}

List<int> nums = [1, 2, 3, 4];
var nums2 = [1, 2, 3, 4];
final List<int> nums3 = [1, 2, 3, 4]; //한번 만들면 변경 불가능 -> 불변 유지/객체 복사만 가능
final nums4 = [1, 2, 3, 4]; // final은 내부에 var을 포함하고 있기에 타입 생략 가능
void main() {
// for 문 : No Expression(기본 for문은 리턴이 안됨)
// 순회
nums.forEach((n) => print(n));
// for 문 : Expression
var k1 = nums.map((e) => e);
print(k1);
var k2 = [...nums];
print(k2);
}

List<int> nums = [1, 2, 3, 4];
var nums2 = [1, 2, 3, 4];
final List<int> nums3 = [1, 2, 3, 4]; //한번 만들면 변경 불가능 -> 불변 유지/객체 복사만 가능
final nums4 = [1, 2, 3, 4]; // final은 내부에 var을 포함하고 있기에 타입 생략 가능
void main() {
// for 문 : No Expression(기본 for문은 리턴이 안됨)
// 순회
nums.forEach((n) => print(n));
// for 문 : Expression
var k1 = nums.map((e) => e * 2).toList();
print(k1);
var k2 = [...nums];
print(k2);
}

- 삭제
List<int> nums = [1, 2, 3, 4];
var nums2 = [1, 2, 3, 4];
final List<int> nums3 = [1, 2, 3, 4]; //한번 만들면 변경 불가능 -> 불변 유지/객체 복사만 가능
final nums4 = [1, 2, 3, 4]; // final은 내부에 var을 포함하고 있기에 타입 생략 가능
void main() {
// for 문 : No Expression(기본 for문은 리턴이 안됨)
// 순회
nums.forEach((n) => print(n));
// for 문 : Expression
var k1 = nums.map((e) => e * 2).toList();
print(k1);
var k2 = [...nums];
print(k2);
// 삭제
var k3 = nums.where((e) => e != 3).toList();
print(k3);
}


List<int> nums = [1, 2, 3, 4];
var nums2 = [1, 2, 3, 4];
final List<int> nums3 = [1, 2, 3, 4]; //한번 만들면 변경 불가능 -> 불변 유지/객체 복사만 가능
final nums4 = [1, 2, 3, 4]; // final은 내부에 var을 포함하고 있기에 타입 생략 가능
void main() {
// for 문 : No Expression(기본 for문은 리턴이 안됨)
// 순회
nums.forEach((n) => print(n));
// for 문 : (Expression) 수정 : map으로 가공
var k1 = nums.map((e) => {if (e == 3) e * 3}).toList();
print(k1);
var k2 = [...nums];
print(k2);
// 삭제
var k3 = nums.where((e) => e != 3).toList();
print(k3);
// 찾기
var k4 = nums.where((e) => e > 2).toList();
print(k4);
var k5 = nums.where((e) => e == 2).toList();
print(k5);
}

- 찾기

- 추가
List<int> nums = [1, 2, 3, 4];
var nums2 = [1, 2, 3, 4];
final List<int> nums3 = [1, 2, 3, 4]; //한번 만들면 변경 불가능 -> 불변 유지/객체 복사만 가능
final nums4 = [1, 2, 3, 4]; // final은 내부에 var을 포함하고 있기에 타입 생략 가능
void main() {
// for 문 : No Expression(기본 for문은 리턴이 안됨)
// 순회
nums.forEach((n) => print(n));
// for 문 : (Expression) 수정 : map으로 가공
var k1 = nums.map((e) => {if (e == 3) e * 3}).toList();
print(k1);
var k2 = [...nums];
print(k2);
// 삭제
var k3 = nums.where((e) => e != 3).toList();
print(k3);
// 찾기
var k4 = nums.where((e) => e > 2).toList();
print(k4);
var k5 = nums.where((e) => e == 2).toList();
print(k5);
// 추가
var k6 = [...nums, 5];
print(k6);
var k7 = [0, ...nums];
print(k7);
}

- 파싱할 필요가 없음


Share article