copyWith๋ก Nullable ๋ณ์ ์ฌ์ฉํด ๋ณด๊ธฐ
์ด๋ฒ์๋ Flutter์์ class ์ฌ์ฉ์ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ธ copyWith ์ฌ์ฉ์ NULL ๊ฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
์ด์ ์ ์ด๋ฏธ copyWith๋ก Nullable ๋ณ์ ์ฌ์ฉํด ๋ณด๊ธฐ ํฌ์คํธ๋ฅผ ์์ฑํ ์ ์ด ์์๋๋ฐ, ์ ๋ฐ์ดํธ ๋ด์ฉ์ด ์์ด ์ถ๊ฐ๋ก ์์ฑํ๊ฒ ๋์๋ค.
copyWith๋ Flutter์์ ์ฌ์ฉํ๋ ๋ํ์ ์ธ class copy ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฏธ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค.
copyWith๋ ๋ชจ๋ธ ํด๋์ค๋ฅผ ๋ง๋๋ ํจํค์ง์ ํฌํจ๋๋ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ฉฐ, ํํ๊ฒ ์ฌ์ฉํ๋ TextStyle์ด copyWith๋ฅผ ์ฌ์ฉํด ์คํ์ผ ๋ณ๊ฒฝ์ ํ๋๋ก ๊ฐ๋ฐ๋์ด ์๋ค.
์ด๋ฌํ ๋ชจ๋ธ ํด๋์ค๋ฅผ ๋ง๋ค ๋์๋ copyWith ์ธ์๋ json ๋ณํ ๋ฑ์ ๊ธฐ๋ฅ๋ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก, ์ด๋ฅผ Code Generator๋ก ํธํ๊ฒ ์์ฑํด ์ฃผ๋ ํจํค์ง์ธ freezed๊ฐ ์์ผ๋ ํ ๋ฒ์ฏค ์ฌ์ฉํด ๋ณด๋ ๊ฒ๋ ์ข๋ค.
์ฌ๊ธฐ์๋ freezed ๋ฑ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์ง์ class๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ copyWith์ ๋ํด์ ๋ค๋ฃจ๋ ๋ด์ฉ์ด ๋ ๊ฒ์ด๋ค.
๋จผ์ , copyWith์ NULL ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ copyWith๋ฅผ ์ด๋ป๊ฒ ๋ง๋๋์ง์ ๋ํด์ ์์๋ณด๋๋ก ํ์.
๋๋ถ๋ถ์ด copyWith ๋ง๋๋ ๋ฐฉ๋ฒ๊ณผ ์๋ ๋ฐฉ์์ ๋ํด ์ดํดํ๊ณ ์์ ๊ฒ์ด๋ผ ์๊ฐํ์ง๋ง, ํน์๋ผ๋ ๋ชจ๋ฅด์๋ ๋ถ๋ค์ด ์์ ์ ์์ผ๋ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ค๋ค๋ณด์.
์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ์ด ์๋ User ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ฃผ๋๋ก ํ๋๋ฐ, ์ฌ๊ธฐ์ ์ด๋ฆ์ nullable ํ์ ์ผ๋ก ๋ง๋ค์ด ์ฃผ๋๋ก ํ์.
class User {
final String email;
final String? name;
const User({
required this.email,
required this.name,
});
}
ํด๋น User ํด๋์ค์ copyWith๋ฅผ ์ถ๊ฐํด์ฃผ์.
copyWith๋ ์์ฑ๋ User ํด๋์ค์์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ nullable ํ์ ์ ์ฌ์ฉํด null์ธ ๊ฒฝ์ฐ ๊ธฐ์กด User ํด๋์ค์ ๊ฐ์ ๋ฆฌํดํ๋๋ก ํ๋ ์๋ฆฌ๋ฅผ ํตํด์ copy ๊ธฐ๋ฅ์ ๋ง๋๋ ๊ฒ์ด๋ค.
User copyWith({
final String? email,
final String? name,
}){
return User(
email: email ?? this.email,
name: name ?? this.name,
);
}
์ด์ copyWith๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ๊ฒ ์ํ๋ ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝํด ์ค ์ ์๊ฒ ๋๋ค.
User _tyger = User(email: "tyger@tyger.com", name: "tyger");
_tyger = _tyger.copyWith(email: "tyger1@tyger.com");
print(_tyger.email);
// tyger1@tyger.com
copyWith๋ ํด๋น ํด๋์ค ์์ ๋ฃ์ด์ ์ ์ธํด ์ฃผ๋ฉด ๋๋ค.
class User {
final String email;
final String? name;
const User({
required this.email,
required this.name,
});
User copyWith({
final String? email,
final String? name,
}) {
return User(
email: email ?? this.email,
name: name ?? this.name,
);
}
}
์ copyWith๋ Nullable ํ์ ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ผ๊น?
์ ํํ๋ Nullable ๋ณ์๋ฅผ ์ฌ์ฉ์ ๋ชปํ๋ ๊ฒ์ด ์๋, null ๊ฐ์ผ๋ก๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐํ๋ค๊ณ ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์์์ copyWith ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๋ฉด ๋ชจ๋ ๋ณ์๋ฅผ nullable ํ์ ์ผ๋ก ์์ฑํ์ฌ ๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธฐ์กด ๊ฐ์ ๋ฆฌํดํ๋ ๊ตฌ์กฐ๋ก ๋์ด ์๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ ๊ธฐ ๋๋ฌธ์ null ๊ฐ์ ๋ฃ์ด๋ null๋ก ๋ณ๊ฒฝ๋์ง ์๊ณ ๊ธฐ์กด ๊ฐ์ ๋ฆฌํดํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ nullable ํ์ ์ ๊ฐ์ด ์ง์ ๋๋ฉด ๋ค์ null๋ก ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ด๋ค.
User tyger = User(email: "tyger@tyger.com", name: "tyger");
tyger = tyger.copyWith(name: null);
print(tyger.name);
// tyger
์ด ๋ถ๋ถ์ name์ด null์ด๋ฉด, this.name์ ๋ฆฌํดํ๊ฒ ๋๋ฉด์ null ๊ฐ์ผ๋ก ๋ค์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ด๋ค.
name: name ?? this.name,
copyWith ๋ง๋๋ ๋ฐฉ๋ฒ๊ณผ ์๋ฆฌ์ ๋ํด์๋ ๊ฐ๋ณ๊ฒ ์์ ๋ดค๊ณ , ์ null ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋์ง ์๋์ง์ ๋ํด์๋ ์์ ๋ดค๋ค.
์ด์ ๋ถํฐ๋ null ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
1,2 ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ด์ ํฌ์คํธ์์ ๋ค๋ค๋ณธ ๋ด์ฉ์ด๊ณ ๋ง์ง๋ง์ผ๋ก ์๊ฐํ๋ 3๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์๋ก ์ ๋ฐ์ดํธํ ๋ฐฉ๋ฒ์ด๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ Function์ ์ฌ์ฉํด null ๊ฐ์ ์ฃผ๋ ๋ฐฉ๋ฒ์ธ๋ฐ, ์ฌ์ค ์ ๊ฐ ๊ฐ์ฅ ์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ๋ค.
copyWith์์ nullable ๋ณ์์ function ๊ฐ์ ํ์ฉํ์ฌ null์ธ ๊ฒฝ์ฐ function์ ์ ๋ฌ ๋ฐ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Product ๊ฐ์ฒด์ sale ๋ณ์๋ฅผ nullable ํ์ ์ผ๋ก ๋ง๋ค์ด ์ฃผ๋๋ก ํ์.
class Product {
final String name;
final int price;
final double? sale;
const Product({
required this.name,
required this.price,
required this.sale,
});
}
copyWith์ nullable ํ์ ์ ํด๋นํ๋ sale ๋ณ์์ ๊ฐ์ Function ํจ์ ํํ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํด์ฃผ์.
Fuction()์ ์ ๋ฌ ๋ฐ๋๋ฐ, ๋ฆฌํด ๊ฐ์ผ๋ก double? ๊ฐ์ ๋ฆฌํดํ๋๋ก ํ๊ณ ์๋ค.
sale ๋ถ๋ถ์ sale ๊ฐ์ด null์ด ์๋ ๊ฒฝ์ฐ function()์ธ sale()์ ๋ฃ์ด์ฃผ๊ณ , null์ด๋ฉด ๊ธฐ์กด ๊ฐ์ ์ฌ์ฉํด ์์ฑํ ์ ์๋๋ก this.sale์ ๋ฃ์ด์ค ์ ์๊ฒ ํด์ฃผ์๋ค.
Product copyWith({
final String? name,
final int? price,
final double? Function()? sale,
}) {
return Product(
name: name ?? this.name,
price: price ?? this.price,
sale: sale != null ? sale() : this.sale,
);
}
์ด๋ ๊ฒ ์์ฑํ์ฌ copyWith์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋์๋ function ํจ์ ํํ๋ก ์ ๋ฌํ๋ฉด ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ํฐ ๋จ์ ์ ๋ณ์ ํ์ ์ ์ ๋ฌํ ์ ์๊ณ , ํญ์ function ํจ์๋ฅผ ์ ๋ฌํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
๊ฐ๋จํ๊ฒ copyWith์์ NULL ๊ฐ์ ์ ๋ฌํ ์๋ ์์ง๋ง, ๋ณ์ ํ์ ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ๋ชปํ๋ค๋ ์ ์์ ์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
void main() {
Product _product = Product(
name: "product",
price: 1000,
sale: 0.2,
);
print(_product.sale);
// 0.2
_product = _product.copyWith(sale: () => 0.5);
print(_product.sale);
// 0.5
_product = _product.copyWith(sale: () => null);
print(_product.sale);
// null
}
์ด๋ฒ์๋ null ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํ ์ถ๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋์ผํ๊ฒ Product ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ์.
copyWith ์์ฑ์ nullable ํ์ ๋ณ์์๋ boolean ํ์ ์ ์๋ก์ด ๋ณ์ ํ์ ์ ์ถ๊ฐํด ์ฃผ์๋ค.
boolean ํ์ ์ nullSale ๋ณ์๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก false๋ก ์ฃผ์ด ์ถ๊ฐํ๋ฉด ๋๋ค.
sale ๋ณ์์ nullSale์ด true์ธ ๊ฒฝ์ฐ์ null ๊ฐ์ ์ฃผ๊ณ , ์๋ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๋ณ์๋ค๊ณผ ๋์ผํ๊ฒ sale ?? this.sale ๊ฐ์ ์ฃผ๋๋ก ํด์ฃผ๋ฉด ๋๋ค.
Product copyWith({
final String? name,
final int? price,
final double? sale,
final bool nullSale = false,
}) {
return Product(
name: name ?? this.name,
price: price ?? this.price,
sale: nullSale ? null : (sale ?? this.sale),
);
}
sale ๋ณ์์ null ๊ฐ์ ์ฃผ๊ณ ์ถ์ผ๋ฉด, ์ถ๊ฐํ nullSale ๋ณ์๋ฅผ ์ฌ์ฉํด ํด๋น ๋ณ์๋ฅผ true๋ก ์ฃผ๋ฉด ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ๋จ์ ์ ๋ณ์๊ฐ ๋์ด๋๋ค๋ ์ ์ ์๋ค. ๋ง์ผ nullable ํ์ ์ ๋ณ์๊ฐ ๋ง๋ค๋ฉด boolean ํ์ ์ ๋ณ์๋ฅผ ๋๊ฐ์ด ์์ฑํด ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ณ์๊ฐ ๋ง์์ง๊ฒ ๋๋ค.
void main() {
Product _product = Product(
name: "product",
price: 1000,
sale: 0.2,
);
print(_product.sale);
// 0.2
_product = _product.copyWith(nullSale: true);
print(_product.sale);
// null
_product = _product.copyWith(sale: 0.4);
print(_product.sale);
// 0.4
}
๋ํ ๋ฐ์ดํฐ๊ฐ null์ผ ์๋ null์ด ์๋ ์๋ ์๋ ๊ฒฝ์ฐ์๋ boolean ํ์ ์๋ ์ค๋ณต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด ์ฃผ์ด์ผ ํ๋ค๋ ์ ์ด ๋จ์ ์ด๋ค.
double? getSale(double? data) => data;
์ด๋ ๊ฒ null์ผ์ง ์๋์ง ๋ชจ๋ฅด๋ ์ผ์ด์ค์ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋์, ํญ์ ๊ธฐ์กด sale ๋ณ์์ null ๊ฐ์ ์ ๋ฌํ๊ธฐ ์ํ nullSale boolean ๋ณ์๋ฅผ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๊ฒ ๋๋ค.
void main() {
Product _product = Product(
name: "product",
price: 1000,
sale: 0.2,
);
print(_product.sale);
// 0.2
double? _newSale = getSale(null);
_product = _product.copyWith(sale: _newSale, nullSale: _newSale == null);
print(_product.sale);
// null
}
์ด๋ฒ์ ์ถ๊ฐ๋๋ ์๋ก์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์์์ ์ดํด๋ณธ ๋ฐฉ๋ฒ ์ฒ๋ผ function() ํ์ ์ ์ฌ์ฉํ์ง ์์๋ ๋๊ณ , boolean ๋ณ์๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
๊ธฐ์กด ๊ฐ์ฒด ๊ทธ๋๋ก๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ์์ฑํด์ผ ํ๋ ์ฝ๋๊ฐ ๋ง๋ค๋ ์ ์ด ๋จ์ ์ผ ์๋ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๋ณต์กํ ์๋ ์๊ณ , ์ถ์ ํด๋์ค์ ๋ํ ๊ฐ๋ ์ด ์์ด์ผ ํด์ ์ดํด๊ฐ ์ด๋ ค์ธ ์๋ ์์ผ๋ ์ฒ์ฒํ ํ๋์ฉ ํด๋ณด๋ฉด์ ์ดํดํ์๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
์ถ์ ํด๋์ค์ ํด๋์ค๋ฅผ ํจ์์ฒ๋ผ ํธ์ถ๋๋๋ก ํ๋ method๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ, ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค๋ ์ ์์ ๋ฉ๋ฆฌํธ๊ฐ ๊ฐ์ฅ ์๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ณธ๋ค.
๋จผ์ ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ์์ฑํด ๋ณด๋๋ก ํ์.
class Product {
final String name;
final int price;
final double? sale;
const Product({
required this.name,
required this.price,
required this.sale,
});
}
์ด๋ฒ์ copyWith ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ , ProductCopyWith๋ผ๋ ์ถ์ ํด๋์ค๋ฅผ ๋จผ์ ์์ฑํด์ฃผ๋๋ก ํ๊ฒ ๋ค.
์ถ์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํจ์์ฒ๋ผ ํธ์ถ๋ ์ ์๋๋ก ํด์ฃผ๋ call() ํจ์๋ฅผ ์ถ๊ฐํด ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋๋ก ํ์๋ค.
abstract class ProductCopyWith {
Product call({
String name,
int price,
double? sale,
});
}
์์ฑํ ์ถ์ ํด๋์ค๋ฅผ implements๋ฅผ ์ฌ์ฉํด ์์๋ฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฃผ๋๋ก ํ์.
ProductCopyWith ์ถ์ ํด๋์ค๋ฅผ ์์ ๋ฐ๋ ๊ฐ์ฒด๋ _ProductCopyWith ๋ผ๋ ๊ฐ์ฒด๋ก ์์ฑํด ์ฃผ๋๋ก ํ๊ฒ ๋ค.
์ฌ๊ธฐ์ ์ถ์ ํด๋์ค๋ ์์ ๋ฐ์ ํด๋์ค์ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ํด๋ ๋๋ค. ๊ผญ ์ ํค์๋๋ฅผ ์ฌ์ฉํ๋ผ๋ ๋ฒ์ ์์ผ๋, ํธํ ๋ฐฉ๋ฒ์ผ๋ก ํด๋์ค ๋ช ์ ๋ง๋ค๋ฉด ๋๋ค.
class _ProductCopyWith implements ProductCopyWith {
// ...
}
์์ ๋ฐ์ _ProductCopyWith ํด๋์ค์๋ Product ๊ฐ์ฒด์ Object ํ์ ์ ๊ฐ์ฒด 2๊ฐ๋ฅผ ์ถ๊ฐํ๋๋ก ํ๊ฒ ๋ค.
class _ProductCopyWith implements ProductCopyWith {
final Product value;
static const Object _undefined = Object();
const _ProductCopyWith(this.value);
}
_ProductCopyWith ๊ฐ์ฒด์ ์์๋ฐ์ call() ๊ธฐ๋ฅ์ ์ฌ์ ์ํด ์ฃผ๋๋ก ํ์.
abstract class์์ call() ํจ์๋ฅผ ์์ฑํ ๋์ name, price, sale์ ๋ฐ์์ฌ ์ ์๊ฒ๋ ์์ฑํ์๋ค.
์ฌ๊ธฐ์๋ ํ์ ์ Object nullable ํ์ ์ผ๋ก ํด์ฃผ๊ณ , ๊ธฐ๋ณธ ๊ฐ์ผ๋ก _undefined๋ฅผ ์ ์ํด ์ฃผ๋ฉด ๋๋ค.
์ ๋ ฅ๋ฐ์ ๋ณ์๊ฐ _undefined์ ๊ฐ๋ค๋ฉด _ProductCopyWith ์์ ๋ฐ์์จ Product์ ๊ฐ์ ๋ฆฌํดํ๋ฉด ๋๊ณ , ์๋ ๊ฒฝ์ฐ์๋ copy() ํจ์๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค. ์ด ๋ Object๋ฅผ ํ์ ์บ์คํธํ์ฌ ๋ฆฌํดํด์ผ ํ๋ค.
call({
Object? name = _undefined,
Object? price = _undefined,
Object? sale = _undefined,
}) {
return Product(
name: name == _undefined ? value.name : name as String,
price: price == _undefined ? value.price : price as int,
sale: sale == _undefined ? value.sale : sale as double?,
);
}
Product
์ง๊ธ๊น์ง ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ nullable ํ์ ์ ๋ณ์์ null ๊ฐ์ ์ฃผ๋ฉด ๋๋ค.
void main() {
Product _product = Product(name: "product", price: 1000, sale: 0.2);
print(_product.sale);
// 0.2
_product = _product.copyWith(sale: null);
print(_product.sale);
// null
_product = _product.copyWith(sale: 0.1);
print(_product.sale);
// 0.1
}
์ด๋ฒ์ ์ดํด๋ณธ ๋ฐฉ๋ฒ์ ์ฝ๋๊ฐ ๋ณต์กํ๊ณ ํด๋์ค๋ฅผ ์ถ๊ฐ ์์ฑํด์ผ ํ๋ ๋ถ๋ถ์์ ๋จ์ ์ผ ์ ์๊ฒ ์ง๋ง, ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ์ฌํํ๊ฒ ์ฌ์ฉํ๋ค๋ ์ ์์ ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Source Code
์ ์ฒด ์ฝ๋์ด๋ค.
class Product {
final String name;
final int price;
final double? sale;
const Product({
required this.name,
required this.price,
required this.sale,
});
ProductCopyWith get copyWith => _ProductCopyWith(this);
}
abstract class ProductCopyWith {
Product call({
String name,
int price,
double? sale,
});
}
class _ProductCopyWith implements ProductCopyWith {
final Product value;
static const Object _undefined = Object();
const _ProductCopyWith(this.value);
Product call({
Object? name = _undefined,
Object? price = _undefined,
Object? sale = _undefined,
}) {
return Product(
name: name == _undefined ? value.name : name as String,
price: price == _undefined ? value.price : price as int,
sale: sale == _undefined ? value.sale : sale as double?,
);
}
}
์ง๊ธ๊น์ง class์ copyWith ๊ธฐ๋ฅ์ ์ง์ ์์ฑํ ๋์, nullable ํ์ ์ ๋ณ์์ NULL ๊ฐ์ด ์ ๋ฌ๋์ง ์๋ ๋ถ๋ถ์ ๋ํด์ NULL ์ฌ์ฉ์ ๋ํ 3๊ฐ์ง์ ๋ฐฉ๋ฒ์ ์ดํด๋ดค๋ค.
์ด์ ๊ธ์์ 2๊ฐ์ง์ ๋ฐฉ๋ฒ์ ๋ํด์ ์ด๋ฏธ ์ดํด๋ดค๊ณ , ์ถ๊ฐ๋ก ์๋ก์ด ๋ฐฉ๋ฒ์ ์ ์ํ๊ฒ ๋์๋๋ฐ, ์ ๊ฐ ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฒ์ ์ถ๊ฐ๋ ๋ฐฉ๋ฒ์ด๊ธด ํ๋ ๊ฐ๋ฐ์ ๋ณธ์ธ์ ์ ํ์ผ๋ก ์ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์๋ฉด ๋๋ค.
์ถ๊ฐ๋ก ์๋ก์ด ๋ฐฉ๋ฒ์ ์ฐพ๊ฒ ๋๋ฉด ๊ณต์ ํ๋๋ก ํ๊ฒ ๋ค.