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. 프로그램 종료 ");
};
}