java
Java/ MVC패턴과 추상클래스를 이용한 연락처 관리 프로그램
MyaZ
2020. 2. 10. 17:12
1) Model/ 데이터 객체 : Value Object(VO), Data Transfer Object(DTO), 데이터베이스의 Table
2) View : 사용자한테 어떤 UI를 보여줄 것인지? 사용자 입력정보, 출력정보
3) Controller : 동작, 제어
Main class
public class FriendInfoMain {
public static void main(String[] args) {
FriendInfoView fView = new FriendInfoView();
fView.menuLoop();
}
}
Model/ 저장 관리 데이터/ VO/ DTO
- Friend 클래스의 목적
1) 기능을 물려준다
2) Controller에서 자식 객체들을 관리하는 배열변수로서 동작한다. (Friend 객체 자체는 만들지 않는다)
- 추상메서드가 1개이상인 클래스 == 추상 클래스
1) 추상클래스는 객체 제작에 목적이 없다.
2) 자식객체를 담는 변수로서만 동작
3) 일부 기능은 사전 구현해서 상속하지만 일부 기능은 미리 구현하는 것이 어려울 때,
선언만 하고 자식클래스에서 구현하는 역할
public abstract class Friend {
protected String name;
protected String phoneNum;
protected String addr;
public Friend(String name, String phone, String addr) {
this.name = name;
this.phoneNum = phone;
this.addr = addr;
}
// 전체 정보 출력
public void showData() {
System.out.println("이름: " + name);
System.out.println("전화: " + phoneNum);
System.out.println("주소: " + addr);
}
// 추상 메서드
// 구현부는 존재하지 않고 선언만 존재하는 메서드
// 자식이 물려받아서 구현해하는 목적으로 선언
public abstract void showBasicData();
}
public class HighFriend extends Friend {
private String work;
public HighFriend(String name, String phone,
String addr, String job) {
super(name, phone, addr);
this.work = job;
}
public void showData() {
super.showData();
System.out.println("직업 : " + work);
}
public void showBasicData() {
System.out.println("이름 : " + name);
System.out.println("전화 : " + phoneNum);
}
}
public class UnivFriend extends Friend {
private String major; // 전공학과
public UnivFriend(String name, String phone,
String addr, String major) {
super(name, phone, addr);
this.major = major;
}
public void showData() {
super.showData();
System.out.println("전공 : " + major);
}
public void showBasicData() {
System.out.println("이름 : " + name);
System.out.println("전화 : " + phoneNum);
System.out.println("전공 : " + major);
}
}
View
화면을 보여주는 역할
입출력 담당 역할
class MENU{
final static int HIGH_FRIEND = 1;
final static int UNIV_FRIEND = 2;
final static int SHOW_ALL = 3;
final static int SHOW_SIMPLE = 4;
final static int EXIT_PROGRAM = 5;
}
public class FriendInfoView {
private static Scanner sc = new Scanner(System.in);
FriendInfoController controller;
public FriendInfoView() {
//controller = new FriendInfoController();
int num = getFriendNum();
controller = new FriendInfoController(num);
}
public static Scanner getScanner() {
return sc;
}
int getFriendNum() {
System.out.println("몇 명 친구 저장 ? ");
int num = sc.nextInt();
return num;
}
void viewMenu() {
System.out.println("*** 메뉴 선택 ***");
System.out.println("1. 고교 친구 저장");
System.out.println("2. 대학 친구 저장");
System.out.println("3. 전체 정보 출력");
System.out.println("4. 기본 정보 출력");
System.out.println("5. 프로그램 종료");
}
int getUserSelect() {
System.out.println("선택 >> ");
int choice = sc.nextInt();
return choice;
}
boolean runChoice(int choice) {
switch(choice) {
case MENU.HIGH_FRIEND:
case MENU.UNIV_FRIEND:
controller.addFriend(choice);
break;
case MENU.SHOW_ALL:
controller.showAllData();
break;
case MENU.SHOW_SIMPLE:
controller.showAllSimpleData();
break;
case MENU.EXIT_PROGRAM:
System.out.println("프로그램 종료~");
return false;
default:
System.out.println("잘 못 입력~");
break;
}
return true;
}
void menuLoop() {
boolean isRun = true;
while(isRun) {
viewMenu();
int choice = getUserSelect();
isRun = runChoice(choice);
}
}
}
Controller
실질적인 동작과 기능을 담당하는 부분
public class FriendInfoController {
private Friend[] myFriends; // 친구 객체 저장 배열
private int numOfFriends; // 저장된 친구수
private final static int FRIEND_NUM = 100;
public FriendInfoController() {
myFriends = new Friend[FRIEND_NUM];
numOfFriends = 0;
}
public FriendInfoController(int num) {
myFriends = new Friend[num];
numOfFriends = 0;
}
// 배열에 친구저장하고, 친구수 증가
void addFriendInfo(Friend fren) {
if(numOfFriends < myFriends.length)
myFriends[numOfFriends++] = fren;
else
System.out.println("꽉 찼습니다!!!");
}
// 고등학교/대학교 친구 입력후 저장
void addFriend(int choice) {
String name, phone, addr, job, major;
// 고등학교/대학교 모두 입력받아야 하는 부분
Scanner sc = FriendInfoView.getScanner();
System.out.print("이름 : "); name = sc.next();
System.out.print("전화 : "); phone = sc.next();
System.out.print("주소 : "); addr = sc.next();
if(choice == MENU.HIGH_FRIEND) {
System.out.print("직업 : "); job = sc.next();
addFriendInfo(new HighFriend(name, phone, addr, job));
}else if(choice == MENU.UNIV_FRIEND) {
System.out.print("학과 : "); major = sc.next();
addFriendInfo(new UnivFriend(name, phone, addr, major));
}
System.out.println("--- 입력 완료 ---\n");
}
// 전체 정보 출력
void showAllData() {
for(int i=0;i<numOfFriends;i++) {
myFriends[i].showData();
System.out.println();
}
}
// 기본 정보 출력
void showAllSimpleData() {
for(int i=0;i<numOfFriends;i++) {
myFriends[i].showBasicData();
System.out.println();
}
}
}