- 사전 형태로, 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를 배운다는 것은 내가 어떤 작업을 하는 데에 어떤 객체가 필요한지 알고,
그 객체의 참조값을 어떻게 얻어내는지를 배우는 것!
'국비교육(22-23)' 카테고리의 다른 글
19일차(3)/java(24) : Exception (0) | 2022.11.01 |
---|---|
19일차(2)/java(23) : UtilClass (HashSet, Iterator) / While문 (0) | 2022.11.01 |
[참고] 이클립스 2개로 git 저장소 clone 연습 (0) | 2022.11.01 |
18일차(3)/java(22) : Util Class (ArrayList, HashMap) (0) | 2022.10.31 |
18일차(2)/java(21) : Generic Class (0) | 2022.10.31 |