본문 바로가기
Flutter

[Flutter] UI(1) - copyWith

by 아마도개발자 2023. 12. 7.

 

copyWith 

 

copyWith가 dart와 flutter만의 특별한 개념은 아니지만, 이 패턴은 꽤 자주 사용된다. `copyWith()`의 가장 큰 이점은 원래 개체(original)를 변경하지 않고, 원래 개체와 같은 속성의 새로운 object에 내가 원하는 값을 특정해서 생성할 수 있다는 점이다. 이를 통해 개체가 변경 가능한 '상태'를 포함하지 않으므로 테스트가 용이하고 관리하기 쉬운 앱을 만들 수 있게 된다.

 

 

Text(
  "copyWith Test Sample",
  style: Theme.of(context)
              .textTheme
              .headline
              .copyWith(
                color: Colors.red, 
                fontWeight: FontWeight.bold),
)

 

위 예제는 headline 테마를 복사 한 뒤, color와 fontWeight 속성을 오버라이딩 하는 코드이다. `copyWith`로 원본을 복사한 것이기 때문에 원본 테마와 값에는 변경사항 없이 내가 원하는 속성만 바꿔줄 수 있다.

 

이러한 copyWith 패턴은 클래스를 생성할 때도 응용할 수 있다.

class Person {
  String name;
  int age;
  String job;

  Person({required this.name, required this.age, required this.job});

  Person copyWith(
          {required String name, required int age, required String job}) =>
      Person(
        name: name,
        age: age,
        job: job,
      );
}

 

 

위와 같이 copyWith 함수를 구현하면 이미 생성한 인스턴스를 복사하여 필요한 값만 교체 한 뒤 사용할 수 있다.

Person johnPark = Person(name: "john", age: 20, job: "teacher")
Person johnLee = johnPark.copyWith(age: 30, job: "student")