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

cjkimhello97님의 프로필 이미지
cjkimhello97

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

값 타입과 불변 객체

값타입 쓰는 이유, 값타입의 한계와 해결방법

작성

·

568

0

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

[질문 내용]
값 타입을 공부하며 정리한 생각입니다.

제가 올바르게 생각했는지 검토해주시면 감사드리겠습니다

개인적으로 정리한 글이라 존댓말이 아닌 점 양해주시면 감사드리겠습니다

 

 

값타입은 왜 쓰는가?

엔티티는 서로 공유하는 것이 목표이다

그래서 엔티티 필드를 다른 엔티티 필드와 연관관계 매핑(@ManyToOne 등)을 하는 것이다

하지만 모든 엔티티 필드를 서로 공유한다고 하면 너무 복잡하지 않겠는가?

필드가 해당 엔티티에만 소속되어 다른 엔티티와는 연관(공유)되지 않는 값이 있으면 조금이라도 단순해질 수 있지 않을까?

그래서 값 타입을 사용하는 것이다!

값 타입의 한계는 무엇인가?

Wrapper type(기본 값 타입), String type(기본 값 타입), 임베디드 타입은 객체 타입이다.

그래서 기본값 타입과 임베디드 타입은 참조 공유가 가능하다.

객체 타입의 참조 공유가 문제라고 생각하면 문제일 순 있겠지만

자바에서 참조 공유를 막을 수 있는 방법은 없다. 

그래서 참조 공유의 문제(두 객체가 하나의 참조를 바라볼 수 있는 문제)는 차치하자.

그러면 발생할 수 있는 문제는 무엇이냐면

하나의 참조를 바라보는 두 객체가 존재할 때, 해당 참조의 실제 값이 바뀌면 두 객체의 값이 모두 변경될 수 있다는 것이다.

(참고로, 만약 참조의 실제 값이 바뀔 때 두 객체의 값이 모두 변경되길 의도했다면 값타입이 아니라 엔티티 타입을 써야 한다. 왜냐하면 공유가 목표였다면 값타입이 아니라 엔티티를 사용하는 것이 옳기 때문이다.)

물론 Wrapper type(기본값 타입), String type(기본값 타입) 은 setter 가 없기 때문에 값 변경이 불가능하다.

그래서 기본값 타입은 참조 공유의 문제로부터 어느정도 자유로울 수 있다.

그럼 진짜 문제는 임베디드 타입이다.

왜냐하면 임베디드 타입은 만약 개발자가 setter 를 만들면 값 변경이 가능하기 때문이다.

어떻게 임베디드의 참조 공유의 문제(두 객체가 하나의 참조를 바라볼 때, 참조의 실제값이 변경되어 두 객체의 값이 동시에 변경될 수 있는 문제)를 해결할 수 있을까?

불변 객체를 만드는 것이다

불변 객체는 말 그대로 한번 생성한 이후에 값을 변경하지 못하는 객체이다

불변 객체를 만들기 위해

1. 생성자로만 필드 초기화

2. setter 금지

를 준수하면 된다

만약 값을 변경하고 싶다면 객체를 통째로 새롭게 만들어야 한다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

cjkimhello97님의 질문에 대한 답변이 될 수 있는 유사한 기존 답변을 찾았습니다. 값 타입의 개념과 사용 이유, 그리고 불변 객체로서의 값을 변경할 수 없도록 설계하는 방법에 대해 궁금해하시는 것 같습니다.

아래 링크에서 비슷한 주제에 대한 질의응답을 확인하실 수 있습니다:

자세한 내용은 제공된 링크를 통해 확인해보시기 바랍니다.

cjkimhello97님의 프로필 이미지
cjkimhello97

작성한 질문수

질문하기