국비교육(22-23)

19일차(1)/java 퀴즈 : HashMap 활용 예제

서리/Seori 2022. 11. 1. 14:06

 

- 사전 형태로, key 값을 검색하면 value 값(의미)를 출력해주는 클래스 만들기

 

 

<내가 작성한 코드>

package test.main;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class QuizMain {
	public static void main(String[] args) {
		//sample 데이터
		Map<String, String> dic=new HashMap<>();
		dic.put("house", "집");
		dic.put("phone", "전화기");
		dic.put("car", "자동차");
		dic.put("pencil", "연필");
		dic.put("eraser", "지우개");	
		
		/*
		 * (콘솔창에 아래와 같이 출력되도록 하기)
		 * 겁색할 단어를 입력하세요: house
		 * house 의 뜻은 집입니다.
		 * 
		 * 검색할 단어를 입력하세요: abc
		 * abc는 목록에 없습니다.
		 */
		
		Scanner scan=new Scanner(System.in);
		System.out.print("겁색할 단어를 입력하세요: ");
		String str=scan.nextLine();
		
		boolean isTrue=dic.containsKey(str);
		if (isTrue) {
			System.out.println(str+"의 뜻은 "+dic.get(str)+"입니다.");
		} else {
			System.out.println(str+"은(는) 목록에 없습니다.");
		}
	}
}

 


 

 

1번)

package test.main;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class QuizMain2 {
	public static void main(String[] args) {
		//sample 데이터
		Map<String, String> dic=new HashMap<>();
		dic.put("house", "집");
		dic.put("phone", "전화기");
		dic.put("car", "자동차");
		dic.put("pencil", "연필");
		dic.put("eraser", "지우개");	
		
		/*
		 * (콘솔창에 아래와 같이 출력되도록 하기)
		 * 겁색할 단어를 입력하세요: house
		 * house 의 뜻은 집입니다.
		 * 
		 * 검색할 단어를 입력하세요: abc
		 * abc는 목록에 없습니다.
		 */				
		Scanner scan=new Scanner(System.in);
		System.out.print("겁색할 단어를 입력하세요: ");
		String word=scan.nextLine();
		//입력받은 단어를 Map의 key값으로 활용해서 value값을 읽어와 본다.
		//해당 key값으로 저장된 value가 없을수도 있다...
		String mean=dic.get(word);		
		if(mean == null) {//만일 찾는 단어가 없으면
			System.out.println(word+"는 목록에 없습니다.");
		}else {//찾는 단어가 있으면
			System.out.println(word+"의 뜻은 "+mean+"입니다.");
		}		
	}
}

 

 

 

- 사용할 Scanner객체의 다양한 생성자중에 InputStream을 사용할 것이다.

- 생성자의 인자에다가 System.in을 넣을 것인데, 이것이 InputStream 타입으로 받아질 것이다.

- system.in은 키보드와 연결된 InputStream 이다!

 

String line=scan.nextLine();

- nextLine이란 한줄을 읽어들이는 것.

 inputStream하는 출처는 키보드일수도 있고, file일수도 있고 network일 수도 있다

 

 

- get 메소드는 object 값으로 받아서 string 타입으로 리턴해준다.

- object key=word 를 넣어 사용할 수 있다.

 

- 입력한 값이 dic 안에 없으면 무엇을 리턴할까?

→ 참조값을 리턴하는 메소드는 (리턴할 것이 없으면) null 을 리턴한다.

(어떤 메소드는 정수값(int)을 리턴하는데, 이 경우 -1이 많다.)

 

- 이 경우 console창에 null 이 출력된다.

 

- 양자택일하는 작업의 경우 if~else 문 사용!

- if(mean==null) 형태로 찾는 단어가 없는 경우를 배제하고, 있는 경우에는 else에서 의미를 출력해주기.

 


 

2번)

package test.main;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class QuizMain3 {
	public static void main(String[] args) {
		//sample 데이터
		Map<String, String> dic=new HashMap<>();
		dic.put("house", "집");
		dic.put("phone", "전화기");
		dic.put("car", "자동차");
		dic.put("pencil", "연필");
		dic.put("eraser", "지우개");	
		
		/*
		 * (콘솔창에 아래와 같이 출력되도록 하기)
		 * 겁색할 단어를 입력하세요: house
		 * house 의 뜻은 집입니다.
		 * 
		 * 검색할 단어를 입력하세요: abc
		 * abc는 목록에 없습니다.
		 */				
		Scanner scan=new Scanner(System.in);
		System.out.print("겁색할 단어를 입력하세요: ");
		String word=scan.nextLine();
		//입력받은 단어를 Map의 key값으로 활용해서 value값을 읽어와 본다.
		//해당 key값으로 저장된 value가 없을수도 있다...
				
		//해당 키값이 존재하는지 여부를 알아낸다.
		boolean isExist=dic.containsKey(word);
		
		if(!isExist) {//만일 찾는 단어가 있으면
			System.out.println(word+"는 목록에 없습니다.");
		} else {//찾는 단어가 없으면
			String mean=dic.get(word);
			System.out.println(word+"의 뜻은 "+mean+"입니다.");
		}		
	}
}

 

 

.containsKey : 해당 key가 포함되어 있는지를 판별하고 true/false를 리턴하는 메소드 (불리언타입 리턴)

.containsValue : 해당 value가 있는지 없는지를 판별하고 true/false를 리턴하는 메소드
- 이런 객체의 설명문 해석에 익숙해지면 처음보는 메소드도 사용할 수 있을 것!

 

- boolean 타입의 객체이름은 isExist, canRun, 등등 문장형?으로 작성하기.
- if(isExist) {} 형태로 if 문 안에 들어갔을 때 읽기가 편하다.

String mean=dic.get(word); 
- mean 을 대입한 변수가 이번에는 else문 안에 들어간다.

 

- if문() 안에 작성하는법: 두가지는 같은 표현! 편한 쪽으로 사용하기.

!isExist

isExist == false

 


 

3번) 무한반복while, 종료break 코드 추가

package test.main;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class QuizMain3 {
	public static void main(String[] args) {
		//sample 데이터
		Map<String, String> dic=new HashMap<>();
		dic.put("house", "집");
		dic.put("phone", "전화기");
		dic.put("car", "자동차");
		dic.put("pencil", "연필");
		dic.put("eraser", "지우개");	
		
		/*
		 * (콘솔창에 아래와 같이 출력되도록 하기)
		 * 겁색할 단어를 입력하세요: house
		 * house 의 뜻은 집입니다.
		 * 
		 * 검색할 단어를 입력하세요: abc
		 * abc는 목록에 없습니다.
		 */				
		Scanner scan=new Scanner(System.in);
		
		while(true) {
			System.out.print("겁색할 단어를 입력하세요(종료=>q): ");
			String word=scan.nextLine();
			//입력받은 단어를 Map의 key값으로 활용해서 value값을 읽어와 본다.
			//해당 key값으로 저장된 value가 없을수도 있다...
			if(word.equals("q")){
				break;
			} 
			//해당 키값이 존재하는지 여부를 알아낸다.
			boolean isExist=dic.containsKey(word);
			
			if(!isExist) {//만일 찾는 단어가 있으면
				System.out.println(word+"는 목록에 없습니다.");
			} else {//찾는 단어가 없으면
				String mean=dic.get(word);
				System.out.println(word+"의 뜻은 "+mean+"입니다.");
			}
		}
	}
}

 

- Scanner 객체는 한번만 만들어서 그냥 계속 쓴다.(new 1개)

 아래 코드 전체를 while문 안쪽으로 옮겨온다

 

- 원래 빠른 속도로 무한히 반복하지만, 입력하고 엔터를 치는 지점에서 1줄을 입력받기 위해 블록되어 멈춰 있다.

- \r\n 개행기호 입력 지점을 1줄로 인식한다.

 

 

** 무한반복문을 q를 입력하면 종료되도록 하고 싶다면? 

if(word=="q"){ 
	break; 
}

- 위와 같이 입력하면 작동하지 않는다.

- .equals 를 사용해서 같은지 비교해야 한다.

 

 

- object(여기서는 string) 타입을 매개변수로 하여 boolean 타입을 리턴하는 함수

 

if(word.equals("q")){
	break;
}

- 위와 같이 입력해주면 word에서 입력받는 값이 q와 일치하는지 확인해서 boolean타입을 리턴해주는 식이 된다. 

- break는 가장 인접한 반복문 한 블럭을 빠져나오는 것.

 

참고) return과 break의 차이

- return메소드를 종료시키는 예약어이다. 아예 전체 메소드를 종료한다.

- break 가장 인접한 반복문을 빠져나오는 예약어이다.

- 사실 위 예제에서는 while 문 아래에 달리 실행할 코드가 존재하지 않으므로 무엇을 쓰든 상관없다ㅎㅎ

 


 

[ 기본 data type을 == 연산자로 비교하는 경우 /
참조 data type을 == 연산자로 비교하는 경우 ]

int num1=10;
int num2=20;
boolean result1= num1==num2;  → true. 변수안에 있는 실제 값(숫자 10)을 비교하는 것.

Car c1=new car();
Car c2=new car();
boolean result2= c1 == c2;    변수안에 있는 참조값(사물함 key)을 비교하는 것이라서 false이다.

(new를 두번 했으니까 각각의 참조값은 당연히 다르다.)

String name1="kim";
String name2="kim";
String name3=new String("kim");   (정석적인 java의 객체 생성 방법)

- 변수에 값을 바로 대입해주는 것과 new로 객체를 생성해서 대입해주는 것

 

boolean result3= name1 == name2;   true

boolean result4= name1 == name3;   false

- 두가지의 실제 값(사물함 안의 물건)은 같지만 참조값(사물함 key)이 다를 수 있다.


  문자열을 만드는 방법에 따라서, 내용이 같더라도 참조값이 다를 수 있다.

 

 

** java에서는 문자열 객체를 만드는 방법에 따라서 
내용이 같으면 참조값이 같을 수도 있고, 내용은 같지만 참조값이 다를 수도 있다.

따라서 == 나 != 연산자로 문자열의 내용이 같은지 비교하면 안 된다!!

문자열은 동등비교연산자로 비교하면 안 된다.

ex) 어떤 메소드가 문자열을 리턴한다고 하면, 그 메소드 안에서 문자열을 어떻게 만들었는지는 알 수 없다.
 따라서 그 메소드가 만들어준 문자열과 우리가 직접 넣어준 문자열을 같다고 비교하는 것은 위험할 수 있다.


문자열의 참조값이 같은지 비교할 일이 많을까,
아니면 문자열의 내용이 같은지 비교할 일이 많을까? 당연히 내용 쪽이 많다.

그러면 어떻게 비교를 해야 하는가?
★String객체의 .equals( ) 메소드를 활용해야 한다. (내용이 같은지를 비교하는 메소드)

 


 

- java를 배운다는 것은 내가 어떤 작업을 하는 데에 어떤 객체가 필요한지 알고, 

 그 객체의 참조값을 어떻게 얻어내는지를 배우는 것!