개발/JAVA

[JAVA] 자바 객체배열을 사용한 전화번호 출력 프로그램2

윤_ve 2021. 3. 3. 00:28

최근에 만들어 보았던 전화번호 출력 프로그램을 끝까지 다 완성못시킨게 며칠동안 마음에 계속 걸렸다.

이번주 정처기 필기 시험인데 필기 공부해야하는데 자꾸 이 프로그램이 눈에 밟혀서 도저히 정처기가 눈에 들어오지 않았다. 그래서 결국 나머지 기능들을 구현해서 오류가 없는 완벽한(?있을수있나 싶지만) 프로그램을 완성했다.

 

우선 처음 구현했던 프로그램 ↓↓

2021/02/28 - [개발/JAVA] - [JAVA] 자바 객체배열을 사용한 전화번호 출력 프로그램

 

[JAVA] 자바 객체배열을 사용한 전화번호 출력 프로그램

오늘 만들어 볼 간단한 프로그램은, 이름과 전화번호를 입력하여 배열에 저장한 뒤 이름을 입력하면 전화번호가 출력되는 프로그램 입니당. ex) 인원수 >> 3명 이름,번호 >> 김김김 1 이름,번호 >>

yoon-ve.tistory.com

여기에서 내가 더 구현하고 싶었던 것은

첫번째, 전화번호가 중복되는 경우는 없으니 번호가 중복일 경우 다시 입력을 받는 로직

두번째, 이름이 중복됐을 경우 해당 이름의 번호를 모두 출력하는 로직

 

이렇게 두가지 기능을 구현하고 싶었다.

 

하지만,,, 아직 나의 자바 실력은 생각해낸 것을 바로 구현해내는 능력은 없었고... 그렇게 며칠을 끙끙앓다가

날잡고 아 오늘 구현해야겠다하고 몇 시간 씨름한 결과

두둥!! 구현에 성공했다!!!!!!!!!!!

(부끄럽다 이런거에 기뻐하는 나..)

 

어쨌든 마저 구현한 기능을 올리고 다시 완벽한 코드를 올려보겠다.

 

우선 위에 언급한

첫번째, 전화번호 중복 되는 경우 다시 입력받는 로직

보면 생각보다 간단했다. for문을 한번 더 돌려서 앞의 값과 비교를 해주기만 하면 되는 거였다.

이런 간단한걸 바로바로 떠올리지 못한 과거의 나는 뭘한건가....ㅠㅠ

 

두번째, 이름이 중복일 경우 모두 출력하는 로직

 

이 경우는 조금 고민했던게 이름을 입력받는 곳에서 처리를 해야할지 나중에 이름을 찾을때 처리를 해야할지 고민이였다. 결론적으로 이름을 찾는곳에서 구현하는게 더 간단해보여서 그렇게 해보았다.

(말은 쉽게하지만 결론에 도달하기 까지 오래걸렸다.)

 

이것도 for문을 두번 돌리는데 두번째 for문의 배열 값에 불리언을 true로 안바꿔 주면 계속 겹치지 않는 입력값에  "이름이 존재하지 않습니다." 도 같이 떠서 이걸 찾아가는 과정또한 수많은 시도끝에 찾아내었다.

 

어쨌든, 아직 미숙하고 정리 되지 않은 코드 들이지만 이렇게 프로그램을 만들어 갈수 있다는게 참 신기하고 재밌다.

이젠 이걸 HASH알고리즘을 이용해서 똑같은 프로그램을 구현하는 것을 해보아야겠다.

 

마지막으로 전체코드 ↓↓

package greenTest;

import java.util.InputMismatchException;
import java.util.Scanner;
/*
 * 기능 : 이름과 번호를 입력받아 저장 한 뒤 이름을 집어 넣으면 해당 이름에 맞는 번호를 출력해주는 프로그램
 */

class People { // 이름과 번호를 관리하는 People 클래스 생성
	// 이름과 휴대폰 번호 변수 선언.
	String name;
	String phoneNum;

	// 이름과 번호를 받는 생성자 생성.
	public People(String name, String phoneNum) {
		this.name = name;
		this.phoneNum = phoneNum;
	}

	// 이름을 입력하면 번호를 보여주는 메서드 생성.
	public void ShowPhoneNum() {
		System.out.println(name + "의 번호는 " + phoneNum + "입니다.");
	}
}

public class NameNumber {
	public static void main(String[] args) {
		boolean exit = false; // "그만"을 입력했을때 dowhile문을 빠져나오기 위한 불리언 변수
		/* catch문을 통해 오류가 검출 되면 프로그램이 끝나는 것을 막고 다시 입력하게 하기 위해 dowhile문안에 넣음 */
		do {
			/* try,catch를 통해 타입을 잘못 입력할 경우 콘솔창에 오류메시지를 띄어준다. */
			try {
				Scanner scanner = new Scanner(System.in);
				System.out.print("인원 수 입력>> ");
				int personNum = scanner.nextInt();
				People[] p = new People[personNum];

				/* 이름과 전화번호 입력받기 */
				for (int i = 0; i < p.length; i++) {
					System.out.print("이름과 전화번호(이름과 번호는 빈 칸없이 입력) >> "); // 반복문을 통해 이름과 번호를 입력한 인원 수 만큼 입력 받음.
					String pName = scanner.next();
					String pPhoneNum = scanner.next();

					p[i] = new People(pName, pPhoneNum);// 위에 생성해 놓은 p배열 객체주소에 입력한 값을 집어넣어 객체를 생성함.

					for (int j = 0; j < i; j++) { // 번호는 중복이 없으므로, 발생시 다시 입력하게 함.
						if (p[j].phoneNum.equals(p[i].phoneNum)) {
							System.out.println("번호 중복 발생, 다시입력");
							i--;
							break;
						}
					}
				}

				System.out.println("저장되었습니다."); // 값을 받은 뒤 저장되었음을 알려줌.

				/* 입력받은 이름과 전화번호 출력하기 */
				for (int j = 0; j < Integer.MAX_VALUE; j++) { // 번호를 찾기위해 입력해야할 이름을 받는 스캐너클래스 무한 반복
					System.out.print("검색할 이름 >> ");
					String searchName = scanner.next();

					boolean test = true; // 입력값에 따라 다르게 출력하기 위해 만든 boolean 변수

					/* 객체 배열 값중에 입력한 이름이 있을 경우 해당 이름의 번호를 출력 */
					for (int i = 0; i < p.length; i++) { // 위에 생성한 객체배열 p의 길이만큼 반복
						for (int k = 0; k < p.length; k++) { // 중복된 이름있을 경우 모두 출력하기 위해 for문을 두번 돌려줌
							if (searchName.equals(p[i].name)) {
								p[i].ShowPhoneNum();
								test = true;
								break;
							} else if (searchName.equals(p[k].name)) { // for문을 두번 겹칠 경우 안겹치는 이름의 경우 test = false값도 같이 뜨는걸 방지하기 위해 따로 만들어둠
								test = true;
								break;
							} else {
								test = false; // 이름이 없을 경우 이름이 없다는 것을 알린다.
							}

						}
					}

					/* "그만"을 입력하면 프로그램을 종료, 다를 경우 "존재 하지 않습니다" 출력 */
					if (searchName.equals("그만")) {
						System.out.println("프로그램을 종료합니다.");
						exit = true; // dowhile 반복문 안에 있기 때문에 true로 바꿔주지 않으면 무한루프에 빠짐.
						break; // 프로그램 종료
					} else if (!test) {
						System.out.println(searchName + "은(는) 존재하지 않습니다."); // 입력 받은 문자열이 배열에 없을경우 출력
					}

				}

				scanner.close();

			} catch (InputMismatchException e) {
				System.out.println("값을 제대로 입력해주세요."); // 인원 수 입력 칸에 다른 타입을 넣었을 경우에 출력
			}

		} while (!exit); // "그만"이 입력될 경우 탈출
	}
}