오늘 만들어 볼 간단한 프로그램은,
이름과 전화번호를 입력하여 배열에 저장한 뒤 이름을 입력하면 전화번호가 출력되는 프로그램
입니당.
ex)
인원수 >> 3명
이름,번호 >> 김김김 1
이름,번호 >> 이이이 2
이름,번호 >> 최최최 3
찾고싶은 사람 >> 김김김
김김김의 번호는 1입니다.
찾고싶은 사람 >> 박박박
존재하지 않는 이름입니다.
찾고싶은 사람 >> 그만
프로그램을 종료합니다.
뭐 이런 프로그램입니다.
(전체 코드는 제가 복습하는 차원에서 처음부터 코드를 다 설명 하고 마지막에 올려놨습니다.)
우선 People이라는 클래스를 만들어서 그곳에 이름과 번호가 담기는 변수의 주소를 만들어 놓습니다.
그 뒤 생성자를 만들고, 이름을 입력하면 번호를 보여주는 객체메서드를 생성했습니다.
나중에 밑에 메인메서드에서 ShowPhoneNum을 객체생성을 통해 호출하면 해당 메서드내의 내용이 출력됩니다.
그다음 메인메서드안에 프로그램을 구현해줍니다.
가장 위에 있는 exit 불리언 변수는 가장 마지막에 do while문을 탈출하는데 사용되는 변수이기 때문에 가장 밖에 전역변수로 생성했습니다.
우선 try catch문을 통해 전체 프로그램을 감싸서 타입에 맞지않는 값을 입력했을 때(숫자타입에 한글을 입력하는 등의 오류) 제대로 값을 입력하라는 오류메세지를 띄워주도록 하였습니다. 그렇게 해놓으면 오류가 발생했을때 프로그램이 그냥 끝나버리는 일이 생기기 때문에 그걸 방지 하기 위해 dowhile문을 사용하여 무한반복 되도록 하였습니다.
스캐너 클래스를 생성한 뒤 인원수를 먼저 입력 받고 그 인원 수만큼의 배열의 크기를 가지는 p 객체 배열을 생성하였습니다. 그뒤 반복문을 통해 인원수만큼 반복하면서 이름과 번호를 입력받아 그 값들을 위에 생성해 놓은 p 배열에 집어넣도록 만든 뒤 저장되었다는 것을 알렸습니다.
그 다음으로는 이름을 입력하면 전화번호를 출력하게 만듭니다.
우선 "그만"을 입력하기 전까지는 계속 검색되게 무한반복해야하므로 while문이나 for문을 사용하여 무한 반복 시키면 되는데 얼마전 Integer.MAX_VALUE를 새로 배워서 while문 대신 사용해봤습니다.
Integer.MAX_VALUE - int형의 가장 큰 값(2,147,483,647)을 나타내는 표현입니다. 어떻게 보면 무한반복이라고 보기는 힘들지만 저 수만큼 반복해보는 사람은 없으므로 그냥 무한반복을 위해 사용했다는 표현을 쓰겠습니다.
검색할 이름을 searchName값에 넣고 넣은 값이 객체배열에 저장되어있는 값에 있으면 번호를 출력하는 ShowPhoneNum 메서드를 실행하게 만들었습니다.
* 중요 *
저기서 test라는 불리언 변수를 사용해 입력한 값에 따라 true와 false를줘서 위치를 올바르게 찾아가게끔 만들었습니다.
그리고 "그만"을 적으면 종료하게하는 if문에서 위에 전역변수로 설정 해놓은 exit불리언 변수에 변경을 주어 그만이 입력되면 dowhile반복문을 탈출하면서 프로그램이 종료 되게끔 하였습니다.
마지막으로 캐치문에 오류메세지를 설정 해주고 while(!exit)를 통해 그만이 입력되면 무한루프를 탈출해서 프로그램이 자연스럽게 종료되게끔 하였습니다.
그 외에 번호 중복, 이름 중복등 다양한 처리를 해볼 수 있는데 추후 따로 추가하여
올리도록 하겠습니다.
마지막으로 전체코드는 밑에~
/*
* 기능 : 이름과 번호를 입력받아 저장 한 뒤 이름을 집어 넣으면 해당 이름에 맞는 번호를 출력해주는 프로그램
*/
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배열 객체주소에 입력한 값을 집어넣어 객체를 생성함.
}
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의 길이만큼 반복
if (searchName.equals(p[i].name)) {
p[i].ShowPhoneNum();
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); // "그만"이 입력될 경우 탈출
}
}
'개발 > JAVA' 카테고리의 다른 글
[JAVA] 자바 객체배열을 사용한 전화번호 출력 프로그램2 (0) | 2021.03.03 |
---|---|
[JAVA] 자바의추상클래스 (0) | 2021.03.01 |
[JAVA] 자바 업캐스팅, 다운캐스팅 (0) | 2021.02.22 |
[JAVA] 자바 static의 사용 (0) | 2021.02.20 |
[JAVA] 자바 접근 제한자 private (0) | 2021.02.08 |