CS
  • CS-Study
  • database
    • B-Tree와 B+Tree
    • DB JOIN
    • DB Lock
    • DB 트래픽
    • DBCP (DB Connection Pool)
    • Flyway
    • Message Broker
    • MySQL InnoDB 스토리지 엔진
    • MySQL 엔진 아키텍처
    • RDB와 NoSQL
    • Redis
    • SQL Injection
    • 스키마 (Schema)
    • Table Scan과 Index Scan
    • Apache Kafka
    • Key
    • 뷰 (View)
    • 인덱스
    • 정규화
    • RDBMS, NoSQL의 클러스터링/리플리케이션 방식
    • 트랜잭션(Transaction)
    • 트랜잭션의 격리성(Transaction Isolation)
    • 프로시저와 트리거
    • DB 정규화 (Normalization)
  • etc
    • MSA
    • REST, REST API, RESTful
    • SOLID 원칙
    • TDD (Test-Driven Development)
    • 서버리스
    • 컨테이너와 도커
  • java
    • Collections
    • Garbage Collection
    • Generic
    • JDBC
    • Java Virtual Machine(JVM)
    • Java Thread
    • Java8 vs Java11 vs Java17
    • 객체지향 프로그래밍 OOP (Object Oriented Programing)
    • Optional
    • RxJava(Reactive Programming)
    • 문자열(String & StringBuffer & StringBuilder)
    • Synchronized
    • Virtual Thread
    • Wrapper Class
    • Equals()와 Hashcode()
    • final
    • Jackson 라이브러리
    • 리플렉션(Reflection)
    • static class와 static method
    • 스트림(Stream)과 람다(Lambda)
    • 스프링 프레임워크에서 사용되는 디자인 패턴
    • 예외처리(Exception)
    • Java Annotation
    • 추상클래스와 인터페이스
  • network
    • 3-way handshake
    • 4-way Handshake
    • DHCP(Dynamic Host Configuration Protocol)
    • DMZ(DeMilitarized Zone)
    • DNS(Domain Name System)
    • HTTP Method
    • HTTP 버전 비교
    • HTTP status code
    • HTTP
    • IP Address
    • Mutiplexing & Demultiplexing
    • OSI 7계층
    • SOP, CORS
    • TCP와 UDP
    • XSS와 CSRF
    • gRPC
    • Stateless와 Connectionless
    • 라우터 Router
    • 로드밸런서(Load Balancer)
    • 브라우저에 URL입력시 네트워크 상 일어나는 일
    • 서브넷 마스크, 게이트웨이
    • 웹 소켓과 소켓 통신
    • 쿠키(Cookie)와 세션(Session)
  • operating-system
    • IPC (Inter Process Communication)
    • 인터럽트
    • TLB
    • 스레싱 Thrashing
    • Thread Pool, Fork-Join
    • Thread Safe
    • 프로세스
    • 가상 메모리
    • 데드락 (DeadLock, 교착 상태)
    • 동기/비동기 & 블로킹/논블록킹
    • 동기화(Synchronization)
    • 메모리 할당과 단편화
    • 뮤텍스와 세마포어, 모니터
    • 세그먼테이션과 페이징
    • 운영체제
    • 캐시 메모리
    • Context switching(문맥 교환)
    • 컴파일
    • 파일 시스템
    • 페이지 교체 알고리즘(Page Replacement Algorithm)
    • 프로세서 스케줄링 알고리즘
    • 프로세스 주소 공간
  • spring
    • @Transactional
    • AOP(Aspect-Oriented Programming)
    • DTO, DAO, VO, Entity
    • DispatcherServlet
    • Hibernate, JPA, Spring Data JPA
    • Ioc와 DI
    • JPA 연관관계 맵핑
    • N+1 Problem
    • ORM
    • Persistence Context
    • SQL Mapper vs ORM vs QueryBuilder
    • Servlet Filter와 Spring Interceptor
    • Servlet
    • Spring MVC와 Spring Boot
    • Tomcat
    • WebFlux
Powered by GitBook
On this page
  • == 연산자
  • equals()
  • equals 메소드 오버라이딩
  • Hash code
  • equals와 hashCode
  • identity HashCode 메소드
  1. java

Equals()와 Hashcode()

equals()와 Hashcode는 모든 Java 객체의 부모 객체인 Object 클래스에 정의되어 있다. 따라서 Java의 모든 객체는 두 함수를 상속받고 있다.

== 연산자

  • primitive type에 대해선 값 비교를, reference Type에 대해서는 객체의 주소 값을 비교함

    • 원시 타입(Primitive type)

      • 기본적인 데이터 타입으로, 자바에서 미리 정의되어 있는 데이터 타입

      • 빈 객체 타입으로 NULL값을 가질 수 없으며 Stack메모리 저장

    • 참조 타입(Reference Type)

      • 객체를 가리키는 참조(메모리 주소)를 저장하는 데이터 타입

      • 빈 객체 타입 NULL을 가질 수 있으며 Heap 메모리에 생성

equals()

// Object의 기본 equals 메서드
public boolean equals(Object obj) {
    return (this == obj);
}
  • 개념

    • 어떤 두 참조 변수 값의 동등여부를 비교할 때 사용하는 매소드

      • 동일성(Identity) 비교

    • 어떤 두 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체로 판단

  • 특징

    • java.lang.Object 클래스에 정의

    • equals 메소드의 기본동작은 객체의 참조값을 비교하나, 객체의 내부 값을 비교하기 위해 논리적으로 재정의(override) 될 수 있음

  • 주의사항

    • Null의 처리

      • equals() 메서드는 null과의 비교도 처리할 수 있어야 함

      • null과는 항상 false를 반환

      • null인지 검사하여 NullPointerException이 발생하지 않도록 주의

    • 타입체크

      • 매개변수로 전달된 객체가 현재 객체와 동일한 클래스(또는 하위 클래스)의 인스턴스인지 확인

    • 상속과 호환성

      • 부모 클래스의 equals() 메서드도 동작하도록 super.equals()를 호출하거나 부모 클래스의 동치성 비교에 필요한 속성들을 자식 클래스에서 고려

equals 메소드 오버라이딩

  • 프로그래밍 시 동일한 객체가 메모리 상에 여러 개 띄워져 있는 경우가 존재함

    • 해당 객체가 서로 다른 메모리에 띄워져있을 경우 동일한(Identity) 객체가 아님

  • 하지만 프로그래밍 상으로 같은 값을 지님으로 같은 객체로 인식되도록 처리하고 싶은 상황이 존재할 수 있음

    • 이런 동등성(Identity)을 위해, 값으로 객체를 비교하도록 equals 매소드 오버라이딩을 진행함

  • EX) 동일한 값을 갖는 문자열 2개에 대한 equals() 호출

    • 두 문자열은 서로 다른 메모리에 할당되어 동일하지 않으나, 같은 값을 가져 동등함

    • String 클래스에서 equals매소드 오버라이드 진행

      • 객체가 같은 값을 갖는지 동등성(Equality)을 비교하도록 처리

    • 동일성을 비교하는 equals 메소드 호출 시 true 반환

Hash code

native 키워드 : 메소드가 JNI라는 native code를 이용해 구현되어 있음을 의미하며, OS에 C언어로 작성되어있어 그 안의 내용은 볼 수 없고 사용만 가능하다. hashCode()는 native 코드 중 하나이다.

public native int hashCode();
  • 개념

    • 객체의 주소 값을 이용해서 해싱(hashing) 기법을 통해 반환한 해시 코드로 객체를 식별하는 하나의 정수 값

  • 특징

    • java.lang.Object 클래스에 정의

    • 객체의 메모리 번지를 이용해 해시코드를 만들어 리턴하므로 객체마다 다른 값을 가짐

      • 주소값으로 만든 고유한 숫자값

  • 재정의 시, 고려사항

    • 객체 상태 기반 해시코드 생성

      • 객체의 필드들이 모두 hashCode에 반영되어야 함

      • 객체가 가지는 모든 중요한 정보 고려해야 함

    • 불변성

      • 객체의 상태가 변경되지 않으면 hashCode()의 결과도 변하지 않아야함

    • 충돌 최소화

      • 서로 다른 객체가 동일한 해시값을 갖지 않도록 충돌을 최소화하는 해시함수 선택

equals와 hashCode

자바 규칙 equals()의 결과가 true인 두 객체의 해시코드는 반드시 같아야 한다.

  • Hash값을 사용하는 Collection 객체의 논리적 비교

    1. HashCode() 리턴 값 비교

      • 리턴 값 다름 → 다른 객체

      • 리턴 값 같음 → equals()

    2. equals() 리턴 값 비교

      • 리턴 값 다름 → 다른 객체

      • 리턴 값 같음 → 동등 객체

Hash값을 재정의 하지 않을 경우

  • hash값을 사용하는 Collection Framework(HashSet, HashMap, HashTable)에서 객체 비교를 진행함

  • 이때 hashCode 메서드를 재정의 하지 않았으므로, HashCode() 리턴 값 비교 과정에서 Object 클래스의 hashCode 메서드를 사용함

    • 같은 객체여도 equals()로 비교하기 전에 서로 다른 hashcode 메서드의 값이 리턴되어 다른 객체로 판단 됨

  • 위와 같은 이유로 equals와 HashCode의 값을 같이 재정의 해야 함

identity HashCode 메소드

System.identityHashCode(p1);
  • 개념

    • hashCode()를 오버라이딩 해서 쓰되, 오버라이딩 하기 전의 원조 기능이 필요할 때 사용 하는 메서드

  • 배경

    • HashCode의 본래 목적은 객체의 주소값을 기반으로 해싱한 고유 숫자 값을 바탕으로 객체가 동등한지 여부를 판단하는 것

    • 하지만 equals()와 hashCode() 메서드를 오버라이딩할 경우, 본래 목적인 객체 자체의 해시코드를 얻을 수 없음

    • 따라서 자바에서는 똑같이 해시 코드를 반환해주는 identityHashCode() 코드를 만들게 되었음

PreviousWrapper ClassNextfinal

Last updated 1 year ago