Java - hashSet(2),싱글톤

wlsdnboy·2022년 3월 3일
0

hashSet

https://velog.io/@jinwoo2025/Java-%EB%B0%B0%EC%97%B4

  • 저번에 배열 예제를 hashSet으로 바꿔보자
//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로 선언했기 때문에 기본생성자 호출은 불가능하다.

싱글톤의 사용 이유

  • 한번의 객체 생성으로 재 사용이 가능하기 때문에 메모리 낭비를 방지할 수 있다.
  • 다른 클래스 간의 데이터 공유가 쉽다 싱글톤을 static으로 선언했기 때문에 다른 클래스에서도 싱글톤을 사용할 수 있다.

    참고사이트
    https://elfinlas.github.io/2019/09/23/java-singleton/

profile
초보 개발자

0개의 댓글