값 타입 작성 방법

반응형
반응형

자바를 학습을 하게 되면 늘 기본적으로 primitive를 학습하게 된다.
이들의 특징은 공유 대신에 복사를 이용한다는 점인데 이 점때문에 안전한 코딩을 할 수 있다고 한다.
예를들어

int a = 3;
int b = a;
b = 5;
System.out.println(a);
System.out.println(b);

이런코드가 존재할때 a와 b가 서로 다르다는 것을 알 수 있다.
이점은 복사가 이뤄졌기 때문이라고 한다. 

하지만 이것을 객체로 작성하게 된다면 얘기가 달라진다.
객체를 이용하게 되면 값을 복사하는 것이 아니라 주소값을 복사해온다는 점이 달라진다.
이게 위에서 말한 공유인데 위 코드를 다시 작성하면

Integer a = 3;
Integer b = a;
b = 5;
System.out.println(a.getClass());
System.out.println(b.getClass());

물론 코드자체는 위 코드와 결과 값이 다르지 않을 거다.
그 이유는 이미 자바에서 이것을 잘 이용할 수 있게 함이 아닐까 생각이 든다.
다시 태스트를 하기 위해 클래스를 만들었다.

Movie movie1 = new Movie();
movie1.valueSet(5);
Movie movie2 = movie1;
movie2.valueSet(10);
System.out.println(movie1.getValue());
System.out.println(movie2.getValue());

이렇게 코드를 작성하게 되면 두개다 10이 나온다는 것을 알 수 있다.
이게 바로 주소값을 복사해서 발생한건데 이것을 알기 위해서 주소 값을 확인해보자.

movie1 = helloJava.Movie@1324409e
movie2 = helloJava.Movie@1324409e

확인 결과 두개의 주소가 같다는 것을 알 수 있었다.
고로 이것이 발생하지 않기 위해서는 이러한 코드를 불변하게 만드는 것이 굉장히 중요하다.
그래야 이와 같은 문제를 없애기 위함이다.
그러면 어떻게 불변하게 만들 수 있을까?

public class Movie {

  private int value;

  public Movie(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

요런식으로 set을 제거하고 생성자를 통해서 데이터를 받거나

public final class Movie {

  private int value;

  public Movie(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

final을 붙여서 이 객체는 수정이 불가하는 것을 명시해줘야 한다.
그 결과 다음과 같은 코드를 작성할 수 있다.

Movie movie1 = new Movie(2);
Movie movie2 = new Movie(5);
System.out.println("movie1 = " + movie1);
System.out.println("movie2 = " + movie2);

이것을 말하는 이유는 JPA의 객 타입은 불변으로 만들어야 하기 위함을 위해 설명하였다.

@Embeddable
public final class Movie {

  private int value;

  public Movie() {
  }

  public Movie(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

요거는 이 객체를 객 타입으로 만드는 행위고 이것을 사용하려면

@Embedded
private Movie movie;

이렇게 작성하면 된다.

근데 이게 공유가 된다고 하였다.
즉 다음처럼 작성해야 된다고 한다.

studentA.setMovie(movie);
studentB.setMovie(new Movie(movie.getValue()));

위에서 계속 말했지만 공유가 된다는 문제점때문에 신중해서 사용해야 될 것같다.
이 것을 엔티티처럼 사용하는 방법도 있었는데 까먹은 관계로 작성하지 않는다.
마지막으로 이 방법으로 사용할것인지 아니면 엔티티로 사용할지 신중하게 고민한뒤 사용해야겠다.
어디까지나 이것은 객타입이니까..

 

 

'JPA' 카테고리의 다른 글

JPQL 중급 문법  (0) 2021.12.26
JPQL 기본 문법  (0) 2021.12.18
값 타입 작성 방법  (0) 2021.12.12
Proxy?  (0) 2021.12.04
상속하는 방법?  (0) 2021.11.27
연관관계의 주인을 바꾸면 무슨일이 발생할까?  (0) 2021.10.30

댓글(0)

Designed by JB FACTORY