시작 ArrayList를 연습해보려고 한다. 이번에도 bing에 ArrayList에 대한 질문을 했다. 이번에도 제목만 보고 일단 나 혼자 만들어보려고 한다.
구상 - (a) 입력을 5번 받아서 arrayList에 넣는다(Scanner, arrayList) - 5개를 입력하고 나면 arrayList 속의 데이터를 한 번 더 보여준다 - 진행할 지 다시 입력할지 물어본다(y/n -> a로 돌아감) - 어떤 성을 가진 사람을 찾을 것인지 물어본다(Scannner). 성은 한 글자만 하자. 두 글자도 글자수를 카운트하거나 해서 할 수 있을 것 같은데 지금은 한 글자도 버거울 것 같다. - 입력받은 값과 각 이름의 첫 번째 글자를 비교해서 같은 걸 출력한다 -> 이 부분이 감이 안잡힌다. - 출력한다 or 없다고 알려준다. - 한 번 더 할 건지 물어본다 (y/n -> a로 돌아감)
구체화 - (a) ArrayList를 만든다. 제너릭은 String으로. - 반복문을 열고, 5번 반복하도록 만들어 놓자. - 실행문에는 스캐너를 켜고 > 이름을 받고 > ArrayList에 넣자. - 5번이 끝나면 ArrayList속의 데이터를 출력하여 보여주자. - 맞는지 물어보고 진행여부를 확인하자. 여기서 'n'을 입력하면 (a)로 돌아가서 ArrayList를 초기화할 수 있도록 만들자. -> 이 부분 구조를 다시 생각해 봐야 할 듯. - 스캐너 켜서 찾고자 하는 성을 입력하도록 하자. - 입력한 글자와 각 ArrayList의 첫 글자를 비교하자. -> 이거 찾아봐야 함 - 일치하는 것 출력 - 다시 할지 물어보고 y면 (a)로 돌아간다. -> 구조 생각해 보기
1차 작성
import java.util.Scanner;
import java.util.arrayList;
public class searchName(){
public static void main(String[] agrs){
boolean ir = true;
// 전체 프로그램 반복을 위한 while문
while(ir){
//ArrayList를 쓰면 5개 제한을 할 필요가 없다. 완료라고 입력할 때까지 반복.
//이름을 받기 위한 ArrayList만들기
ArrayList<String> inputList = new ArrayList<String>();
//이름을 입력하거나 '완료'를 입력
Scanner sc1 = new Scanner(System.in);
System.out.println("리스트에 추가할 이름을 입력하시오. 이름 입력을 완료하였다면 \n 완료 \n 라고 입력하십시오.");
String inputName = sc1.next();
while (inputName != "완료"){
inputList.add(inputName);
System.out.println("리스트에 추가할 이름을 입력하시오. 이름 입력을 완료하였다면 \n 완료 \n 라고 입력하십시오.");
inputName = sc1.next();
}
sc1.close()
System.out.println("입력을 종료합니다.")
//검색하고자 하는 성 입력하는 단계
Scanner sc2 = new Scanner(System.in);
System.out.println("찾고자하는 성을 입력하여 주십시오\n(1글자로 제한)");
lookingFirstName = sc2.next();
//Char charAt(int index) : String 문자열에서 index 번째 문자 값 1개를 가져온다. 이걸 쓰면 할 수 있을 것 같은데?
// 기존의 inputList를 이용하여 각 성의 첫 글자로 만든 firstNameList를 만들자
ArrayList<String> firstNameList = new ArrayList<String>();
for(i=0; i < inputList.size(); i++){
firstNameList.add(inputList.get(i).charAt(0));
}
// 이름의 첫 글자와 찿고자 하는 성을 비교함
// true면 그 순서의 이름을 출력하고 false면 출력하지 않도록 만들기
for(i=0; i < firstNameList.size(); i++){
if(lookingFirstNmae == firstNameList.get(i)){
System.out.println(inputList.get(i));
}
}
sc2.close();
// 반복실행 여부 물어보는 작은 while문
boolean a = true;
while(a){
Scanner sc3 = new Scanner(System.in);
System.out.println("프로그램을 재실행 하시겠습니까? \n Y/N");
repeatOrder = sc3.next();
if(repeatOrder == "N"){
ir = false;
a = false;
} else if (repeatOrder == "Y") {
ir = true;
System.out.println("프로그램을 재실행합니다.");
a = false;
} else {
System.out.println("Y 또는 N으로 답하여주십시오.");
}
}// 작은 while문 종료
} // 전체 프로그램 while문 종료
} // 메인 종료
}// 클래스종료
- 결과: java.util.NoSuchElementException 예외 발생
완성 프로그램
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
public static void main(String[] agrs){
boolean ir = true;
Scanner sc = new Scanner(System.in);
// 전체 프로그램 반복을 위한 while문
while(ir){
//이름을 받기 위한 ArrayList만들기
ArrayList<String> inputList = new ArrayList<String>();
//이름을 입력하거나 '완료'를 입력
System.out.println("리스트에 추가할 이름을 입력하시오. 이름 입력을 완료하였다면 '완료' 라고 입력하십시오.");
String inputName = sc.next();
boolean whileTest = true;
while (whileTest){
if(inputName.equals("완료")){
whileTest = false;
} else{
whileTest = true;
inputList.add(inputName);
System.out.println("-------------------------------------");
System.out.println("리스트에 추가할 이름을 입력하시오. 이름 입력을 완료하였다면 '완료' 라고 입력하십시오.");
System.out.println("현재 이름 명단");
for(int i = 0; i < inputList.size();i++){
System.out.println(inputList.get(i));
}
inputName = sc.next();
}
}
System.out.println("---------------입력을 종료합니다---------------");
//여기 부터는 찾고자 하는 성 입력하는 단계
System.out.println("찾고자하는 성을 입력하여 주십시오\n(1글자)");
String secondInput = sc.next();
String lookingFirstName = String.valueOf(secondInput.charAt(0));
//Char charAt(int index) : String 문자열에서 index 번째 문자 값 1개를 가져온다. 이걸 쓰면 할 수 있을 것 같은데?
// 기존의 inputList를 이용하여 각 성의 첫 글자로 만든 firstNameList를 만들자
ArrayList<String> firstNameList = new ArrayList<String>();
for(int i=0; i < inputList.size(); i++){
firstNameList.add(String.valueOf(inputList.get(i).charAt(0)));
}
// 이름의 첫 글자와 찿고자 하는 성을 비교함
// true면 그 순서의 이름을 출력하고 false면 출력하지 않도록 만들기
System.out.println("---------검색결과---------");
for(int i=0; i < firstNameList.size(); i++){
if(lookingFirstName.equals(firstNameList.get(i))){
System.out.println(inputList.get(i));
}
}
// 프로그램 반복여부 물어보는 작은 while문
boolean a = true;
while(a){
System.out.println("-------------------------------------");
System.out.println("프로그램을 재실행 하시겠습니까? \n Y/N");
String repeatOrder = sc.next();
if(repeatOrder.equals("N")){
ir = false;
a = false;
} else if (repeatOrder.equals("Y")) {
ir = true;
System.out.println("-------------------------------------");
System.out.println("************프로그램을 재실행합니다************");
a = false;
} else {
System.out.println("-------------------------------------");
System.out.println("Y 또는 N으로 답하여주십시오.");
}
}// 프로그램 반복여부 물어보는 작은 while문
} // 전체 프로그램 while문 종료
System.out.println("프로그램을 종료합니다.");
sc.close();
} // 메인 종료
}// 클래스종료
수정한 부분 - Scanner 하나를 켜고 입력 값을 한 뒤 close 하고 다시 켜는 방식으로 처음 코딩을 했다. 스캐너는 하나의 값 밖에 저장하지 못하므로 켰다 껐다 할 필요가 없었다. 그런데 이 과정에서 'java.util.NoSuchElementException' 예외가 발생하였다. 이 예외에 대해서는 다시 한번 공부해봐야 할 것 같다. - If 조건문 안에서 `==` 로 작성한 부분을 `.equals()` 로 수정하였다.
참고 블로그 글의 코드 리뷰 - 사실, 중간에 내 마음대로 바꾼 부분이 많아서, 많은 부분이 달려졌다. 내 마음대로 개선하는 과정이 추가되었다. 그래도 저 사람은 어떤 방식으로 코드를 짰는지 한 번 보려고 한다. - startWith... 라는 메서드가 있었구나...ㅎㅎㅎㅎ 세상에나... ArrayList의 메서드를 다시 한번 봐야겠다.
피드백 - 이번에는 정말 실험적(== 내 마음대로)으로 짠 코드가 많았다. 아마도 전문가들이 보기에는 정말 말도 안 되게, 굳이 굳이 어려운 길로 가는 코드들이 있었을 것이다. 내 생각에 아래와 같은 코드들은 더 쉽게 가는 방법이 있을 것 같다.
String lookingFirstName = String.valueOf(secondInput.charAt(0));
-----------------------------------------------------------------
ArrayList<String> firstNameList = new ArrayList<String>();
for(int i=0; i < inputList.size(); i++){
firstNameList.add(String.valueOf(inputList.get(i).charAt(0)));
}
한 글자를 뽑고 싶어서 charAt을 썼는데, 이건 또 String 이 아니니까 다시 valueOf를 써준다...? 이건 너무 이상하다. 일단 이게 될까? 제발 되기만 해라... 하면서 하기는 했지만 말이다. - 메서드에 대해서 조금 더 공부를 해야 할 것 같다. startWith 같은 메서드를 알았다면 저런 고생은 안 했을 텐데... - 컴파일러에 계속 돌리면서 수정했다. run -> 오류 발견 -> 수정 -> run -> 오류 발견 -> 수정 의 반복이었다. 위의 Scanner 관련 오류 말고는 내 손으로 잡았다는 것에 의의를 두는 게 맞을까. 이게 맞는 방법일까... - Scanner 오류는 결국, chatGPT의 도움을 받았다. 내 코드를 통으로 복사-붙여넣기 해서 예외가 뜬다고 하니, 이런 답을 주더이다.
chatGPT를 잘 사용하고 있지만, 정말 대단하다는 생각 밖에 들지 않는다. 좀 더 유용하게 사용해 보자.