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