728x90
수업내용 정리 (Java)
1. PhoneBook
1-1) Main ㄱ
더보기
package controller;
import java.util.Scanner;
public class Main {
public static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
PhoneBookManager manager = new PhoneBookManager();
while(true) {
showMenu();
int menu = sc.nextInt();
System.out.println();
switch(menu) {
case 1:
System.out.println("===> 전화번호 입력");
showSub();
System.out.print("메뉴선택> ");
manager.inputData(sc.nextInt());
break;
case 2:
System.out.println("===> 전화번호 검색");
manager.serchData();
break;
case 3:
System.out.println("===> 전화번호 수정");
manager.correctionData();
break;
case 4:
System.out.println("===> 전화번호 삭제");
manager.deletData(); // 아직 안 햇음
break;
case 5:
System.out.println("===> 전체 목록");
manager.showAllData();
break;
case 0:
System.out.println(" > 프로그램을 종료합니다.");
return; // 값을 반환하면서 while 문을 나간다.
default:
}
System.out.println();
}
}
private static void showMenu() {
System.out.println("===== 전화번호부 =====");
System.out.println("""
------------------
1. 전화번호 입력
2. 전화번호 검색
3. 전화번호 수정
4. 전화번호 삭제
5. 전체 목록 출력
0. 프로그램 종료
------------------ """);
System.out.print("메뉴선택> ");
}
private static void showSub() {
System.out.println("""
------------------
1. 일반
2. 대학
3. 회사
> 다른 번호 입력 시 메인으로 돌아갑니다.
------------------ """);
System.out.print("메뉴선택> ");
}
}
- 클래스를 배우면서 메인은 간소화하고 manager이라는 클래스를 만들어 메소드를 저장해 사용하는 방법을 배웠다.
- 메뉴도 while문 밖에서 메인 클래스의 메소드로 작성해서 메인 메소드를 간단화했다.
- 처음에는 전화번호 입력, 전체 출력, 프로그램 종료만 했다가 조금씩 추가해서 총 6개의 메뉴가 생겼다.
- 15일차에 배웠던 텍스트 블록을 응용해서 메뉴 선택을 작성해봤다.
1-2) PhoneInfo ㄱ
더보기
package bean;
public class PhoneInfo {
private String name;
private String phoneNum;
private String birth;
// 생성자
public PhoneInfo(String name, String phoneNum, String birth) {
this.name = name;
this.phoneNum = phoneNum;
this.birth = birth;
}
public PhoneInfo(String name, String phoneNum) {
this.name = name;
this.phoneNum = phoneNum;
}
// 메소드
public void showPhoneInfo(){
System.out.println(" ▸ 이름\t\t: "+name);
System.out.println(" ▸ 전화번호\t: "+phoneNum);
if(birth!=null)
System.out.println(" ▸ 생일\t\t: "+birth);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
@Override
public String toString() {
String str = " ▸ 이름\t\t: "+name+"\n ▸ 전화번호\t: "+phoneNum;
if(birth!=null)
str += "\n ▸ 생일\t\t: "+birth;
return str;
}
}
- 일반 클래스
- 대학, 회사 클래스의 부모클래스가 되는 클래스
- showPhoneInfo 메소드로 정보를 출력하지만 toString 메소드를 오버라이딩해서 사용하는 방법도 연습 겸 사용해봤다.
1-3) PhoneUnivInfo ㄱ
더보기
package bean;
public class PhoneUnivInfo extends PhoneInfo {
private String major;
private int year;
public PhoneUnivInfo(String name, String phoneNum, String major, int year) {
super(name, phoneNum);
this.major = major;
this.year = year;
}
public PhoneUnivInfo(String name, String phoneNum, String birth, String major, int year) {
super(name, phoneNum, birth);
this.major = major;
this.year = year;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public void showPhoneInfo() {
super.showPhoneInfo();
System.out.println(" ▸ 전공\t\t: "+major);
System.out.println(" ▸ 학년\t\t: "+year);
}
@Override
public String toString() {
String str = (super.toString())+"\n ▸ 전공\t\t: "+major+"\n ▸ 학년\t\t: "+year;
return str;
}
}
- 대학 클래스 (자식 클래스)
- 부모클래스로 PhoneInfo 클래스(일반)를 상속한다.
- 부모클래스에서 갖고있는 필드, 생성자, 메소드가 보이진 않지만 존재한다.
- 부모클래스에서 갖고있는 생성자에 추가하여 사용하려면 부모클래스에 있는 클래스와 같은 형식의 생성자를 만들고, 매개변수를 추가하여 사용한다.
- 부모클래스에 있는 필드를 저장하려고 매개변수로 받아온 값은 super();을 통해 저장할 수 있다.
- 부모클래스의 메소드에 추가하여 사용하려면 부모클래스에 있는 메소드를 오버라이딩하면 된다.
- super();을 통해 부모클래스의 메소드를 가져오고 추가로 행할 코드를 밑에 작성하면 부모클래스의 메소드와 추가로 행할 코드가 같이 동작한다.
1-4) PhoneCompanyInfo ㄱ
더보기
package bean;
public class PhoneCompanyInfo extends PhoneInfo {
private String company;
public PhoneCompanyInfo(String name, String phoneNum, String company) {
super(name, phoneNum);
this.company = company;
}
public PhoneCompanyInfo(String name, String phoneNum, String birth, String company) {
super(name, phoneNum, birth);
this.company = company;
}
@Override
public void showPhoneInfo() {
super.showPhoneInfo();
System.out.println(" ▸ 회사\t\t: "+company);
}
@Override
public String toString() {
String str = (super.toString())+"\n ▸ 회사\t\t: "+company;
return str;
}
}
- 회사 클래스 (자식 클래스)
- 부모클래스로 PhoneInfo 클래스(일반)를 상속한다.
- 부모클래스인 일반 클래스를 상속하고 있기 때문에 (같은 부모를 상속하고 있는)대학 클래스와는 상관없이 일반 클래스에서만 가져올 수 있다.
1-5) PhoneBookManager ㄱ
더보기
- manager
package controller;
import bean.PhoneInfo;
import bean.PhoneUnivInfo;
import bean.PhoneCompanyInfo;
- import
private PhoneInfo[] phoneList = new PhoneInfo[100];
private int cnt = 0; //index와 목록 개수
private int a;
private String name;
private String phoneNum;
private String birth;
- 필드 값
public PhoneBookManager(int size) {
cnt = 0;
this.phoneList = new PhoneInfo[size];
}
- 생성자
public void inputData() {
System.out.println();
switch(sub) {
case 1:
nomalInputData();
break;
case 2:
uivInputData();
break;
case 3:
compInputData();
break;
default:
}
}
- Main의 case 1에 해당하는 메소드
- Main에서 switch를 사용해 메뉴를 만들었기 때문에 여기서도 switch를 사용하기로 했다.
- 일반, 대학, 회사. 선택에 따라 저장할 값이 다르기 때문에 메소드를 따로 만들었다.
private void data() {
birth = null;
System.out.print(" 이름 입력> ");
name = Main.sc.next();
System.out.print(" 전화번호 입력> ");
phoneNum = Main.sc.next();
System.out.print(" 생일을 입력하시겠습니까?\n(Y/y)> ");
String Y = Main.sc.next();
if(Y.equals("Y") || Y.equals("y")) {
System.out.print(" 생년월일 입력> ");
birth = Main.sc.next();
}
}
- inputData에서 값을 저장하기 위해 공통으로 사용할 코드
- Scanner는 Main이 import 해왔기 때문에 같은 패키지 소속인 PhoneBookManager이 Main을 언급하며 사용할 수 있다. ex) Main.sc.next();
- birth는 입력하지 않을 수 있기 때문에 초반에 값을 null로 지워주고 name, phoneNum, 상황에 따라 birth를 입력받는다.
private void nomalInputData() {
System.out.println(" -> 일반");
data();
if(birth == null) {
PhoneInfo info = new PhoneInfo(name, phoneNum);
phoneList[cnt++] = info;
}else {
PhoneInfo info = new PhoneInfo(name, phoneNum, birth);
phoneList[cnt++] = info; //++cnt 는 전치라서 카운트를 먼저 하고 저장함
}
}
- inputData에서 일반 선택 시
- data 메소드를 사용하여 name, phoneNum, (상황에 따라)birth 값을 새로 저장하고 if문을 통해 birth가 null값인지 아닌지 구분함에 따라 생성자를 사용하여 저장한다.
private void uivInputData() {
System.out.println(" -> 대학");
data();
System.out.print(" 전공 입력> ");
String major = Main.sc.next();
System.out.print(" 학년 입력> ");
int year = Main.sc.nextInt();
if(birth == null) {
PhoneInfo info = new PhoneUnivInfo(name, phoneNum, major, year);
phoneList[cnt++] = info;
}else {
PhoneInfo info = new PhoneUnivInfo(name, phoneNum, birth, major, year);
phoneList[cnt++] = info;
}
}
- inputData에서 대학 선택 시
- nomalInputData 메소드를 기본 틀로 잡고 추가로 major, year을 입력받아 저장한다.
private void compInputData() {
System.out.println(" -> 회사");
data();
System.out.print(" 회사 입력> ");
String company = Main.sc.next();
if(birth == null) {
PhoneInfo info = new PhoneCompanyInfo(name, phoneNum, company);
phoneList[cnt++] = info;
}else {
PhoneInfo info = new PhoneCompanyInfo(name, phoneNum, birth, company);
phoneList[cnt++] = info;
}
}
- inputData에서 회사 선택 시
- nomalInputData 메소드를 기본 틀로 잡고 추가로 company를 입력받아 저장한다.
public void showAllData() {
System.out.println("----------------");
for(int i=0; i<cnt; i++) {
phoneList[i].showPhoneInfo();
System.out.println("----------------");
}
}
- phoneList에 저장한 모든 값을 출력하는 메소드
- 출력은 phoneInfo 클래스의 메소드를 사용했다.
private int searchIdx(String name) {
a = -1;
for(int i=0; i<cnt; i++) {
if(name.equals(phoneList[i].getName())) {
a = i;
break;
}
}
return a;
}
- 검색, 수정, 삭제에서 사용할 코드를 줄이기 위해 만든 메소드
- a의 값을 -1로 지워준다.
- 입력받은 name과 동일한 name이 있는지 검색해서 있으면 a에 값을 저장하고 a 값을 return한다.
public void serchData() {
System.out.print(" 검색할 이름> ");
String name = Main.sc.next();
int idx = searchIdx(name);
if(idx == -1) {
System.out.println(" > 정보를 찾을 수 없습니다.");
}else {
phoneList[idx].showPhoneInfo();
}
}
- Main에서 case 2에 해당하는 메소드
- 검색할 이름을 입력받고, searchIdx 메소드를 사용해 a값을 새로운 변수 idx에 저장한다.
- idx 값이 -1일 경우 정보를 찾을 수 없다는 메소드를 사용하고, -1이 아닐 경우 idx 값에 해당하는 phoneList 인덱스를 출력한다.
public void correctionData() {
System.out.print(" 수정할 이름> ");
String name = Main.sc.next();
int idx = searchIdx(name);
if(idx == -1) {
System.out.println(" > 정보를 찾을 수 없습니다.");
}else {
phoneList[idx].showPhoneInfo();
System.out.print(" 수정할 이름 입력> ");
phoneList[idx].setName(Main.sc.next());
System.out.print(" 수정할 전화번호 입력> ");
phoneList[idx].setPhoneNum(Main.sc.next());
System.out.println(" > 정보 수정이 완료되었습니다.");
}
}
- Main에서 case 3에 해당하는 메소드
- 수정할 이름을 입력받고, idx 값이 -1이 아닐 경우 이름과 전화번호를 수정받는다.
public void deletData() {
System.out.print(" 삭제할 이름> ");
String name = Main.sc.next();
int idx = searchIdx(name);
if(idx == -1) {
System.out.println(" > 정보를 찾을 수 없습니다.");
}else {
phoneList[idx].showPhoneInfo();
for(int i=idx; i<cnt-1; i++) {
phoneList[i] = phoneList[i+1];
}
cnt--;
System.out.println(" > 정보를 성공적으로 삭제했습니다.");
}
}
- Main에서 case 4에 해당하는 메소드
- 삭제할 이름을 입력받고, idx 값이 -1이 아닐 경우 삭제할 이름이 있는 인덱스의 뒤부터 한 칸씩 앞으로 앞당겨서 값을 덮어쓴다.
질문한 내용이나 어려웠던 점 메모
1. 수정 (질문할 예정)
- 수정할 이름을 입력받고 클래스에 따라 수정을 다르게 하고 싶었는데 아직 수정 코드를 작성하라고 하지 않으신 상태여서 나중에 다시 여쭤보기로 했다.
2. 삭제
- for문을 한 번만 쓰면서 삭제할 자리의 뒤부터 한 칸씩 앞으로 앞당기기를 해보려고 했는데 for문을 한 번만 사용하니 자꾸 null값이 뜨고 그래서 결국 성공하지 못했다..
728x90
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 19일차 (23/10/17) - Java (2) | 2023.10.17 |
---|---|
수업일지 18일차 (23/10/16) - Java (1) | 2023.10.16 |
수업일지 16일차 (23/10/12) - Java (2) | 2023.10.12 |
수업일지 15일차 (23/10/11) - Java (1) | 2023.10.11 |
수업일지 14일차 (23/10/10) - Java (0) | 2023.10.10 |