원하는 클래스 명에 커서 + 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 (언더바 보고 해당 스펠링 누르면 바로 선택) > 생성자를 만들어준다.
Generate toString() > toString자동 생성해준다. (언더바 보고 해당 스펠링 누르면 바로 )
Override / implments Method : 오버라이딩 시켜주는..
Generate getters and setters to create : getter메서드 와 setter메서드를 쫙 만들어준다.
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 해준다.
ctrl + shift + G : 해당 클래스나 메서드가 어디서 호출되고 있는지 알고싶을 때
일반 화면에서 ctrl + m : 창들이 다 사라지고 최대화 > 다시 누르면 창들 다시 나온다.
클래스 이름에 대고 F4를 누르면 계층도를 보여준다. > 해당 클래스의 계층도 전체는 OutLine
Ctrl + T도 새로운 창의 형태로 계층도를 보여준다.ctrl + 1 : 어떤식으로 오류를 해결할지 추천한다. > 오류 밑줄에 마우스 커서 올려놓으면 뜨는것과 같음
ctrl + e : 파일창이 뜬다.
ctrl + F7 : 원하는 Views로 이동한다 (콘솔, 디버그, 오류, OutLine등)

alt + a)package com.test.memo;
public class GoodImpl implements Good {
@Override
public void hi() {
}
@Override
public void bye() {
}
}
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("잘못 선택하셨습니다.");
}
}
}
}
전화번호 관리 프로그램 06단계 문제
우리가 직접 예외의 상황을 정의하고, 해당 예외의 표현을 위한 예외 클래스를 정의해서 단계별 프로젝트에 반영해보고자 한다.
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();
}
}
}
}
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() 가 사용자 정의 예외 클래스의 생성자를 호출하는것이기 때문에 범위를 초과하면 해당 번호를 출력하며 없는 메뉴입니다.라고 출력된다.
이렇게 하면 잘못된 메뉴를 입력했을 때 예외를 처리할 수 있다.
일반적으로 특별한 예외 처리 로직이 필요한 경우나, 예외를 더 잘 구분하고싶을떄 사용된다. 막 쓰면 코드 양이 늘어나고 관리가 어렵다.
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();
}
}
}

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 인터페이스를 구현하세요");//콘솔창에 이렇게 표시 가능
}
}
}
}
