2016년 1월 28일 목요일

[JAVA 교육] 접근제한자 / 다형성 - 실습예제

[JAVA 교육] 접근제한자 / 다형성 - 실습예제


[ Class Diagram ]



[소스코드 : NameCardCLIApplication.java]

/********************************************************************
 * <고객관리 프로그램, Customer Management Program>
고객관리 프로그램을 만들어야 합니다.
고객정보는 이름, 이메일, 나이를 저장합니다.
최대 100명의 정보를 저장할 수 있어야 합니다.
메모리에 정보를 저장/관리합니다.
배열을 이용합니다.

기능적 요구사항
 - 고객정보 입력(Insert)
 - 고객정보 수정(Update)
 - 고객정보 삭제(Delete)
 - 고객정보 리스트 출력(List)
 - 고객정보 조회(Previous, Next)
 - 수정 또는 삭제는 조회를 한 다음에 사용할 수 있습니다.

비기능적 요구사항
 - 언어는 자바
 - CLI 환경 어플리케이션
 - 기능들은 모듈단위로 작성되야 합니다.
    메서드를 작성하란 의미입니다.
    메서드는 기능을 실행하는 별도의 블록
        메서드 이름
        메서드 파라미터 변수 선언
        리턴 타입
    public 리턴타입 메서드이름(변수타입 변수명,...) {
        //To Do
    }
    public void insertData() {
        //To Do
    }
 ********************************************************************/

package namecard.prj3;

import java.util.Scanner;

public class NameCardCLIApplication {
    static final int MAX = 100;
    static NameCard[] nameCardList = new NameCard[MAX];
    static int count = 0;
    static int index = -1;
    static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) {
        boolean key = true;
        System.out.println("******************************************");
        System.out.println("************고객 관리 프로그램************");
        System.out.println("******************************************");

        String menu;
        while(key){
            System.out.println("");
            System.out.println(">>메뉴를 선택하세요.");
            System.out.println("(L)ist, (I)nsert, (S)earch, (Q)uit");
            menu = scan.next();
            switch(menu.toUpperCase().charAt(0)){
            case 'L':
                System.out.println("모든 정보를 출력합니다.");
                listData();
                break;
            case 'I':
                System.out.println("새로운 정보를 추가합니다.");
                insertData();
                break;
            case 'S':
                if(count == 0) {
                    System.out.println("입력된 데이터가 없습니다.");
                } else {
                    System.out.println("정보를 조회합니다.");
                    searchData();
                }
                break;
            case 'Q':
                System.out.println("프로그램을 종료합니다.");
                key = false;
                break;
            }//end switch
        }//end while
    }//end main

    public static void insertData() {
        if(count < MAX) {
            System.out.println("회원구분(0:비회원, 1:회원, 2:VIP)");
            int gubun = scan.nextInt();

            System.out.print("이름을 입력하세요. : ");
            String name = scan.next();
            System.out.print("이메일을 입력하세요. : ");
            String email = scan.next();
            System.out.print("나이를 입력하세요. : ");
            int age = scan.nextInt();

            NameCard card = null;
            if(gubun == 0){
                card = new NameCard(name, email, age);
            } else if(gubun == 1) {
                System.out.print("ID를 입력하세요. : ");
                String id = scan.next();
                card = new MemberNameCard(name, email, age, id);
            } else if(gubun == 2) {
                System.out.print("회원 ID를 입력하세요. : ");
                String id = scan.next();
                System.out.print("권한을 입력하세요. : ");
                String permission = scan.next();
                card = new VipNameCard(name, email, age, id, permission);
            } else {
                System.out.println("잘못된 회원 구분입니다. 추가가 취소됩니다.");
            }

            if(card != null){
                nameCardList[count] = card;
            }

            System.out.println("새로운 정보가 추가되었습니다.");
            count++;
        } else {
            System.out.println("더이상 추가 할 수 없습니다.");
        }
    }

    public static void listData() {
        if(count == 0){
            System.out.println("현재 입력된 정보가 없습니다.");
        }else {
            System.out.printf("|\t이름\t\t|\t이메일\t\t\t\t|\t나이\t|\n");
            for(int i=0; i<count ; i++) {
                System.out.printf("|\t"+nameCardList[i].getName()+"\t\t|\t"
                            +nameCardList[i].getEmail()+"\t\t|\t"
                            +nameCardList[i].getAge()+"\t|\n");
            }
        }
    }

    public static void searchData() {
        boolean key=true;
        String smenu;
        while(key) {
            System.out.print("세부메뉴를 선택하세요. (P)revious/(N)ext/(U)pdate/(D)elete/(M)ain : ");
            smenu = scan.next();
            switch(smenu.toUpperCase().charAt(0)) {
            case 'P':
                previousData();
                break;
            case 'N':
                nextData();
                break;
            case 'U':
                updateData();
                break;
            case 'D':
                deleteData();
                break;
            case 'M':
                System.out.println("메인 메뉴로 돌아갑니다.");
                index = -1;
                key = false;
                break;
            default:
                System.out.println("잘못된 입력입니다.");
            }
        }

    }

    public static void previousData() {
        if(index == -1){
            System.out.println("(N)ext를 선택해주세요.");
        } else if(index > 0) {
            index--;
            printData(index);
        } else {
            System.out.println("처음 데이터입니다.");
            printData(index);
        }
    }

    public static void nextData() {
        if(index < count-1) {
            index++;
            printData(index);
        } else {
            System.out.println("마지막 데이터입니다.");
            printData(index);
        }
    }

    public static void updateData() {
        if(index != -1) {
            NameCard card = nameCardList[index];

            System.out.println("선택된 정보를 수정합니다.");
            System.out.print("이름을 입력하세요. : ");
            card.setName(scan.next());
            System.out.print("이메일을 입력하세요. : ");
            card.setEmail(scan.next());
            System.out.print("나이를 입력하세요. : ");
            card.setAge(scan.nextInt());

            if(card instanceof VipNameCard) {
                System.out.print("회원 ID를 입력하세요. : ");
                ((VipNameCard) card).setId(scan.next());
                System.out.print("권한을 입력하세요. : ");
                ((VipNameCard) card).setPermission(scan.next());

            } else if (card instanceof MemberNameCard){
                System.out.print("회원 ID를 입력하세요. : ");
                ((MemberNameCard) card).setId(scan.next());
            }

            System.out.println("정보가 수정되었습니다.");
            printData(index);
        }
    }

    public static void deleteData() {
        if(index != -1) {
            System.out.println("선택된 정보를 삭제합니다.");
            for(int i=index ; i<count ; i++) {
                nameCardList[i] = nameCardList[i+1];
            }
            nameCardList[count-1]=null;

            if(!((count > 1) && (index == 0))) {
                index--;
            }
            count--;
        }
    }

    public static void printData(int pos) {
        System.out.println("======================================");
        System.out.println("현재 Index : "+pos+" ");
        nameCardList[pos].printNameCardInfo();
        System.out.println("======================================");
        System.out.println("");
    }
}

[소스코드 : NameCard.java]
package namecard.prj3;

public class NameCard {
    private String name;
    private String email;
    private int age;

    public NameCard(String nameString emailint age) {
        super();
        this.name = name;
        this.email = email;
        this.age = age;
        System.out.println("1");
    }

    public NameCard(String nameint age) {
        this(name,null,age);
        //this.name = name;
        //this.age = age;
        //위의 2줄로 쓰는거 보다. 첫번째줄 처럼 쓰는게 좋다.
        System.out.println("2");
    }

    public NameCard() {
        //this("무명씨", "없음", 0);   //첫번째 생성자 호출
        this("무명씨"0);   //두번째 생성자 호출
        System.out.println("3");
    }

    //NameCard card = new NameCard();를 실행했을 때 실행 순서.
    // 3번째 생성자->2번째 생성자->1번째 생성자.

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void printNameCardInfo(){
        System.out.println("[이름: "+name+"\t"+
                            "이메일:"+email+"\t"+
                            "나이: "+age+"]");
    }

}

/*1사람 고객 정보를 저장하려면

//////////////NameCard card = new NameCard();card.name = "홍길동";card.email = "hong@hong.com";card.age = 30;-------------vs-------------NameCard card = new NameCard("홍길동","hong@hong.com",30);/////////////*/

[소스코드 : MemberNameCard.java]
package namecard.prj3;

public class MemberNameCard extends NameCard{
    private String id;

    public MemberNameCard(String nameString emailint ageString id) {
        super(name, email, age);
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public void printNameCardInfo() {
        // TODO Auto-generated method stub
        super.printNameCardInfo();
        System.out.println("[ ID : "+id+"]");
    }

}

[소스코드 : VipNameCard.java]

package namecard.prj3;

public class VipNameCard extends MemberNameCard{
    private String permission;

    public VipNameCard(String nameString emailint ageString idString permission) {
        super(name, email, age, id);
        this.permission = permission;
    }

    public String getPermission() {
        return permission;
    }

    public void setPermission(String permission) {
        this.permission = permission;
    }

    @Override
    public void printNameCardInfo() {
        // TODO Auto-generated method stub
        super.printNameCardInfo();
        System.out.println("[ 권한 : "+permission+"]");
    }
}

댓글 없음:

댓글 쓰기