고급JAVA 4강 - equals(), hashCode(), Map

로또 프로그램

public class Lotto {

public static int count = 1;
Scanner sc = new Scanner(System.in);

//메인메서드
public static void main(String[] args) {
	
	Lotto lotto = new Lotto();
	lotto.startLotto();
}


//프로그램 실행 메서드
void startLotto() {
	
	while(true) {
		
	System.out.println("============================");
	System.out.println("       Lotto 프로그램");
	System.out.println("----------------------------");
	System.out.println("1. Lotto 구입");
	System.out.println("2. 프로그램 종료");
	System.out.println("============================");
	System.out.print("메뉴 선택 : ");
	int input = sc.nextInt();

	switch(input) {
	case 1: buyLotto();break; 
	case 2:	
	System.out.println("감사합니다.");
	System.exit(0);

	}
	}

}

//로또 구매금액 입력, 구매금액만큼 출력하는 메서드
//(단, 로또 한장의 금액은 1000원이며 최대 100장까지만 구입할 수 있고, 거스름돈도 계산하여 출력한다.)
private void buyLotto() {
		
	System.out.println("Lotto 구입 시작");
	System.out.println("(1000원에 로또번호 하나입니다.)");
	System.out.println("금액입력>");
	int input = sc.nextInt();
	
	if(input < 1000) {
		System.out.println("입력 금액이 너무 적습니다. 로또번호 구입 실패!!!");
		return;
	}
	
	if(input > 100000) {
		System.out.println("입력 금액이 너무 많습니다. 로또번호 구입 실패!!!");
		return;
	}
	
	int change = input % 1000;
	
	System.out.println("받은 금액은 " + input + "원이고 거스름돈은 " + change + "원 입니다.");
	System.out.println("행운의 로또번호는 아래와 같습니다.");
	while(input >= 1000) {
		getLotto();
		input -= 1000;
	}
	count = 1;
}


//로또번호 나오는 메서드
private void getLotto() {
	HashSet<Integer> lottoSet = new HashSet<>();
	while(lottoSet.size() < 6) {
		lottoSet.add((int)(Math.random() * 45 + 1));
	}
	
	System.out.println("로또번호" + count + " : " + lottoSet);
	
	count++;
}
}

equals()와 hashCode()

  • equals() 메서드 => 두 객체의 내용이 같은지 검사하는 연산자
  • hashCode() 메서드 => 두 객체의 동일성을 검사하는 연산자 //완전히 똑같은 객체인지
  • HashSet, Hashtable, HashMap과 같이 Hash로 시작하는 컬렉션 객체들은 객체의 의미상의 동일성을 비교하기 위해서 hashCode()에서 hashCode() 메서드를 호출하여 비교한다.
    그러므로, 객체가 같은지 여부를 결정하려면 hashCode()메서드를 재정의 해야 한다.
  • hashCode() 메서드에서 사용하는 '해싱 알고리즘'은 서로 다른 객체들에 대해서 같은 hashcode가 발생할 수 있다.

getClass() => 클래스 유형을 알게해주는 메서드
new 예약어를 사용하면 객체는 hip영역에 생성됨

객체변수면 참조값을 비교하는 것

비교할 때 조심!
객체 내의 참조값을 비교하는 것인가, 일반값을 비교하는 것인지 잘 확인하기
값이 같으면 Hashcode도 같게 하도록 재정의해야 함.

ctrl + shift + s =>에서 hashCode()와 equals()를 오버라이딩 할 수 있다.

equals() 오버라이딩

    @Override
    public boolean equals(Object obj) {
        if(obj == null) return false; //obj가 null이면 비교하지 않아도 false
	
	//같은 유형의 클래스인지 검사
	if(this.getClass() != obj.getClass()) return false; 
	
	//참조값이 같은지 검사
	if(this==obj) return true; 
	
	//매개변수에 저장된 객체를 현재 객체 유형으로 형변환한다.
	Person that = (Person)obj;
	
	if(this.name==null && that.name != null) return false; //null인지 아닌지 비교한 후 equals 사용
	
	if(this.id==that.id && this.name==that.name) return true; //주소값이 같은지
	
	if(this.id==that.id && this.name.equals(that.name)) return true; //객체의 이름이 같은지
	
	return false;
    
    

Map

Map ==> key값과 value값을 한 쌍으로 관리하는 객체
- key값은 중복을 허용하지 않고 순서가 없다.(Set의 특징을 갖는다.)
- value값은 중복을 허용한다.

HashMap<String, String> map = new HashMap<>(); // Map은 제네릭도 2개를 써야 한다.
	
  • 자료 추가 ==> put(key값, value값)
    		map.put("name", "홍길동");
    		map.put("addr", "대전");
    		map.put("tel", "010-1234-5678");
    	
    		System.out.println("map => " + map);
    	
  • 자료 수정 => 데이터를 추가할 때 'key값'이 같으면 나중에 입력한 값이 저장된다.
    		map.put("addr", "서울");
    		System.out.println("map => " + map);
    	
  • 자료 삭제
    remove(key값) : 'key값'이 같은 자료를 찾아서 삭제한다.
    ==> 반환값 : 삭제된 자료의 value값

    //		String removeTel = map.remove("tel");
    //		System.out.println("map => " + map);
    //		System.out.println("삭제된 value 값 : " + removeTel);
    //		System.out.println();
  • 자료 읽기
    get(key값) : 'key값'과 짝이되는 value값을 반환한다.

    	System.out.println("이름 : " + map.get("name"));
    	System.out.println();
    	
  • key값이 존재하는지 여부를 나타내는 메서드
    containsKey(key값) : 해당 'key값'이 존재하면 true, 그렇지 않으면 false를 반환한다.

    	System.out.println("tel 키값의 존재 여부 : " + map.containsKey("tel"));
    	System.out.println("age 키값의 존재 여부 : " + map.containsKey("age"));
    	System.out.println();
    	
  • Map에 저장된 모든 데이터를 읽어오는 방법

방법1) 모든 key값을 읽어와서 처리하기 //Iterator이용
keySet()메서드 사용하기
==> Map의 모든 key값들을 읽어와 Set형으로 반환한다.

	Set<String> keySet = map.keySet();
	Iterator<String> it = keySet.iterator();
	while(it.hasNext()) {
		String key = it.next(); // key값 1개 읽어오기
		String value = map.get(key);
		System.out.println(key + " : " + value);
	}
	System.out.println("---------------------------------------------");
	

방법2) 방법1의 처리를 향상된 for문을 처리하기

	for(String key : map.keySet()) {
		String value = map.get(key);
		System.out.println(key + " => " + value);
	}
	System.out.println("---------------------------------------------");
	

방법3) value값만 읽어와 처리하기 //value값은 중복이 될 수 있어서 value값을 안다고 해서
key값을 알 수는 없음.
values()메서드를 이용한다.

	for(String value : map.values()) {
		System.out.println(value);
	}
	System.out.println("---------------------------------------------");
	
	
	
}

좋은 웹페이지 즐겨찾기