카테고리 없음

UUID, 객체의 참조주소, 객체의 hashCode(+ equals()와 사용) 정의

네모메모 2023. 5. 25. 13:05
반응형

UUID, 객체의 참조주소, 그리고 hashCode

>> 각각 다른 개념이고, 서로 다른 용도로 사용됨

 

1. UUID (Universally Unique Identifier):

  • 범용 고유 식별자를 나타내는 값입니다.
  • 128비트 숫자로 구성되며, 일반적으로 무작위로 생성됩니다.
  • 고유성이 보장되기 때문에 동일한 UUID가 동시에 생성되는 일은 거의 없습니다.
  • 식별자로 사용되어 객체 또는 엔티티를 유일하게 식별하는 데 사용될 수 있습니다.

 

2. 객체의 참조주소

  • 객체의 참조주소는 해당 객체의 메모리상의 위치를 나타내는 값입니다.
  • 객체를 생성하면 해당 객체는 메모리에 할당되고, 참조변수를 통해 해당 객체의 주소를 참조할 수 있습니다.
  • 참조주소는 JVM 내에서 해당 객체를 식별하기 위해 사용됩니다.
  • 객체의 참조주소는 생성될 때마다 다르며, 같은 객체에 대해서는 항상 동일한 참조주소를 갖습니다.

 

3. 객체의 hashCode

  • 객체의 해시 코드를 나타내는 정수 값입니다.
  • hashCode는 객체의 속성이나 상태를 기반으로 생성되며, 일반적으로 유일한 값은 아닙니다.
  • 객체의 hashCode는 일반적으로 JVM의 해시 함수를 사용하여 계산됩니다.

  • 객체의 hashCode는 equals() 메서드와 함께 사용되어 객체의 동등성 비교에 사용될 수 있습니다.

hashCode()와 equals() 메서드는 객체의 동등성 비교에 사용됩니다.

  • hashCode() : 객체의 해시 코드를 반환함
  • equals() : 두 객체가 동등한지 비교함

[두 메서드를 함께 사용하는 이유]

  1. 해시 기반 컬렉션 사용
    Java에서 제공하는 많은 컬렉션 클래스(예: HashMap, HashSet)는 해시 기반으로 동작합니다.
    해시 기반 컬렉션은 객체의 해시 코드를 사용하여 빠른 데이터 검색과 비교를 수행합니다. 객체를 해시 기반 컬렉션에 저장하려면 객체의 hashCode() 메서드를 호출하여 해시 코드를 얻어야 합니다.

  2. 동등성 비교
    equals() 메서드는 두 객체가 동등한지 비교하는 데 사용됩니다. 동등성은 논리적으로 두 객체가 서로 같은 값을 나타내는지를 나타냅니다. equals() 메서드를 구현할 때, hashCode() 메서드를 함께 구현하는 것이 중요합니다. equals() 메서드로 동등성을 판단할 때, 두 객체가 같은 해시 코드를 갖는 경우에만 equals() 메서드를 호출합니다.
    이는 동일한 해시 코드를 갖는 객체끼리만 equals() 메서드를 호출하여 더 정확하고 효율적인 비교를 수행할 수 있습니다.

  3. 객체의 일관성
    hashCode() 메서드는 객체의 상태에 기반하여 고유한 정수 값을 생성합니다. 객체의 equals() 메서드가 두 객체를 동등하다고 판단한 경우, 두 객체의 hashCode() 값은 반드시 같아야 합니다. 이는 일관성을 유지하기 위해 필요한 규약입니다. 예를 들어, 동일한 객체를 해시 기반 컬렉션에 저장하거나 검색할 때 일관성을 유지하기 위해 hashCode()와 equals()가 일치해야 합니다.



hashCode 는 정수값인데 정수값을 정수범위를 넘어가면 어떻게 될까?

 

안드로이드에서 hashCode() 메서드는 int 형식의 정수 값이다. (int 범위 : -2,147,483,648 ~ 2,147,483,647)

  1. 오버플로우 발생
    hashCode()가 반환하는 값이 int 형식의 범위를 넘어설 경우, 정수 값의 오버플로우가 발생합니다. 이는 일반적으로 예상되지 않는 동작을 초래할 수 있습니다.
    ex) 해시 기반 컬렉션에 객체를 저장하거나 동등성 비교를 수행할 때 정확한 결과를 기대하기 어렵게 될 수 있습니다.

  2. 해시 충돌
    hashCode()는 객체의 속성이나 상태를 기반으로 계산되는 값이며, 동일한 값이 반환될 수 있는 가능성이 있습니다.
    이를 '해시 충돌'이라고 합니다.
    일반적으로 hashCode()는 객체의 고유성을 보장하지는 않지만, 동일한 객체에 대해서는 항상 같은 해시 코드를 반환해야 합니다.따라서 hashCode()가 반환하는 값의 범위를 넘어서더라도 객체의 동등성 비교에는 문제가 발생하지 않을 수 있습니다.

    '해시 충돌'이 발생하더라도 특정 data를 잘 찾을 수 있도록 Java에서는 Seperate Chaining을 채택한다.

안드로이드에서 hashCode() 값이 int 범위를 넘어서는 경우는 일반적으로 드물며, 대부분의 상황에서는 문제가 되지 않습니다. 하지만 hashCode()를 구현할 때에는 정확한 값의 범위를 고려하여 적절한 해시 알고리즘을 사용하는 것이 중요합니다. 또한, hashCode()의 반환 값이 객체의 동등성 비교에 영향을 미치기 때문에 equals() 메서드와 함께 정확하고 일관된 구현이 필요합니다.

 

 

 


 

<결론요약>

=> UUID : 전역적으로 고유한 식별자를 나타내는 값 
=> 객체의 참조주소 : 메모리상의 위치
=> 객체의 hashCode : 객체의 속성이나 상태를 기반으로 생성되는 정수 값


hashCode()와 equals() 메서드는?
 - 역할 : '객체의 동등성 비교와 해시 기반 컬렉션 사용에 필요한 메서드'로 ※ 반드시 함께 구현되어야 합니다.
 - 사용 : 이를 통해 객체의 일관성을 유지하고 정확한 동등성 비교를 수행할 수 있습니다.



 

반응형