Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

값 타입과 불변 객체 본문

인프런/[인프런] 자바ORM 표준 JPA 프로그래밍

값 타입과 불변 객체

Seung__ 2021. 8. 13. 00:02
값 타입은 복잡한 객체 세상을 조금이라도 단순화 하려고 만든 개념이다.
따라서 값 타입은 단순하고 안전하게 다룰 수 있어야 한다.

 

 

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;​
  • 객체 타입
    Address a = new Address(“Old”); 
    Address b = a; //객체 타입은 참조를 전달
    b. setCity(“New”)​
     a, b 둘다 같은 인스턴스 가리킴.

 

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


 

GitHub - bsh6463/JPA

Contribute to bsh6463/JPA development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글

값 타입  (0) 2021.08.13
값 타입 비교  (0) 2021.08.13
임베디드 타입  (0) 2021.08.12
기본 값 타입  (0) 2021.08.12
[예제] 연관관계 관리  (0) 2021.08.12
Comments