Flutter/Flutter UI 프레임워크
dart - 2
CNOW
2024. 12. 17. 16:20
객체 동등성 비교
void main() {
// 객체 비교와 객체 동등성 재정의
// Dart 에서는 기본적으로 객체를 비교할 때 주소값으로 비교 처리
// 플러터에서 동일한 위젯을 재사용할 수 있다면 이미 만들어진 객체를
// 재사용하여 메모리 낭비를 줄일 수 있다.
// const Container(), const Container(),
var a = Object();
var b = Object();
// identical(a, b) 함수는 객체가 동일한 메모리를 참조하는 판별하는 기능 입니다.
bool result = identical(a, b);
print(result);
// Book , BooK --> 타이틀, 작가 이름이 같다면 동일한 객체로 즉, 논리적 객체로
// 같은 객체다 .. 라고 구현을 해야 된다면
// 객체 동등성 재정의를 해주어야 한다.
print("---------------------------------");
print(Book('다트') == Book('다트')); // <--- 논리적으로 같은 객체라고 판별하고 싶다면 동등성 재정의가 필요
}
class Book {
String title;
Book(this.title);
// hashCode, operator 를 재정의 해야 한다.
@override
bool operator ==(Object other) {
// 새로운 함수 확인 : identical() 함수는 두 객체를 메모리상에 동일한 주소인지 비교
return identical(this, other)
|| other is Book
&& this.runtimeType == other.runtimeType
&& this.title == other.title;
}
// 인스턴스 객체를 고유한 정수값으로 변경 처리
@override
int get hashCode => title.hashCode;
}
Eaqutable 패키지 사용 방법
import 'package:equatable/equatable.dart';
void main() {
print(const Post('홍길동전1') == const Post('홍길동전1'));
print(const Post('홍길동전1'));
print('--------------------------');
print(identical(const Post('홍길동전1'), const Post('홍길동전1')));
}
// 1. 가변 객체로 만들었다.
// 2. 가변 객체를 불변 객체 허용으로 만들고 싶다면??
class Post extends Equatable {
final String title;
const Post(this.title);
@override // [] 객체 배열을 반환해라 => 너가 사용하고 싶은 객체에 멤버 변수를 선정해서
List<Object?> get props => [title];
// 비교시 사용하고 싶은 속성을 배열로 반환한다.
}