JPA 값 타입 - 값 타입의 비교

2022. 7. 12. 23:24·공부/JPA
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.

 

값 타입의 비교

  • 값 타입 : 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다.
// 같다.
int a = 10;
int b = 10;

// 다르다.
Address a = new Address("서울시");
Address b = new Address("서울시");

그런데 객체의 경우엔 == 비교 시 false가 반환된다. 왜나햐면 JAVA에서는 == 비교 시 참조 값을 비교하게 되는데 a와 b는 각각 다른 참조 값을 갖고 있기 때문에 false가 반환된다.

  • 동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용
  • 동등성(equivalence) 비교 : 인스턴스의 값을 비교, equals() 사용
  • 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야 함
  • 값 타입의 equals() 메서드를 적절하게 재정의(주로 모든 필드 사용)

그럼 equalse()를 사용해보자.

Address address1 = new Address("city", "street", "1000");
Address address2 = new Address("city", "street", "1000");

System.out.println("address1 == address2 : " + (address1 == address2)); // false
System.out.println("address1.equals(address2) : " + address1.equals(address2)); // false

생각했던 것과 다르게 equals()를 사용해도 false가 출력된다. 이유는 equals()는 기본적으로 == 비교를 하기 때문이다.

// equals() 
public boolean equals(Object obj) {
    return (this == obj);
}

그렇기 때문에 의도하는 대로 true를 반환하게 하고 싶으면 equals()를 재정의해야 한다.

// Address.class

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Address address = (Address) o;
    return Objects.equals(city, address.city) && Objects.equals(street, address.street) && Objects.equals(zipcode, address.zipcode);
}

@Override
public int hashCode() {
    return Objects.hash(city, street, zipcode);
}

위와 같이 추가해주면 되는데.... 인텔리제이 기능을 이용하여 쉽게 코드를 자동으로 만들 수 있다.

mac 기준 Control + N 후 equals() and hashCode() 선택

웬만하면 다 기본으로 제공하는 설정을 사용하는 게 좋다. 그러니 계속 next를 누르다가 create를 누르면 위의 코드가 자동으로 생성된다.
그러고 애플리케이션을 다시 실행해보면 원하던 의도대로 실행되는 걸 볼 수 있다.

System.out.println("address1 == address2 : " + (address1 == address2));
System.out.println("address1.equals(address2) : " + address1.equals(address2)); // true

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • JPA 객체지향 쿼리 언어 - JPQL, QueryDSL 등 소개
  • JPA 값 타입 - 값 타입 컬렉션
  • JPA 값 타입 - 값 타입과 불변 객체
  • JPA 값 타입 - 임베디드 타입
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    운영체제
    스프링부트
    인프런
    QueryDSL
    RESTful
    넥사크로
    JPA
    oracle
    토비의스프링부트
    Spring
    전자정부프레임워크
    SpringBoot를 이용한 RESTful Web Service 개발
    프로그래머스
    IT
    자바스크립트
    백준
    개발자
    springboot
    방통대
    토이프로젝트
    react
    MSA
    egov
    Java
    코딩테스트
    알고리즘
    프론트엔드
    에러해결
    기출문제
    SQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
JPA 값 타입 - 값 타입의 비교
상단으로

티스토리툴바