ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 객체타입 Set
    Programming/Java 2020. 9. 10. 01:06

    객체 타입 Set

    객체 타입을 Set에 추가할 경우 같은 속성값을 가지고 있는 객체이더라도 다른 객체로 인식한다.

    그 이유는 객체를 비교하여 Set에 추가할 때 객체의 속성으로 비교하는 것이 아니라 객체의 주소값을 기준으로 비교하기 때문에 다음 객체들은 각각 다른 객체로 인식되어 Set에 중복으로 저장되는 것이다.

     

    예제 1

    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
     
    import java.util.HashSet;
    import java.util.Set;
     
    public class Main {
     
        static class Person {
            private String name;
            private int age;
     
            public Person(String name, int age) {
                this.name = name;
                this.age = age;
            }
        }
     
        public static void main(String[] args) throws IOException {
            Person p1 = new Person("홍길동"20);
            Person p2 = new Person("홍길동"20);
            
            Set<Person> set = new HashSet<>();
            set.add(p1);
            set.add(p2);
            
            for(Person p : set) {
                System.out.println(p.name + " " + p.age);
            }
        }
    }
     
    cs

     

    실행 결과

    따라서 객체 타입 List를 정렬하기 위해 Comparable 인터페이스를 구현하고 compareTo()를 오버라이딩하듯이
    객체 타입 Set을 사용하기 위해서는 직접 정의한 객체에 대해 두 가지 함수를 구현해야한다.

     

    1. hashCode()

    원래는 객체를 비교할때 객체가 저장된 주소값을 비교하게 되는데 이를 문자열 형태로 변환하여 비교한다.

    예를들어 Person p1의 주소 = 111, Person p2의 주소 = 222 일때, 각각 "111"과 "222"로 변환하고 여기에 hashCode 메서드를 통해 해쉬코드값으로 변환시켜준다.

    2. equals(Object obj)

    이 원리를 통해 주소값으로 객체를 비교하도록 만들지 않고, 클래스 내의 멤버변수 값을 비교하도록 name과 age의 데이터를 문자열 결합(+)을 통해 "홍길동10".hashCode() 메서드를 통해 해쉬코드값을 비교하게 만들도록 구조를 바꾸는 것이다.

     

    예제 2

    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
    class Person{
        private String name;
        private int age;
        
        public Person(String name, int age) {
            this.name=name;
            this.age=age;
        }
        
        @Override
        public int hashCode() {
            return (this.name+this.age).hashCode();
        }
        
        @Override
        public boolean equals(Object obj) {
            //p1.equals(p2)
            if(obj instanceof Person) {
                Person p = (Person)obj;
                return this.hashCode()==p.hashCode(); 
                
            }
            return false;
        }
    }
     
    cs

     

     

     

     

     

     

    참고 자료

    sas-study.tistory.com/87

    'Programming > Java' 카테고리의 다른 글

    [Java] Java 컴파일 & 실행 과정  (0) 2020.09.16
    [Java] Compile time vs Run time  (0) 2020.09.15
    [Java] StringBuilder class 함수  (0) 2020.07.03
    [Java] Collection  (0) 2020.03.31
    [Java] 토막글  (0) 2020.03.11

    댓글

Designed by Tistory.