-
[Java] 객체타입 SetProgramming/Java 2020. 9. 10. 01:06
객체 타입 Set
객체 타입을 Set에 추가할 경우 같은 속성값을 가지고 있는 객체이더라도 다른 객체로 인식한다.
그 이유는 객체를 비교하여 Set에 추가할 때 객체의 속성으로 비교하는 것이 아니라 객체의 주소값을 기준으로 비교하기 때문에 다음 객체들은 각각 다른 객체로 인식되어 Set에 중복으로 저장되는 것이다.
예제 1
123456789101112131415161718192021222324252627282930import 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
1234567891011121314151617181920212223242526class Person{private String name;private int age;public Person(String name, int age) {this.name=name;this.age=age;}@Overridepublic int hashCode() {return (this.name+this.age).hashCode();}@Overridepublic boolean equals(Object obj) {//p1.equals(p2)if(obj instanceof Person) {Person p = (Person)obj;return this.hashCode()==p.hashCode();}return false;}}cs 참고 자료
'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