승상의 코딩 블로그

[Flutter] 불변 객체를 왜 사용할까? 본문

Flutter (플러터)

[Flutter] 불변 객체를 왜 사용할까?

양승상 2024. 12. 19. 11:57

왜 불변 객체을 써라고 하는 것일까?

* 불변 객체만 쓰라는 것은 아니다. 대부분의 경우에 장점이 많기 때문이다

* 대부분의 경우에서 불변 객체의 단점을 장점이 상쇄시킨다.

  1. 불변 객체를 사용하면 외부에서 의도하지 않은 수정으로부터 객체를 보호할 수 있다.

    코드는 한 사람만이 개발하는 것이 아니다.
    즉, 내가 구현한 객체가 의도치 않게 외부에서 수정될 수 있다.

  2. 데이터와 로직의 흐름을 파악하기 쉽다.

    데이터가 변경이 일어날 경우, 이를 추적하면 코드를 파악하는 것은 쉽지 않다.
    데이터가 불변이 아니라면, 데이터가 변경이 되지 않았음을 계속해서 파악해야한다.

    자신이 코드를 작성할 경우에는 로직을 정확히 파악하고 모든것을 컨트롤 할 수 있다고 생각할 수 있다.
    (내가 처음에 이랬다)
    그러나 개발하는 시스템이 복잡해지고 시간이 지나감에 따라 내 기억에는 한계가 보이기 시작할 것이다.

  3. 멀티 쓰레드를 사용할 경우, 데이터 동기화에 대한 부담이 준다.

    여러 쓰레드에서 동시에 읽어도 항상 동일한 데이터이므로 문제가 없다.

  4. 캐싱과 해싱

    데이터가 변경되지 않으므로 캐싱에 적합하다.
    그러나 대부분의 데이터는 변경된다고 생각한다.
    해쉬 값으로 사용할 경우(Map 등 해쉬 값을 사용하는 부분)에 오작동을 변경한다.
    (해쉬값으로 키값이 설정되는데 객체의 내용이 변경하지 않으니, 해쉬값을 활용해도 안전하다는 뜻이다)   

 

사용방법

플러터에서는 final 과 const 를 활용하여 불변객체를 만들 수 있다.

불변객체라도 데이터의 변경이 일어나야하므로, 아래 포스팅의 copyWith 함수를 만들어서 활용했다.

(값이 변경하여 다시 불변객체를 만들어야 함. 코드상으로 가독성높인 것이 copyWith 함수이다.)

2024.12.19 - [Flutter (플러터)] - [Flutter] clone, copyWith 를 활용한 깊은 복사

 

[Flutter] clone, copyWith 를 활용한 깊은 복사

복사에는 얕은 복사(shallow copy)와 깊은 복사(deep copy)가 있다.얕은 복사얕은 복사는 객체의 참조값만 복사한다.(원본 객체와 동일한 메모리 주소값을 참조하는것이다.)즉, 데이터를 "공유"하는 것

seungsang.tistory.com

 

 

 

 

Freezed 패키지를 활용하면 쉽게 불변객체를 만들 수 있다.

2023.08.22 - [Flutter (플러터)] - [Flutter] 불변객체와 내부 속성을 쉽게 만들어주는 freezed 패키지

 

[Flutter] 불변객체와 내부 속성을 쉽게 만들어주는 freezed 패키지

모델 클래스를 정의하는 것은 귀찮은 일이다. Json 을 받는 코드, 객체의 특정 속성만 변경하여 새로운 객체를 반환하는 코드 등 ... 클래스가 많아질수록 자동화하지 않으면 시간이 많이 걸릴 뿐

seungsang.tistory.com

반응형
Comments