ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 이름 목록에서 검색한 성을 가진 사람을 출력하는 프로그램(ArrayList)
    취미/코딩 2023. 9. 21. 07:00


    시작
    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를 잘 사용하고 있지만, 정말 대단하다는 생각 밖에 들지 않는다. 좀 더 유용하게 사용해 보자.

Designed by Tistory.