인프런 커뮤니티 질문&답변

Jung Jae Yoo님의 프로필 이미지
Jung Jae Yoo

작성한 질문수

[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter

스플레시 데이터 로드 및 인증 체크 프로세스 개발

copywith 함수를 안만들면 어떻게 되나요?

해결된 질문

작성

·

452

0

스플레시 데이터 로드 및 인증 체크 프로세스 영상에서 11분 쯤에 AppDataLoadState 클래스 안에 copyWith 함수를 또 하나 만드시는 이유가 궁금합니다 ㅠ

  1. 정확히 어떤 역할을 하는지

  2. 왜 만들어 주는지

  3. flutter나 dart의 기능이 아닌 그냥 임의적으로 copyWith라는 이름을 쓴 함수?생성자? 인지

이 3가지가 궁금합니다

답변 1

2

개발하는남자님의 프로필 이미지
개발하는남자
지식공유자

안녕하세요 

상태관리라고 하는 것은 이전 값과 다음 값이 변경이 이루어 졌을때 화면에서 이를 캐치하여 화면을 갱신시켜주는 것이 주된 목적입니다.

그러면 이전 값과 다음 값이 달라졌다는것을 체크가 되어야 합니다. 기본적으로 class는 mutable한 성질이 있기 때문에 객채 내부의 맴버 변수들의 값들이 

바뀐다고 해도 해당 객체는 변화 되었다고 인식하지 않습니다. 왜냐하면 변경가능한 mutable 한 속성이 기 때문이죠.

이해를 돕기 위해 다음과 같은 예제를 만들어 봤습니다.  Dartpad 사이트에서 돌려보시면 이해가 되는데 도움이 되실 것입니다. 

void main() {
  var test = User('개발하는남자','010-xxxx-1234');
  var newTest= test..updatePhone('010-yyyy-4321');
  
  print(test == newTest); // true
}

class User{
  String name;
  String phone;
  User(this.name,this.phone);
  updatePhone(String phone){
    this.phone = phone;
  }
}

위 예제는 User 객체에 이름과 연락쳐를 넣었습니다. 하지만 연락처가 바뀌었다고 하면 User 객체에 연락처를 업데이트 시켜줬습니다. 

이때 변경된 객체와 기존 생성한 객체를 비교하면 상태는 바뀌었지만 바뀐것을 인식하지 못합니다. 

하지만 다음 예제를 보겠습니다. 

void main() {
  var test2 = NewUser('개발하는남자','010-xxxx-1234');
  var newTest2= test2.copyWith(phone :'010-yyyy-4321');
  
  print(test2 == newTest2); // false
}

class NewUser{
  String name;
  String phone;
  NewUser(this.name,this.phone);
  
  copyWith({String? name, String? phone}){
    return NewUser(
      name?? this.name,
      phone??this.phone,
    );
  }
}

위 예제를 돌려보시면 test2와 newTest2 가 다르다라고 인식하게 될 것입니다. 그러므로 상태가 바뀌었다고 bloc/cubit 이 인식하게 됩니다. 

그런데 의문이 드실 수 있습니다. 애초에 첫번째 예제때 새로운 객체를 만들어서 넣으면 되는거 아니냐고 생각할 수 있습니다.

다음과 같이 말이죠 

void main() {
  var test = User('개발하는남자','010-xxxx-1234');
  var newTest= User('개발하는남자','010-yyyy-4321');
  
  print(test == newTest); // false
}

맞습니다 위 처럼 바뀐 데이터를 새로운 객채로 만들어서 넣으면 달리 인식하여 상태관리로 상태가 바뀌었다고 인식하게 되겠습니다. 

바로 이 방식이 copyWith 방식입니다. copyWith 함수를 보시면 새로운 객체를 만들어서 return 해주고 있습니다. 

그럼 다시 생각해보면 반드시 copyWith를 쓸 필요가 없다는 것입니다. 

cubit에서 emit 해줄때 새로운 객채로 만들어서 넣으면 동작이 될 것입니다. 

단지 copyWith를 해주는 것은 개발 편의를 위해 사용하는 것입니다. 

 

이해를 돕기 위해 설명을 드리긴 했지만 아무래도 문자로 설명드리니까 어렵게 설명드린게 아닌가 우려가 되네요 ^^;; 

 

도움이 되셨다면 좋겠지만 만일 그래도 이해가 안가신다 하신다면 제가 조만간 이 내용관련 영상을 만들어서 유튜브에 업로드 하도록 하겠습니다. 

감사합니다. 

Jung Jae Yoo님의 프로필 이미지
Jung Jae Yoo
질문자

아 그렇군요 ~! 저는 dart나 flutter의 하나의 기능처럼 작동하는 것인줄 알았는데 변화를 주기위한 임의적인 이름이자 임의적인 기능이군요~! 친절하고 자세한답변 감사합니다!! ㅎ ㅎ

Jung Jae Yoo님의 프로필 이미지
Jung Jae Yoo

작성한 질문수

질문하기