전화번호부를 일반, 대학, 회사 전화번호부로 나눈 프로그램
package ex03.inheritance.phoneInfo14;
/*
입력시
1. 일반, 2. 대학, 3. 회사
다양한 사람을 입력하도록 수정
*/
public class PhoneMain {
public static void main(String[] args) {
PhoneBookManager pbm = new PhoneBookManager();
pbm.mainRun();
}
}
내용을 입력하세요.
package ex03.inheritance.phoneInfo14;
import java.util.Scanner;
public class PhoneBookManager {
final int PHONE_NUM = 100;
PhoneInfo[] infoStorage = new PhoneInfo[PHONE_NUM]; // 자기 자신 또는 자식들의 객체 저장
int curCnt = 0;
public PhoneInfo readGeneralPhoneInfo() {
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String name = sc.next();
System.out.print("전화 입력 : "); String phone = sc.next();
System.out.print("생일 입력 : "); String birth = sc.next();
//자식 객체니까 부모변수로 넣을 수 있고, 리턴할 수 있다
PhoneInfo pi = new PhoneInfo(name, phone, birth);
return pi;
}
public PhoneInfo readUnivPhoneInfo() {
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String name = sc.next();
System.out.print("전화 입력 : "); String phone = sc.next();
System.out.print("생일 입력 : "); String birth = sc.next();
System.out.print("학과 입력 : "); String major = sc.next();
System.out.print("학년 입력 : "); int year = sc.nextInt();
PhoneInfo pi = new PhoneUnivInfo(name, phone, birth, major, year);
return pi;
}
public PhoneInfo readCompanyPhoneInfo() {
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String name = sc.next();
System.out.print("전화 입력 : "); String phone = sc.next();
System.out.print("생일 입력 : "); String birth = sc.next();
System.out.print("회사 입력 : "); String company = sc.next();
PhoneInfo pi = new PhoneCompanyInfo(name, phone, birth, company);
return pi;
}
public void inputData() {
Scanner sc = MenuViewer.inputKeyboard();
System.out.println("데이터 입력을 시작합니다....");
System.out.println("1. 일반 2. 대학 3. 회사");
System.out.println("선택 >> ");
PhoneInfo pi;
int choice = sc. nextInt();
switch(choice) {
case 1: pi = readGeneralPhoneInfo(); break;
case 2:pi = readUnivPhoneInfo(); break;
case 3: pi = readCompanyPhoneInfo(); break;
default: System.out.println("Invalid Number!!!"); return;
}
// 배열이 다 차면 저장 중지
if(curCnt >= PHONE_NUM) {
System.out.println("Full Storage!!");
return;
}
// 저장 객체 생성
infoStorage[curCnt] = pi; //배열에 저장
curCnt++; //저장 개수 증가, 다음 저장 인덱스
}
// 전화정보 검색
public void searchData() {
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String name = sc.next();
int idx = search(name);
if(idx != -1) {
// infoStorage[idx].showPhoneInfo();
PhoneInfo pi = infoStorage[idx];
pi.showPhoneInfo();
}
}
// 전화정보 삭제
public void deleteData() {
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String name = sc.next();
int idx = search(name);
if(idx != -1) {
// 삭제할 자리가 생겨서 삭제할 자리부터 앞으로 한칸씩 당긴다.
for (int i = idx; i < curCnt-1; i++) { //마지막번째는 이미 앞으로 당겨져서 없기 때문에 curCnt-1
infoStorage[i] = infoStorage[i+1];
}
curCnt--; // 삭제한 1명을 줄여준다
}
}
public PhoneInfo updateGeneralPhoneInfo(PhoneInfo pi){
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String _name = sc.next();
System.out.print("전화 입력 : "); String _phone = sc.next();
System.out.print("생일 입력 : "); String _birth = sc.next();
pi.setName(_name);
pi.setPhoneNumber(_phone);
pi.setBirth(_birth);
return pi; // 사실 return 안해도 무방.
}
public PhoneInfo updateUnivPhoneInfo(PhoneUnivInfo pi) {
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String _name = sc.next();
System.out.print("전화 입력 : "); String _phone = sc.next();
System.out.print("생일 입력 : "); String _birth = sc.next();
System.out.print("학과 입력 : "); String _major = sc.next();
System.out.print("학년 입력 : "); int _year = sc.nextInt();
pi.setName(_name);
pi.setPhoneNumber(_phone);
pi.setBirth(_birth);
pi.setMajor(_major);
pi.setYear(_year);
return pi;
}
public PhoneInfo updateCompanyPhoneInfo(PhoneCompanyInfo pi) {
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : "); String _name = sc.next();
System.out.print("전화 입력 : "); String _phone = sc.next();
System.out.print("생일 입력 : "); String _birth = sc.next();
System.out.print("회사 입력 : "); String _company = sc.next();
pi.setName(_name);
pi.setPhoneNumber(_phone);
pi.setBirth(_birth);
pi.setCompany(_company);
return pi;
}
public void updateData() { //새로 객체를 만들어 덮어 써도 된다
Scanner sc = MenuViewer.inputKeyboard();
System.out.print("이름 입력 : ");
String name = sc.next();
int idx = search(name);
if(idx != -1) {
PhoneInfo pi = infoStorage[idx];
//pi 변수에 담긴 객체가 PhoneInfo 클래스 객체일 때
if(pi.getClass().equals(PhoneInfo.class)) {
// pi = updateGeneralPhoneInfo(pi); 이렇게 안해도 됨
updateGeneralPhoneInfo(pi);
}
//pi 변수에 담긴 객체가 PhoneUnivInfo 클래스 객체일 때
else if(pi.getClass().equals(PhoneUnivInfo.class)) {
pi = updateUnivPhoneInfo((PhoneUnivInfo)pi); //자식 객체로 형변환
}
//pi 변수에 담긴 객체가 PhoneCompanyInfo 클래스 객체일 때
else if (pi.getClass().equals(PhoneCompanyInfo.class)) {
pi = updateCompanyPhoneInfo((PhoneCompanyInfo)pi);
}
infoStorage[idx] = pi; //안써도 되지만 명시적으로 써줌.
}
}
public void viewAllData() {
for (int i = 0; i < curCnt; i++) { // 저장된 개수만큼 돌린다
PhoneInfo pi = infoStorage[i];
pi.showPhoneInfo();
System.out.println("-----------------------");
}
}
public int search(String name) {
// 이름으로 검색, searchData(), deleteData()내에서 사용
for (int i = 0; i < curCnt; i++) {
PhoneInfo pi = infoStorage[i];
if(pi.isEqualName(name))
return i; //찾은 위치 인덱스 반환
}
return -1; //못찾았다
}
public void mainRun() {
boolean isRun = true;
int select=0;
// 반복 루프, main함수에서 호출
while(isRun) {
MenuViewer.showMenu();
select = MenuViewer.getSelMenu();
switch(select) {
case 1: inputData();
break;
case 2: searchData();
break;
case 3: deleteData();
break;
case 4: updateData();
break;
case 5: viewAllData();
break;
case 6: isRun = false;
System.out.println("프로그램 종료~");
break;
default : System.out.println("잘 못 선택!!!");
break;
}
}
}
}
package ex03.inheritance.phoneInfo14;
//일반 아는 사람
public class PhoneInfo {
// 필드
protected String name; //자식이 있을 때 주로 protected를 준다.
protected String phoneNumber;
protected String birth;
//setter (필드에 값을 set하는 메서드)
public void setName(String name) {
this.name = name;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void setBirth(String birth) {
this.birth = birth;
}
// 메서드
public PhoneInfo(String name, String num, String birth) {
this.name = name;
this.phoneNumber = num;
this.birth = birth;
}
public void showPhoneInfo() {
System.out.println("name : " + name);
System.out.println("phone : " + phoneNumber);
System.out.println("birth : " + birth);
}
boolean isEqualName(String name) {
if(this.name.equals(name))
return true;
else
return false;
}
}
package ex03.inheritance.phoneInfo14;
/*
class의 접근 권한
1) public : 누구나
2) default : 같은 패키지
2. field/ method의 접근 권한
1) private : 본인 class 내에서만 (성격 , 기술) 상속하면 필드도 상속되지만 private하면 접근이 안되는 것.
2) protected : 본인 class + 자식 (돈, 토지) 남은 안되고 자식은 되는..
상속일 때만 쓰이는 접근 권한자..
3) default : 같은 패키지
4) public : 누구나
*/
public class PhoneUnivInfo extends PhoneInfo {
protected String major;
protected int year;
public void setMajor(String major) {
this.major = major;
}
public void setYear(int year) {
this.year = year;
}
public PhoneUnivInfo(String name, String num, String birth, String major, int year) {
super(name, num, birth);
this.major = major;
this.year = year;
}
@Override
public void showPhoneInfo() {
super.showPhoneInfo();
System.out.println("학과 : " + major );
System.out.println("학년 : " + year );
}
}
package ex03.inheritance.phoneInfo14;
/*
Overloading : 여러개 , 많이 있다
메서드의 이름은 같고, 매개변수가 다른 메서드 선언을 허용
Overriding : 부모가 물려준 메서드를 덮어쓴다
*/
public class PhoneCompanyInfo extends PhoneInfo {
protected String company;
public void setCompany(String company) {
this.company = company;
}
public PhoneCompanyInfo(String name, String num, String birth,
String company) {
super(name, num, birth);
this.company = company;
}
@Override
public void showPhoneInfo() {
super.showPhoneInfo();
System.out.println("회사 : " + company);
}
}