//menu class
public class Menu {
static void Menu() {
System.out.println("데이터입력");
System.out.println("데이터검색");
System.out.println("데이터삭제");
System.out.println("데이터 전체 출력");
System.out.println("프로그램 종료");
}
}
//PhoneBook class
public class PhoneBook {
public static void main(String[] args) {
PhoneBookManager pbm = PhoneBookManager.creatManagerInst(); //싱글톤을 사용했다 메모리 낭비를 방지한다
Scanner sc = new Scanner(System.in);
while (true) {
Menu.Menu();
int x = sc.nextInt();
if (x == 1) {
System.out.println("1.일반,2.대학,3.회사");
int y = sc.nextInt();
if ( y == 1) {
pbm.read();
}
else if(y == 2 ) {
pbm.readStudent();
}
else if (y == 3) {
pbm.readCompany();
}
} else if (x == 2) {
pbm.search();
} else if (x == 3) {
pbm.deleteData();
} else if (x == 4) {
pbm.Data();
}
else if (x == 5) {
System.out.println("프로그램을 종료 합니다");
break;
}
}
}
}
//PhoneBookManager class
public class PhoneBookManager {
final int MAX = 100;
PhoneInfo[] info = new PhoneInfo[MAX];
int cnt = 0;
HashSet<PhoneInfo> hs = new HashSet<>(); //해쉬셋을 선언한다
private PhoneBookManager() // 기본생성자를 private로 선언하여 싱글톤을 사용한다
{
}
static PhoneBookManager inst=null;
public static PhoneBookManager creatManagerInst()
{
if(inst==null)
inst=new PhoneBookManager();
return inst;
}
Scanner sc = new Scanner(System.in);
void read() {
System.out.println("이름");
String name = sc.next();
System.out.println("전화번호");
String number = sc.next();
System.out.println("생년월일");
String birth = sc.next();
hs.add(new PhoneInfo(name, number, birth)); 해쉬셋 hs에 추가한다
}
void readStudent() {
System.out.println("이름");
String name = sc.next();
System.out.println("전화번호");
String number = sc.next();
System.out.println("전공");
String major = sc.next();
System.out.println("학년");
int year = sc.nextInt();
hs.add(new PhoneUnivInfo(name, number, major, year)); //해쉬셋 hs에 추가한다
}
void readCompany() {
System.out.println("이름");
String name = sc.next();
System.out.println("전화번호");
String number = sc.next();
System.out.println("전공");
String company = sc.next();
hs.add(new PhoneCompanyInfo(name, number, company)); //해쉬셋 hs에 추가한다
}
void search() {
System.out.println("이름을 입력하세요");
String name = sc.next();
Iterator<PhoneInfo> it = hs.iterator(); // 이터레이터를 통해 출력한다
while(it.hasNext()) {
PhoneInfo ph = (PhoneInfo) it.next();
if(ph.name.equals(name)) { // 들어온 이름과 저장된 이름이 같으면 출력한다
ph.showPhoneInfo();
}
}
}
void deleteData() {
System.out.println("이름을 입력하세요");
String name = sc.next();
Iterator<PhoneInfo> it = hs.iterator();
while(it.hasNext()) {
PhoneInfo ph = (PhoneInfo) it.next();
if(ph.name.equals(name)) { //들어온 이름과 저장된 이름이 같으면 삭제한다
it.remove();
}
}
}
void Data() {
Iterator<PhoneInfo> it = hs.iterator();
while(it.hasNext()) {
PhoneInfo ph = (PhoneInfo) it.next(); // 전부 출력한다
ph.showPhoneInfo();
}
}
}
public class PhoneInfo {
String name;
String number;
String birth;
public PhoneInfo(String name, String number, String birth) {
this.name = name;
this.number = number;
this.birth = birth;
}
public PhoneInfo(String name2, String phoneNum) {
this.name = name2;
this.number = phoneNum;
}
public void showPhoneInfo() {
System.out.println("name : " + this.name);
System.out.println("number : " + this.number);
System.out.println("birth : " + this.birth);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((number == null) ? 0 : number.hashCode());
return result; //해쉬코드를 리턴 메모리주소가 같다면 객체는 동등하다고 한다
}
@Override
public boolean equals(Object obj) {
if (obj instanceof PhoneInfo) {
PhoneInfo ph = (PhoneInfo) obj;
if( ph.name.equals(name)) {
System.out.println("이미 등록된 이름입니다");
return true; // true가 리턴되면 이미 등록된 이름이다
}
}
return false;
}
}
class PhoneUnivInfo extends PhoneInfo {
String name;
String PhoneNum;
String major;
int year;
public PhoneUnivInfo(String name, String PhoneNum, String major, int year) {
super(name, PhoneNum);
this.major = major;
this.year = year;
}
@Override
public void showPhoneInfo() {
// TODO Auto-generated method stub
super.showPhoneInfo();
System.out.println("전공 : " + this.major);
System.out.println("학년 : " + this.year);
}
}
class PhoneCompanyInfo extends PhoneInfo {
String name;
String PhoneNum;
String company;
public PhoneCompanyInfo(String name, String PhoneNum, String company) {
super(name, PhoneNum);
this.company = company;
}
@Override
public void showPhoneInfo() {
// TODO Auto-generated method stub
super.showPhoneInfo();
System.out.println("회사 : " + this.company);
}
}
클래스가 최초 한번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하는 디자인 패턴이다
생성자 호출이 반복적으로 이뤄저도 실제로 생성되는 객체는 최초 생성된 객체를 반환한다.
private PhoneBookManager() // 기본생성자를 private로 선언하여 싱글톤을 사용한다
{
}
static PhoneBookManager inst=null;
public static PhoneBookManager creatManagerInst()
{
if(inst==null)
inst=new PhoneBookManager();
return inst;
}
private로 선언했기 때문에 기본생성자 호출은 불가능하다.