스물두 번째 수업

정혅·2024년 3월 11일

더 조은 아카데미

목록 보기
27/76
  • 21일차 오전문제 그대로!
  • 이클립스 설치 진행

이클립스 단축키

  • 원하는 클래스 명에 커서 + F3 : 커서에 있는 곳의 선언된 곳이나, 생성자가 있는곳으로 이동

    • 지역변수가 선언된 곳이 어딘지 궁금하다 하면 그곳에 커서를 올리고 F3키를 누르면 그 변수가 선언된 곳으로 이동한다.
  • F4 : 해당 클래스의 계층 구조를 보여준다.(클래스 선택 후 해당 키를 누름)

  • alt + 좌우 방향키 : 이전 / 다음 작업 화면으로 이동

  • alt + 상하방향키 : 해당 문장 위치 변경

  • alt + m : 다음 페이지로 이동 > next키를 누르는 단축키인것 - n인가m인가

  • 언더바가 표시되어있는 스펠링으로 alt랑 함께 눌러주면 그 언더바 스펠링인 항목이 선택된다. - main메서드가 나오게 하려면 alt + v > v에 언더바

  • alt + shift + 위방향키 : 해당 단어만 선택

  • alt + shift + R : 클래스나, 변수이름을 일괄적으로 바꾼다.

  • alt + shift + a : 멀티 컬럼 모드? > 세로 블럭 드래그 가능한 모드

  • alt + 상단 메뉴들 언더바 스펠링 : 상단에 메뉴들 단축

  • alt + shift + s : Source 단축키

    • Generate Constructor using Feilds (언더바 보고 해당 스펠링 누르면 바로 선택) > 생성자를 만들어준다.

      • super(); 도 자동생성되서 Object생성자를 호출하는데 굳이 필요 없는 부분이니까 Omit call to default constructor super()을 체크해주면 상위 생성자 호출 부분은 나오지 않는다.
    • Generate toString() > toString자동 생성해준다. (언더바 보고 해당 스펠링 누르면 바로 )

    • Override / implments Method : 오버라이딩 시켜주는..

    • Generate getters and setters to create : getter메서드 와 setter메서드를 쫙 만들어준다.

      • setter메서드는 this.써서 해당 클래스 변수에 값 넣어주는것
  • ctrl + n : 새로운 파일을 생성하는 단축키(프로젝트, 패키지, 클래스)

  • ctrl + +/- : 글자 크기 조절

  • ctrl + alt + 방향키 : 복사

  • ctrl + w : 현재 파일 창 닫기

    • ctrl + shift + w : 모든 파일 창 닫기
  • ctrl + d : 해당 열 삭제

  • ctrl + z : 실행 취소

  • ctrl + y : 재실행

  • ctrl + F11 : 실행

  • ctrl + i : 정렬 > ctrl + shift + F 와 같은 기능

  • ctrl + shift + / : 여러줄 주석 > ctrl + shift + \ >주석 풀기

  • ctrl + shift + L : 모든 단축키의 내용을 표시해준다.

  • ctrl + shift + O : 필요한 기능들 자동으로 import 해준다.

    • 다시 누르면, import해온 안쓰는 기능들을 삭제시킨다.
  • ctrl + shift + G : 해당 클래스나 메서드가 어디서 호출되고 있는지 알고싶을 때

  • 일반 화면에서 ctrl + m : 창들이 다 사라지고 최대화 > 다시 누르면 창들 다시 나온다.

  • 클래스 이름에 대고 F4를 누르면 계층도를 보여준다. > 해당 클래스의 계층도 전체는 OutLine

    • Ctrl + T도 새로운 창의 형태로 계층도를 보여준다.
  • ctrl + 1 : 어떤식으로 오류를 해결할지 추천한다. > 오류 밑줄에 마우스 커서 올려놓으면 뜨는것과 같음

    • 오류 위에 커서를 놓아야한다.
  • ctrl + e : 파일창이 뜬다.

  • ctrl + F7 : 원하는 Views로 이동한다 (콘솔, 디버그, 오류, OutLine등)


  1. Add에서 Good 인터페이스를 추가해서 Inherited abstract 선택해서 구현하면 - ( 단축키 : alt + a)
package com.test.memo;

public class GoodImpl implements Good {

    @Override
    public void hi() {
    }

    @Override
    public void bye() {
    }

}
  • 위의 형태로 자동 오버라이딩과 구현을 해준다.

5단계 전화번호부

package com.test.memo;

import java.util.Scanner;

class PhoneInfo {
    private String name, phoneNumber;

    PhoneInfo(String name, String phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public void showPhoneInfo() {
        System.out.print("이름: " + name);
        System.out.print("전화번호: " + phoneNumber);
    }
}

class PhoneUnivInfo extends PhoneInfo {
    private String major;
    private int year;

    PhoneUnivInfo(String name, String phoneNumber, String major, int year) {
        super(name, phoneNumber);
        this.major = major;
        this.year = year;
    }

    public void showPhoneInfo() {
        super.showPhoneInfo();
        System.out.print("전공: " + major);
        System.out.print("학년: " + year);
    }
}

class PhoneCompanyInfo extends PhoneInfo {
    private String company;

    PhoneCompanyInfo(String name, String phoneNumber, String company) {
        super(name, phoneNumber);
        this.company = company;
    }

    public void showPhoneInfo() {
        super.showPhoneInfo();
        System.out.print("회사: " + company);
    }
}

class PhoneBook {
    private static PhoneBook book;
    private PhoneInfo[] phArr;
    private int cnt;

    private PhoneBook(int size) {
        phArr = new PhoneInfo[size];
        cnt = 0;
    }

    public static PhoneBook onePhoneBook(int size) {
        if (book == null) {
            book = new PhoneBook(size);
        }
        return book;
    }

    public void inputPhoneInfo(PhoneInfo pInfo) {
        if (cnt > phArr.length) {
            System.out.println("더 이상 저장할 수 없습니다.");
            return;
        }
        int i = 0;
        for (i = 0; i < cnt; i++) {
            if (phArr[i].getName().compareTo(pInfo.getName()) > 0) {// 기존에 있던 배열보다 새로 저장되는 이름의 사전적 위치가 뒤에 있을 때
                for (int j = cnt - 1; j >= i; j--) {// 배열의 끝부터 새로운이름을 삽입할 위치까지 역순으로 이동해 새로운 공간 확보
                    phArr[j + 1] = phArr[j];// 배열을 한칸씩 뒤로 밀어내는 작업 > j위치의 값을 j+1위치에 복사해서 공간을 만든다.
                }
                break;
            }
        }
        phArr[i] = pInfo;// 만약 새로운 값이 뒤쪽에 위치해야한다면 위에서 다 앞쪽으로 떙겨주고 여기서 새로운값을 삽입한다.
        cnt++;
    }

    public int search(String name) {
        for (int i = 0; i < cnt; i++) {
            if (phArr[i].getName().compareTo(name) == 0) {
                return i;
            }
        }
        return -1;
    }

    public void searchPhoneInfo(String name) {
        int result = search(name);
        if (result != -1) {
            phArr[result].showPhoneInfo();
        } else
            System.out.println("찾으시는 데이터가 없습니다.");
    }

    public void deletePhoneInfo(int idx) {
        int i = 0;
        for (i = idx; i < cnt; i++) {
            phArr[i] = phArr[i + 1];// 삭제할 곳에 그 옆에 있는 배열 당겨오기
        }
        phArr[i] = null; // 위에서 다 당겨지고 그 마지막 배열을 null값으로 만들어주기 > 마지막 배열의 값이 두개가 되니까
        cnt--;
        System.out.println("삭제가 완료되었습니다.");
    }

    public void showAll() {
        for (int i = 0; i < cnt; i++) {
            phArr[i].showPhoneInfo();
        }
    }
}

class PhoneUI {
    private static final int Max_CNT = 100;
    private static PhoneBook book = PhoneBook.onePhoneBook(Max_CNT);// onePhoneBook 메서드에서 객체를 생성하기 때문에 여기서는 생성자에 값 넣어주고
                                                                    // 호출만하면 리턴해온다.
    public static Scanner sc = new Scanner(System.in); // 여러 메소드에서 공통으로 사용하기 위해서 > 여러 메소드에서 입력받는 경우 여러번 생성하지 않고 한번 생성해서
                                                        // 공유하면 된다.

    public static final int INPUT_PHONEINFO = 1;
    public static final int SEARCH_PHONEINFO = 2;
    public static final int DELETE_PHONEINFO = 3;
    public static final int SHOW_ALL_PHONEINFO = 4;
    public static final int PROGRAM_QUIT = 5;

    public static final int GENERAL = 1;
    public static final int UNIVERSITY = 2;
    public static final int COMPANY = 3;

    public static final int YES = 1;
    public static final int NO = 2;

    public static void mainMenu() {
        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.print("선택: ");
    }

    public static void inputMenu() {
        System.out.println("1.일반 2. 대학 3. 회사");
    }

    public static void inputMenuChoice() {
        int choice = 0;
        choice = sc.nextInt();
        sc.nextLine();

        switch (choice) {
        case GENERAL:
            inputGeneralPhoneInfo();
            break;
        case UNIVERSITY:
            inputUniversityPhoneInfo();
            break;
        case COMPANY:
            inputCompanyPhoneInfo();
            break;
        default:
            System.out.println("잘못 입력 하셨습니다.");
        }
    }

    public static void inputGeneralPhoneInfo() {
        String name, phone;

        System.out.println("데이터 입력을 시작합니다.");
        System.out.print("이름: ");
        name = sc.nextLine();
        System.out.print("전화번호: ");
        phone = sc.nextLine();
        book.inputPhoneInfo(new PhoneInfo(name, phone));
        System.out.println("데이터 입력이 완료 되었습니다.");
    }

    public static void inputUniversityPhoneInfo() {
        String name, phone, major;
        int year;

        System.out.println("데이터 입력을 시작합니다.");
        System.out.print("이름: ");
        name = sc.nextLine();
        System.out.print("전화번호: ");
        phone = sc.nextLine();
        System.out.print("전공: ");
        major = sc.nextLine();
        System.out.print("학년: ");
        year = sc.nextInt();
        sc.nextLine();
        book.inputPhoneInfo(new PhoneUnivInfo(name, phone, major, year));
        System.out.println("데이터 입력이 완료되었습니다.");
    }

    public static void inputCompanyPhoneInfo() {
        String name, phone, company;

        System.out.println("데이터 입력을 시작합니다.");
        System.out.print("이름: ");
        name = sc.nextLine();
        System.out.print("전화번호: ");
        phone = sc.nextLine();
        System.out.print("회사: ");
        company = sc.nextLine();
        book.inputPhoneInfo(new PhoneCompanyInfo(name, phone, company));
    }

    public static void searchPhoneInfo() {
        String name;
        System.out.println("데이터 검색을 시작합니다.");
        System.out.println("검색하시고자 하는 이름을 입력하세요.");
        name = sc.nextLine();
        book.searchPhoneInfo(name);
    }

    public static void deletePhoneInfo() {
        String name;
        int result = 0, answer = 0;
        System.out.println("검색하시고자 하는 이름을 입력하세요.");
        name = sc.nextLine();
        result = book.search(name);// 와 나 이거 private으로 놔서 오류나는거였네 야발..
        result = book.search(name);
        if (result != -1) {
            System.out.println("정말 삭제하시겠습니까? 1. Yes 2. No");
            answer = sc.nextInt();
            sc.nextLine();
            switch (answer) {
            case YES:
                book.deletePhoneInfo(result);
                break;
            case NO:
                break;
            default:
                System.out.println("잘못 누르셨습니다.");
            }
        } else
            System.out.println("삭제하시려는 데이터가 없습니다.");
    }

    public static void showAllPhoneInfo() {
        book.showAll();
    }
}

class Practice3 {
    public static void main(String[] args) {
        int choice = 0;

        while (true) {
            PhoneUI.mainMenu();
            choice = PhoneUI.sc.nextInt();
            PhoneUI.sc.nextLine();
            switch (choice) {
            case PhoneUI.INPUT_PHONEINFO:
                PhoneUI.inputMenu();
                PhoneUI.inputMenuChoice();
                break;
            case PhoneUI.SEARCH_PHONEINFO:
                PhoneUI.searchPhoneInfo();
                break;
            case PhoneUI.DELETE_PHONEINFO:
                PhoneUI.deletePhoneInfo();
                break;
            case PhoneUI.SHOW_ALL_PHONEINFO:
                PhoneUI.showAllPhoneInfo();
                break;
            case PhoneUI.PROGRAM_QUIT:
                return;
            default:
                System.out.println("잘못 선택하셨습니다.");
            }
        }
    }
}
  • 다 클래스로 나눠서 메소드로 나누니까, 그 메소드를 호출하는 메소드를 또 만들어야되서 좀 귀찮긴한데,, 유지보수 생각하면 이 방법이 좋은것같다.

6단계 전화번호부

  1. 단계별 프로젝트 6.

전화번호 관리 프로그램 06단계 문제
우리가 직접 예외의 상황을 정의하고, 해당 예외의 표현을 위한 예외 클래스를 정의해서 단계별 프로젝트에 반영해보고자 한다.

  • 초기 메뉴 선택에서 1, 2, 3, 4 이외의 값을 입력하는 예외상황
  • 데이터 입력의 과정에서 1, 2, 3 이외의 값을 입력하는 예외상황
    이 두 가지 예외상황 모두 그 유형이 동일하니, MenuChoiceException이라는 이름의 예외 클래스를 하나 정의해서 위의 두 상황에 모두 활용하기로 하겠다. 그리고 위의 두 가지 중 어느 예외상황이 발생을 하건, 프로그램의 흐름은 '초기 메뉴 선택'으로 이동하는 것을 원칙으로 하자.
    실행 예
    선택하세요...
  1. 데이터 입력
  2. 데이터 검색
  3. 데이터 삭제
  4. 모든 데이터 보기
  5. 프로그램 종료
    선택 : 6
    6에 해당하는 선택은 존재하지 않습니다.
    메뉴 선택을 처음부터 다시 진행합니다.
    실행 예
    선택하세요...
  6. 데이터 입력
  7. 데이터 검색
  8. 데이터 삭제
  9. 모든 데이터 보기
  10. 프로그램 종료
    선택 : 1
    데이터 입력을 시작합니다.
  11. 일반 2. 대학 3. 회사
    선택>>4
    4에 해당하는 선택은 존재하지 않습니다.
    메뉴 선택을 처음부터 다시 진행합니다.
    선택하세요...
  12. 데이터 입력
  13. 데이터 검색
  14. 데이터 삭제
  15. 모든 데이터 보기
  16. 프로그램 종료
    선택 :
import java.util.Scanner;

class MenuChoiceException extends Exception
{
    private int choice;
    MenuChoiceException(int choice)
    {
        super("유효하지 않은 메뉴 값입니다.");//밑에서 catch에서 e.getMessage()하게되면 이 메시지가 출력된
        this.choice = choice;
    }
    public void showWrongMenu()
    {
        System.out.println( choice + "에 해당하는 선택은 존재하지 않습니다.");
        System.out.println("메뉴 선택을 처음부터 다시 진행합니다.");
    }
}

class PhoneInfo
{
    private String name;
    private String phone;

    PhoneInfo(String name, String phone)
    {
        this.name = name;
        this.phone = phone;
    }
    public String getName()
    {
        return name;
    }
    public void showPhoneInfo()
    {
        System.out.println("이름 : " + name);
        System.out.println("전화번호 : " + phone);
    }
}

class PhoneUnivInfo extends PhoneInfo
{
    private String major;
    private int year;

    PhoneUnivInfo(String name ,String phone, String major, int year)
    {
        super(name, phone);
        this.major = major;
        this.year = year; 
    }
    public void showPhoneInfo()
    {
        super.showPhoneInfo();
        System.out.println("전공 : " + major);
        System.out.println("학년 : " + year);
    }
}

class PhoneCompanyInfo extends PhoneInfo
{
    private String company;

    PhoneCompanyInfo(String name ,String phone, String company)
    {
        super(name, phone);
        this.company = company;
    }
    public void showPhoneInfo()
    {
        super.showPhoneInfo();
        System.out.println("회사 : " + company);
    }
}

class PhoneBook
{
    private static PhoneBook pb;
    private PhoneInfo[] pInfo;
    private int cntOfPhone;
    private int sizePhoneInfo;
    private PhoneBook(int sizePhoneInfo)
    {
        pInfo = new PhoneInfo[sizePhoneInfo];
        cntOfPhone = 0;
        this.sizePhoneInfo = sizePhoneInfo;
    }
    public static PhoneBook getPhoneBookInst(int sizePhoneInfo)
    {
        if(pb == null)
            pb = new PhoneBook(sizePhoneInfo);
        return pb;
    }
    public void inputPhoneInfo(PhoneInfo pInfo)
    {
        int i = 0, j=0;
        if(cntOfPhone >= sizePhoneInfo)
        {
            System.out.println("더 이상 저장할 수 없습니다.");
            return;
        }
        for(i=0;i<cntOfPhone;i++)
        {
            if(this.pInfo[i].getName().compareTo(pInfo.getName()) > 0)
            {
                for(j=cntOfPhone-1;j>=i;j--)
                {
                    this.pInfo[j+1] = this.pInfo[j];
                }
                break;
            }
        }
        this.pInfo[i] = pInfo;
        cntOfPhone++;
    }
    public void searchPhoneInfo(String name)
    {
        int result = search(name);
        if(result != -1)
            pInfo[result].showPhoneInfo();
        else
            System.out.println("찾으시는 데이터가 없습니다.");
    }
    public void deletePhoneInfo(int idx)
    {
        int i=0;
        for(i=idx;i<cntOfPhone-1;i++)
            pInfo[i] = pInfo[i+1];
        pInfo[i] = null;
        cntOfPhone--;
        System.out.println("삭제가 완료되었습니다.");
    }


    public int search(String name)
    {
        for(int i=0;i<cntOfPhone;i++)
        {
            if(pInfo[i].getName().compareTo(name) == 0)
                return i;
        }
        return -1;        
    }

    public void showAllPhoneInfo()
    {
        for(int i=0;i<cntOfPhone;i++)
            pInfo[i].showPhoneInfo();
    }
}

interface PhoneMenuString
{
    int INPUT_PHONEINFO = 1;
    int SEARCH_PHONEINFO = 2;
    int DELETE_PHONEINFO = 3;
    int SHOW_ALL_PHONEINFO = 4;
    int PROGRAM_QUIT = 5;

    int GENERAL     = 1;
    int UNIVERCITY     = 2;
    int COMPANY     = 3;

    int YES = 1;
    int NO = 2;
}

class PhoneUI
{
    private static final int MAX_CNT=100;
    public static Scanner sc = new Scanner(System.in);
    private static PhoneBook pb = PhoneBook.getPhoneBookInst(MAX_CNT);



    public static void mainMenu()
    {
        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.print("선택 : ");
    }

    public static void inputMenu()
    {
        System.out.println("1. 일반, 2. 대학, 3. 회사");
    }
    public static void inputMenuChoice() throws MenuChoiceException
    {
        int choice=0;
        choice = sc.nextInt();
        sc.nextLine();
        if(choice < PhoneMenuString.GENERAL || choice > PhoneMenuString.COMPANY)
            throw new MenuChoiceException(choice);
        switch(choice)
        {
        case PhoneMenuString.GENERAL:
            inputGeneralPhoneInfo();
            break;
        case PhoneMenuString.UNIVERCITY:
            inputUniversityPhoneInfo();
            break;
        case PhoneMenuString.COMPANY:
            inputCompanyPhoneInfo();
            break;
        }
    }

    public static void inputGeneralPhoneInfo()
    {
        String name;
        String phone;

        System.out.println("데이터 입력을 시작합니다.");
        System.out.print("이름 : ");
        name = sc.nextLine();
        System.out.print("전화번호 : ");
        phone = sc.nextLine();
        System.out.println("데이터 입력이 완료되었습니다.");
        pb.inputPhoneInfo( new PhoneInfo(name, phone) );
    }

    public static void inputUniversityPhoneInfo()
    {
        String name;
        String phone;
        String major;
        int year;

        System.out.println("데이터 입력을 시작합니다.");
        System.out.print("이름 : ");
        name = sc.nextLine();
        System.out.print("전화번호 : ");
        phone = sc.nextLine();
        System.out.print("전공 : ");
        major = sc.nextLine();
        System.out.print("학년 : ");
        year = sc.nextInt();
        sc.nextLine();
        System.out.println("데이터 입력이 완료되었습니다.");
        pb.inputPhoneInfo( new PhoneUnivInfo(name, phone, major, year) );
    }

    public static void inputCompanyPhoneInfo()
    {
        String name;
        String phone;
        String company;

        System.out.println("데이터 입력을 시작합니다.");
        System.out.print("이름 : ");
        name = sc.nextLine();
        System.out.print("전화번호 : ");
        phone = sc.nextLine();
        System.out.print("회사 : ");
        company = sc.nextLine();
        System.out.println("데이터 입력이 완료되었습니다.");
        pb.inputPhoneInfo( new PhoneCompanyInfo(name, phone, company) );
    }

    public static void searchPhoneInfo()
    {
        String name;
        System.out.println("데이터 검색을 시작합니다.");
        System.out.println("검색하시고자 하는 이름을 입력하세요.");
        name = sc.nextLine();
        pb.searchPhoneInfo(name);            
    }
    public static void deletePhoneInfo()
    {
        String name;
        int result=0;
        int answer=0;
        System.out.println("검색하시고자 하는 이름을 입력하세요.");        
        name = sc.nextLine();        
        result = pb.search(name);
        if(result != -1)
        {
            System.out.println("정말 삭제하시겠습니까? 1. Yes 2. No");
            answer = sc.nextInt();
            sc.nextLine();
            switch(answer)
            {
            case PhoneMenuString.YES:
                pb.deletePhoneInfo(result);
                break;
            case PhoneMenuString.NO:
                break;
            default:
                System.out.println("잘못 누르셨습니다.");
            }
        }
        else
            System.out.println("삭제하시려는 데이터가 없습니다.");
    }
    public static void showAllPhoneInfo()
    {
        pb.showAllPhoneInfo();
    }
}

class PhoneMain
{        
    public static void main(String[] args)
    {
        int choice=0;

        while(true)
        {            
            try
            {
                PhoneUI.mainMenu();
                choice = PhoneUI.sc.nextInt();
                PhoneUI.sc.nextLine();
                if(choice < PhoneMenuString.INPUT_PHONEINFO || choice > PhoneMenuString.PROGRAM_QUIT)
                    throw new MenuChoiceException(choice);

                switch(choice)
                {
                    case PhoneMenuString.INPUT_PHONEINFO:
                        PhoneUI.inputMenu();
                        PhoneUI.inputMenuChoice();
                        break;
                    case PhoneMenuString.SEARCH_PHONEINFO:
                        PhoneUI.searchPhoneInfo();
                        break;
                    case PhoneMenuString.DELETE_PHONEINFO:
                        PhoneUI.deletePhoneInfo();
                        break;
                    case PhoneMenuString.SHOW_ALL_PHONEINFO:
                        PhoneUI.showAllPhoneInfo();
                        break;
                    case PhoneMenuString.PROGRAM_QUIT:
                        return;

                }
            }
            catch(MenuChoiceException e)
            {
                System.out.println(e.getMessage());
                e.showWrongMenu();
            }                    
        }
    }
}

checked 예외처리

package com.test.joeun;

public class Extest1 {

    public static void main(String[] args) {

        //throw new Exception(); - error
        // Exception은 checked 예외이므로 반드시 catch문이 있어야한다. > 컴파일도 되지 않음
        try {
            throw new Exception();
        } catch (Exception e) {

        } // 이렇게 처리해야한다. 명시해서 던져주는것은 메인메소드에서 의미 없기 떄문에
    }
}

사용자 정의 예외를 발생시켜 해당 예외를 처리하는 예제

package com.test.memo;

import java.util.Scanner;

class MenuException extends Exception {//사용자 정의 예외이므로 Exception상속 
    private int wrongMenu;

    public MenuException(int wrongMenu) {//생성자에서 번호를 받아와 번호가 무엇인지 메시지로 출력, 내부 필드에 저
        super(wrongMenu + "은 없는 메뉴입니다.");
        this.wrongMenu = wrongMenu;
    }
}

public class Practice3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int menu = 0;
        while (true) {
            System.out.println("1.메뉴2.메뉴3.메뉴4.메뉴");
            menu = sc.nextInt();
            try {
                if (menu < 1 || menu > 4)//사용자의 값이 범위를 벗어날 경우 MenuException예외를 발생시키고, 해당 예외를 catch하여 예외메시지를 출력한다.
                    throw new MenuException(menu);
                switch (menu) {//각각의 동작을 수행하는 부분을 추가할 수 있다.
                case 1:
                    break;
                default:
                    break;
                }
            } catch (MenuException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}
  • e.getMessage() 가 사용자 정의 예외 클래스의 생성자를 호출하는것이기 때문에 범위를 초과하면 해당 번호를 출력하며 없는 메뉴입니다.라고 출력된다.

  • 이렇게 하면 잘못된 메뉴를 입력했을 때 예외를 처리할 수 있다.

  • 일반적으로 특별한 예외 처리 로직이 필요한 경우나, 예외를 더 잘 구분하고싶을떄 사용된다. 막 쓰면 코드 양이 늘어나고 관리가 어렵다.


clone()메서드를 이용해 객체 복사

  • Cloneable인터페이스를 구현하지 않으면 CloneNotSupportedException이 발생한다
package com.test.joeun;

class Person implements Cloneable {// Cloneable 인터페이스를 구현해야지만 clone메서드를 사용할 수 있다.
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println(name + " " + age);
    }

    @Override // alt + shift + s > v 하면 오버라이딩 간편하게 가능
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

public class Extest1 {

    public static void main(String[] args) {
        Person person = new Person("홍길동", 20);
        // Person cpyPerson = (Person) person.clone(); > error > clone()메서드는 checked
        // 예외이므로 예외처리를 반드시 해야한다.
        try {
            Person cpyPerson = (Person) person.clone();// clone()의 자료형은 Object니까 형변환 시켜야한다.
            person.show();
            cpyPerson.show();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

    }
}
  • 저렇게 굳이 형변환 시키고 싶지 않다면 아래와 같이 새로운 메서드를 추가해 형변환 시킨 채로 리턴시키면 된다.
 package com.test.joeun;


class Person implements Cloneable {// Cloneable 인터페이스를 구현해야지만 clone메서드를 사용할 수 있다.
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println(name + " " + age);
    }

    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();// 메인 메서드에서 굳이 형변환 시킬 필요없게
    }

//    @Override // alt + shift + s > v 하면 오버라이딩 간편하게 가능
//    protected Object clone() throws CloneNotSupportedException {
//        return super.clone();
//    }

}

public class Extest1 {

    public static void main(String[] args) {
        Person person = new Person("홍길동", 20);
        // Person cpyPerson = (Person) person.clone(); > error > clone()메서드는 checked
        // 예외이므로 예외처리를 반드시 해야한다.
        try {
            Person cpyPerson = person.clone();// 위에서 메서드를 새로 넣어서 형변환 시켜서 return하기 때문에 형변환 필요없다.
            person.show();
            cpyPerson.show();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

  • 만약 Cloneable 인터페이스를 구현하지 않았다면
package com.test.joeun;

class Person { // implements Cloneable {// Cloneable 인터페이스를 구현해야지만 clone메서드를 사용할 수 있다.
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println(name + " " + age);
    }

    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();// 메인 메서드에서 굳이 형변환 시킬 필요없게
    }

    public class Extest1 {

        public static void main(String[] args) {
            Person person = new Person("홍길동", 20);
            try {
                //Person avata = new person.clone(); 객체 복제시에는 new를 사용하지 않는다.
                Person cpyPerson = person.clone();// 위에서 메서드를 새로 넣어서 형변환 시켜서 return하기 때문에 형변환 필요없다.
                person.show();
                cpyPerson.show();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
                System.out.println("Cloneable 인터페이스를 구현하세요");//콘솔창에 이렇게 표시 가능 
            }

        }
    }
}

0개의 댓글