전화번호부 (mvc패턴)

jinkyung·2021년 1월 15일
0

JAVA2

목록 보기
15/35
package homework.ex03;
/*
[sw 설계]
1. MVC 패턴	
	View - Controller - Model 
   sw를 관찰해보니까 3가지로 나누면 되더라
   Model      : 데이터, File/DB, 저장/로딩
   View       : UI, 사용자와의 입출력
   Controller : 비즈니스 로직, 통신, 처리 (model과 view 사이를 연결)
   ; 클래스의 역할을 나눌 때 이렇게 나눠라
2. 명사/동사 구분법 : DB모델링과 유사
   명사 : 큰범위 => 클래스
              작은 범위 => 필드
   동사 : 큰범위(역할) => 클래스
             작은 범위 => 메서드
             
 클래스를 설계할 때는 정규화처럼 해당 역할에 필요한 요소들만 모아놓는다 
 (클래스는 응집도가 높아야 한다 = 클래스의 역할에 충실해야 한다, 불필요한것들 x) 
PhoneInfo : Model
PhoneBookManager : Controller
MenuViewer : View
PhoneMain : main 시작 

*/

public class PhoneMain {
	public static void main(String[] args) {
		PhoneBookManager pbm = new PhoneBookManager();
		pbm.mainRun();
	}
}

package homework.ex03;

import java.util.Scanner;

public class PhoneBookManager {

	final int PHONE_NUM = 100;  	//상수는 보통 대문자로 표현 
    PhoneInfo[] infoStorage = new PhoneInfo[PHONE_NUM]; // 전화정보 저장 배열
    int curCnt = 0;			// 현재 저장 개수, 새로 저장할 인덱스 
    public void inputData() {
    	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();
    	
    	// 배열이 다 차면 저장 중지 
    	if(curCnt >= PHONE_NUM) {
    		System.out.println("Full Storage!!");
    		return;
    	}
    	
    	// 저장 객체 생성 
    	PhoneInfo pi = new PhoneInfo(name, phone, birth);
    	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 void updateData() {	//새로 객체를 만들어 덮어 써도 된다 
    	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.print("이름 입력 : "); String name = sc.next();
    	int idx = search(name);
    	if(idx != -1) {
    		System.out.print("이름 입력 : "); String _name = sc.next();
        	System.out.print("전화 입력 : "); String _phone = sc.next();
        	System.out.print("생일 입력 : "); String _birth = sc.next();
        	PhoneInfo pi = infoStorage[idx];
        	pi.setName(_name);
        	pi.setPhoneNumber(_phone);
        	pi.setBirth(_birth);
		}
    }
    
    public void viewAllData() {
    	for (int i = 0; i < curCnt; i++) {	 // 저장된 개수만큼 돌린다 
			PhoneInfo pi = infoStorage[i];
			pi.showPhoneInfo();
		}
    	
    }
    
    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 homework.ex03;

public class PhoneInfo {
	// 필드
	private String name;
	private String phoneNumber;
	private String birth;
	
	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 PhoneInfo(String name, String num) {
		this.name = name;
		this.phoneNumber = num;
		this.birth = null;
	}
	public void showPhoneInfo() {
		System.out.println("name : " + name);
		System.out.println("phone : " + phoneNumber);
		if(birth != null)
			System.out.println("birth : " + birth);
		
		System.out.println("");
	}
	
	
	boolean isEqualName(String name) {
		if(this.name.equals(name))
			return true;
		else
			return false;
	}
}
package homework.ex03;

import java.util.Scanner;

public class MenuViewer {		//여러군데 쓰이지 않으니까 static으로 만들어 주는것이 낫다.
   private static Scanner sc = new Scanner(System.in); 	//변수니까 private 
   
   public static Scanner inputKeyboard() {		//scanner타입을 리턴하는 메서드 
	   return sc;			// 매번 스캐너 만들기 싫어서 만든 메서드..
   }
    // 번호 선택
    public static int getSelMenu() {
    	System.out.print("번호 선택 >> ");
    	return sc.nextInt();
    };	
    
    // 메뉴 보여주기
    public static void showMenu() {
		System.out.println(" ---선택 하세요---");
		System.out.println("1. 데이터 입력 ");
		System.out.println("2. 데이터 검색 ");
		System.out.println("3. 데이터 삭제 ");
		System.out.println("4. 데이터 수정 ");
		System.out.println("5. 데이터 전체 출력");
		System.out.println("6. 프로그램 종료 ");
		
    };    
}

0개의 댓글

관련 채용 정보