고급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("---------------------------------------------");
}
Author And Source
이 문제에 관하여(고급JAVA 4강 - equals(), hashCode(), Map), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gksmf6699/고급JAVA-4강-equals-hashCode-Map저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)