강의

멘토링

로드맵

Inflearn brand logo image

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

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

김영한의 실전 자바 - 중급 1편

불변 객체 - 예제

"챕터 2 - 불변 객체 - 예제" 에서 나온 코드들이 실무에서 자주 사용하는지?

해결된 질문

작성

·

460

·

수정됨

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요. "챕터 2- 불변객체 예제"에서 회원의 주소를 변경할때 가변 객체 에서의 MemberMainV1의 코드를 보면,

memberB.getAddress().setValue("부산"); 이런식 으로 하셧고,

불변 객체의 에서의 MemberMainV2의 코드를 보면,

memberB.setAddress(new ImmutableAddress("부산")); 이런식으로 하셨는데.

이런 코드들이 실무에서 얼마나 자주 사용하는지 궁금 합니다.

공부하면서 이런 코드들은 본적이(저한테는 특이한 코드 여서) 없어서 질문을 남깁니다.

답변 부탁드립니다.

답변 2

3

안녕하세요. 생각하는자님, 공식 서포터즈 y2gcoder입니다.

실무에서는 불변 객체를 생각하신 것보다 더 자주 사용하게 됩니다. 특히 도메인 주도 설계(DDD)에서 값 객체를 모델링할 때 잘 활용하고 있습니다. 학습하신 것과 같이 값객체는 변하지 않는 속성을 가진 객체로 한 번 생성되면 그 상태가 변하지 않습니다. 이는 사용할 때 데이터의 무결성과 Thread-safe한 동작을 보장하는 데 도움을 줍니다.

특히 예시와 같이 주소 정보와 같은 객체는 여러 도메인에서 공통적으로 사용될 수 있습니다. 이 때 주소 정보가 의도치 않게 변경되는 문제를 예방하기 위해 불변 객체로 구현하게 됩니다. 불변 객체로 구현하게 되면 변경이 필요할 때는 새로운 객체를 생성해서 반환해야 하기 때문에, 데이터 변경 관리를 더 엄격하게 하여 코딩할 때의 안정성을 올려주고, 오류 가능성을 줄여줄 수 있다고 생각합니다.

여담입니다만 자바-백엔드 쪽이 아니더라도 다른 언어 및 프레임워크에서 불변성을 이용하는 경우는 종종 있는 것 같습니다. 예전에 잠시 업무를 위해 리액트를 공부했을 때, 전역 상태 관리 라이브러리인 리덕스를 공부했을 때가 있었습니다. 그 때도 상태 업데이트를 해주기 위해서는 단순히 상태값을 변경하는 것이 아니라 변하지않는 상태들을 포함한 새 오브젝트를 만들어 반환해주는 것으로 불변성을 지켜야 제대로 작동해줬던 것으로 기억합니다. (현재는 달라졌을 수도 있습니다!)

감사합니다.

y2gcoder님의 말을 전부다 이해는 못하였지만.. 절대로 이것을 익혀야 한다는 것은 알게 되었네요. 감사합니다.

1

image.png

 

이부분을 보다가

getValue /setValue 부분이 생겼는데 혹시 이부분은 무엇을 뜻하나요?
또한 해설부분은 어디서 볼수있나요?

찾아보니 자바-basic 부분에서 간간히 써 왔습니다.
value의 값이 private라서 Address address = new Address("지역-부산");

System.out.println(addres.value); address.value = "지역-서울"; 이런식 으로 할수 없습니다. 그래서 value를 보여주기 위해서 getValue, value의 값을 변경하기 위해서 setValue(내용)을 씁니다.
java-basic "접근제어자" 를 보시면 이해 가능 하실 거에요.
그래도 이해가 불가능 한다면 자바 getter setter 이렇게 검색해 보세요.

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

질문하기