Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- JPQL
- springdatajpa
- 백준
- Servlet
- transaction
- http
- pointcut
- jpa
- spring
- AOP
- 그리디
- Proxy
- 스프링
- Thymeleaf
- 인프런
- 알고리즘
- SpringBoot
- 자바
- 스프링 핵심 원리
- kotlin
- Android
- JDBC
- Exception
- 스프링 핵심 기능
- java
- QueryDSL
- db
- 김영한
- Greedy
- Spring Boot
Archives
- Today
- Total
개발자되기 프로젝트
값 타입과 불변 객체 본문
값 타입은 복잡한 객체 세상을 조금이라도 단순화 하려고 만든 개념이다.
따라서 값 타입은 단순하고 안전하게 다룰 수 있어야 한다.
1. 값 타입 공유 참조
- 임베디드 타임 같은 값 타입을 여러 엔티티에서 공유하면 위험함!!!!!!!
- side effect 발생
-
Address homeAddress = new Address("city", "street", "321654"); Member member = new Member(); member.setUserName("member1"); member.setAddress(homeAddress); em.persist(member); Member member2 = new Member(); member2.setUserName("member2"); member2.setAddress(homeAddress); em.persist(member2); member.getAddress().setCity("newCity"); tx.commit();
- 앗....member1만 city를 변경하려고 했는데 둘 다 변경됨.
- 값을 공유하고 싶으면!! 엔티티로 만들어야함.
2. 값 타입 복사
- 값 타입의 실제 인스턴스인 값을 공유하는 것은 위험해
- 대신에 값을 복사해서 쓰자.
- new Address()를 통해 새로 만들어서 사용해야 한다.
Address homeAddress = new Address("city", "street", "321654"); Member member = new Member(); member.setUserName("member1"); member.setAddress(homeAddress); em.persist(member); Address copyAddress = new Address(homeAddress.getCity(), homeAddress.getStreet(), homeAddress.getZipcode()); Member member2 = new Member(); member2.setUserName("member2"); member2.setAddress(copyAddress); em.persist(member2); member.getAddress().setCity("newCity"); tx.commit();
- 와! 의도한 대로 member1만 변경되었당
3. 객체 타입의 한계
- 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있어.
- 문제는! 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입!!!!이다.
- 자바 기본 타입에 값을 대입하면 값을 복사한다.
- 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다.
- 객체의 공유 참조는 피할 방법이 없어.
- 타입만 맞으면 다들어감..ㄷ
- 기본 타입(primitive)
int a = 10; int b = a;//기본 타입은 값을 복사 b = 4;
- 객체 타입
a, b 둘다 같은 인스턴스 가리킴.Address a = new Address(“Old”); Address b = a; //객체 타입은 참조를 전달 b. setCity(“New”)
4. 불변객체
- 객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단 가능
- 값 타입은 불변객체(immutable object)로 설꼐해야 함.
- 불별객체 : 생성 시점 이후 절대 값을 변경할 수 없는 객체
- 생성자로만 값을 설정하고 수정자를 만들지 않으면 됨 ㅋㅋㅋ
- 생성자만 있고, setter 없애버려, 아니면 setter를 private로 지정. - 참고로 Integer, String을 자바가 제공하는 대표적이 불변 객체
불변이라는 작은 제약으로 부작용이라는 큰 재앙을 막을 수 있어!
- 근데... 값을 진짜 바꾸고 싶으면..?
- 값을 통으로 바꿔줘야함 : Address를 통으로 갈아껴야함.
-
Address homeAddress = new Address("city", "street", "321654"); Member member = new Member(); member.setUserName("member1"); member.setAddress(homeAddress); em.persist(member); Address newAddress = new Address("newCity", homeAddress.getStreet(), homeAddress.getZipcode()); member.setAddress(newAddress);
값 타입은 항상 불변으로 만들자. ㅋㅋㅋ
5. GitHub : 210812 immutable object
'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
값 타입 (0) | 2021.08.13 |
---|---|
값 타입 비교 (0) | 2021.08.13 |
임베디드 타입 (0) | 2021.08.12 |
기본 값 타입 (0) | 2021.08.12 |
[예제] 연관관계 관리 (0) | 2021.08.12 |
Comments