작성
·
568
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
값 타입을 공부하며 정리한 생각입니다.
제가 올바르게 생각했는지 검토해주시면 감사드리겠습니다
개인적으로 정리한 글이라 존댓말이 아닌 점 양해주시면 감사드리겠습니다
값타입은 왜 쓰는가?
엔티티는 서로 공유하는 것이 목표이다
그래서 엔티티 필드를 다른 엔티티 필드와 연관관계 매핑(@ManyToOne 등)을 하는 것이다
하지만 모든 엔티티 필드를 서로 공유한다고 하면 너무 복잡하지 않겠는가?
필드가 해당 엔티티에만 소속되어 다른 엔티티와는 연관(공유)되지 않는 값이 있으면 조금이라도 단순해질 수 있지 않을까?
그래서 값 타입을 사용하는 것이다!
값 타입의 한계는 무엇인가?
Wrapper type(기본 값 타입), String type(기본 값 타입), 임베디드 타입은 객체 타입이다.
그래서 기본값 타입과 임베디드 타입은 참조 공유가 가능하다.
객체 타입의 참조 공유가 문제라고 생각하면 문제일 순 있겠지만
자바에서 참조 공유를 막을 수 있는 방법은 없다.
그래서 참조 공유의 문제(두 객체가 하나의 참조를 바라볼 수 있는 문제)는 차치하자.
그러면 발생할 수 있는 문제는 무엇이냐면
하나의 참조를 바라보는 두 객체가 존재할 때, 해당 참조의 실제 값이 바뀌면 두 객체의 값이 모두 변경될 수 있다는 것이다.
(참고로, 만약 참조의 실제 값이 바뀔 때 두 객체의 값이 모두 변경되길 의도했다면 값타입이 아니라 엔티티 타입을 써야 한다. 왜냐하면 공유가 목표였다면 값타입이 아니라 엔티티를 사용하는 것이 옳기 때문이다.)
물론 Wrapper type(기본값 타입), String type(기본값 타입) 은 setter 가 없기 때문에 값 변경이 불가능하다.
그래서 기본값 타입은 참조 공유의 문제로부터 어느정도 자유로울 수 있다.
그럼 진짜 문제는 임베디드 타입이다.
왜냐하면 임베디드 타입은 만약 개발자가 setter 를 만들면 값 변경이 가능하기 때문이다.
어떻게 임베디드의 참조 공유의 문제(두 객체가 하나의 참조를 바라볼 때, 참조의 실제값이 변경되어 두 객체의 값이 동시에 변경될 수 있는 문제)를 해결할 수 있을까?
불변 객체를 만드는 것이다
불변 객체는 말 그대로 한번 생성한 이후에 값을 변경하지 못하는 객체이다
불변 객체를 만들기 위해
1. 생성자로만 필드 초기화
2. setter 금지
를 준수하면 된다
만약 값을 변경하고 싶다면 객체를 통째로 새롭게 만들어야 한다
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
cjkimhello97님의 질문에 대한 답변이 될 수 있는 유사한 기존 답변을 찾았습니다. 값 타입의 개념과 사용 이유, 그리고 불변 객체로서의 값을 변경할 수 없도록 설계하는 방법에 대해 궁금해하시는 것 같습니다.
아래 링크에서 비슷한 주제에 대한 질의응답을 확인하실 수 있습니다:
자세한 내용은 제공된 링크를 통해 확인해보시기 바랍니다.