hashCode()를 사용한 예제 모음

Jane·2023년 2월 21일
0

IT 수업 정리

목록 보기
48/124

1. 사람의 이름과 나이를 관리하는 HashSet

1-1. Person 객체 생성

import java.util.*;

class Person{
	private String name;
	private int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
}

class JavaPractice {

	public static void main(String[] args) {
		HashSet<Person> hSet = new HashSet<Person>();
		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("PARK", 35));
		hSet.add(new Person("PARK", 35));

		System.out.println("저장된 데이터 수: " + hSet.size());
		System.out.println(hSet);

	}

}

[Console]
저장된 데이터 수: 4
[Person@762efe5d, Person@5d22bbb7, Person@41a4555e, Person@4926097b]

1-2. Override로 내용 바꾸기

클래스 안에 toString() 추가

@Override
	public String toString() {
		return (name + ", " + age + "살입니다.");
}

[Console]
저장된 데이터 수: 4
[LEE, 10살입니다., PARK, 35살입니다., PARK, 35살입니다., LEE, 10살입니다.]


클래스 안에 hashCode(), equals(Object 매개변수) 추가

@Override
	public int hashCode() {
		return age;
	}

	@Override
	public boolean equals(Object p) {
		if (((this.name).equals((Person) p).name) && (this.age == ((Person) p).age)) {
			return true;
		} else
			return false;
	}

[Console]
저장된 데이터 수: 2
[LEE, 10살입니다., PARK, 35살입니다.]

  • String이 같은지 비교할 때는 == 말고 equals를 쓰도록 한다.

1-3. instanceof를 이용한 equals(Object obj)

@Override
	public boolean equals(Object obj) {
		if(obj instanceof Person) {
			Person p = (Person)obj;
			if((this.age == p.age) && (this.name.equals(p.name))){
				return true;
			}
		}
		return false;
	}

2. Num의 인스턴스 비교

2-1. Num 객체 생성

import java.util.*;

class Num{
	private int num;
	
	public Num(int num) {
		this.num = num;
	}
}

public class JavaTest extends Object {
	public static void main(String[] args) {
		HashSet<Num> set = new HashSet<>();
        set.add(new Num(7799));
        set.add(new Num(9955));
        set.add(new Num(7799));

        System.out.println("인스턴스 수: " + set.size());

        for(Num n : set)
            System.out.print(n.toString() + '\t');

        System.out.println();
	}
}

[Console]
인스턴스 수: 3
Num@762efe5d Num@5d22bbb7 Num@4926097b

2-2. Overriding 추가

import java.util.*;

class Num {
	private int num;

	public Num(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return ("" + num);
		/*
		 int를 String으로 강제 형 변환이 되지 않으므로,
         강제로 문자열을 삽입하여 String으로 출력할 수 있도록 한다.
		 */
	}

	@Override
	public int hashCode() {
		return num % 3;
	} // 임의로 지정해준다

	@Override
	public boolean equals(Object o) {
		if (this.num == ((Num) o).num) {
			return true;
		} else
			return false;
	}
}

public class JavaTest extends Object {
	public static void main(String[] args) {
		HashSet<Num> set = new HashSet<>();
		set.add(new Num(7799));
		set.add(new Num(9955));
		set.add(new Num(7799));

		System.out.println("인스턴스 수: " + set.size());

		for (Num n : set)
			System.out.print(n.toString() + '\t');

		System.out.println();
	}
}

[Console]
인스턴스 수: 2
9955 7799

3. HashSet을 이용하여 로또 생성하기

3-1. 랜덤 수 6개 생성하기 (범위 : 1~45)

import java.util.*;

class JavaPractice {

	public static void main(String[] args) {
		HashSet<Integer> lotto = new HashSet<Integer>();
        
		// 처음 크기는 0이며, 개수는 6개만 받아오면 된다.
		while (lotto.size() < 6) {
			int random = (int) (Math.random() * 45) + 1;
			lotto.add(random);
            /*
            랜덤 숫자를 set에 추가한다.
            중복된 요소는 추가되어도 바로 새 요소로 교체되므로,
            중복 제거를 거치지 않아도 된다.
            */
		}

		for (int num : lotto) {
			System.out.print(num + " ");
		}

	}

}

3-2. class로 분류한 코드

import java.util.*;

class Lotto {
	HashSet<Integer> lotto;

	public Lotto() {
		lotto = new HashSet<Integer>();
	}

	public void generateLotto() {
		while (lotto.size() < 6) {
			int random = (int) (Math.random() * 45) + 1;
			lotto.add(random);
		}
	}

	public void showLotto() {
		for (int num : lotto) {
			System.out.print(num + " ");
		}

	}

}

class JavaPractice {

	public static void main(String[] args) {
		Lotto a = new Lotto();
		a.generateLotto();
		a.showLotto();
	}

}
  • HashSet만으로는 정렬이 되지 않는다.
    ArrayList에 내용을 복사한다거나, 여러 가지 작업을 거쳐야 정렬이 가능하다.
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글