분류 전체보기 (135)

728x90

 

수업내용 정리 (Java)

 

1. 객체 비교

더보기
IntNumber num1 = new IntNumber(10);
IntNumber num2 = new IntNumber(10);

 

// == 연산자
if(num1 == num2) {
	System.out.println("참조값 비교");
}else {
	System.out.println("참조값이 다르다.");
}
  • 객체의 주소값(참조값)을 비교하는 역할

 

// .equals 메소드
if(num1.equals(num2)) {
	System.out.println("오버라이딩 전 참조값 비교, 오버라이딩 후 내용 비교");
}else {
	System.out.println("오버라이딩 전 참조값/후 내용이 다르다");
}
  • 객체를 비교할 때에는 오버라이딩하지 않는 이상 참조값을 비교하는 것이다.
  • 원래 equals 메소드의 경우, Object 클래스의 메소드라서 == 연산자와 동일하게 주소값을 비교하도록 하는 메소드지만 String 타입에서는 내용 비교가 가능한 이유가 String 클래스에서 Object 메소드를 오버라이딩했기 때문이다.
@Override
public boolean equals(Object obj) {
	IntNumber cmp = (IntNumber)obj;
	if(this.num == cmp.num) {
		return true;
	}
	return false;
}
  • 오버라이딩을 통해 내용 비교로 바꿀 수 있다.

 

 

// 예제
package part1;

class Book{
	private String title;	//책제목
	private String author;	//작가
	private int price;
	public Book(String title, String author, int price) {
		this.title = title;
		this.author = author;
		this.price = price;
	}
	
	@Override
	public String toString() {
		return " > title: "+title+"\t("+author+")";
	}

	@Override
	public boolean equals(Object obj) {
		Book book = (Book)obj;
		if(this.title.equals(book.title)
				&& this.author.equals(book.author)
				&& this.price == book.price) {
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		return price%5;	//나머지 0~4(해시값)
	}
	
}

public class Ex01 {
	public static void main(String[] args) {
		Book b1 = new Book("삼국지","홍길동",1000);
		Book b2 = new Book("삼국지","홍길동",1200);
		Book b3 = new Book("삼국지","이순신",1000);
		
		System.out.println(b1 == b2);	// 참조값 비교
		System.out.println("참조값 주소\t"+System.identityHashCode(b1));
		System.out.println("해시 값\t"+b1.hashCode());
		
		if(b1.equals(b2)) {
			System.out.println("b1과 b2는 동일 도서");
		}else
			System.out.println("b1과 b2는 비동일 도서");
		if(b1.equals(b3)) {
			System.out.println("b1과 b3는 동일 도서");
		}else {
			System.out.println("b1과 b3는 비동일 도서");
		}
	}
}
  • hashCode(): 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값 / 이 또한 오버라이딩해서 사용할 수 있다.
  • .equals를 오버라이딩해서 객체의 title, author, price가 셋 다 맞아야 같은 책이라는 조건을 넣었다.

 

 

2. int / Integer

더보기
  • int
  • 변수 타입
  • 자료형
  • 산술 연산 가능
  • null 값 지정 불가

 

  • Integer
  • 객체 타입
  • 래퍼클래스
  • Unboxing하지 않을 시 산술 연산 불가능 (지금은 자동으로 Boxing / Unboxing이 된다)
  • null 값 지정 가능

 

 

public class Ex01 {
	public static void main(String[] args) {
		Integer iInst = new Integer(10);
		Double dInst = new Double(3.14);
		
		iInst = new Integer(iInst.intValue()+10);
		System.out.println(iInst);
		System.out.println(dInst);
	}
}
  • Integer iInst = new Integer(10); 이 코드를 작성하면 취소선과 함께 노란색 밑줄이 쳐지는데 이클립스가 개선되면서 이렇게 풀어쓰지 않아도 된다는 뜻이므로 프로그램은 정상적으로 돌아간다. (Integer iInst = 10;과 동일한 코드) 밑의 Double도 동일
  • iInst = new Integer(iInst.intValue()+10); 이 코드를 작성해도 취소선과 함께 노란색 밑줄이 쳐진다. (iInst+=10;과 동일한 코드)

 

public class Ex02 {
	public static void main(String[] args) {
		Integer num1 = new Integer(10);
		Integer num2 = 10;
		
		if(num1 == num2) {
			System.out.println("참조값 비교");
		}else {
			System.out.println("참조값 다름");
		}
		if(num1.equals(num2)) {
			System.out.println("내용 비교");
		}else {
			System.out.println("내용 다름");
		}
	}
}
  • 콘솔창: 참조값 다름, 내용 비교 출력

 

 

3. 소수점 절대값 내기 (BigDecimal)

더보기
import java.math.BigDecimal;
import java.util.Scanner;

public class Ex04 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("5.5 입력> ");
		BigDecimal num1=new BigDecimal(sc.next());
		System.out.print("10.7 입력> ");
		BigDecimal num2=new BigDecimal(sc.next());
		
		System.out.println("절대값: "+num1.subtract(num2).abs());
	}
}
  • (아직 BigDecimal에 대해 잘 모르겠다.)
  • BigDecimal은 자바 언어에서 숫자를 정밀하게 저장하고 표현할 수 있는 유일한 방법이다. (참고)
  • .abs는 인자값에 대한 절대값을 반환해준다.

 

 

4. Random

더보기
Random rd = new Random();
  • Random 함수를 사용하기 위해서는 import해야한다.

 

// 선생님이 예제로 보여주신 방법
for(int i=0; i<5; i++) {
	System.out.print((int)(Math.random()*10)+" ");
}
// 기존에 내가 찾아뒀던 방법
for(int i=0; i<5; i++) {
	System.out.print(rd.nextInt(10)+" ");
}
  • (나는 내가 기존에 찾아뒀던 방법이 편하다고 생각한다.)

 

// 문제) 중복되지 않는 6개의 정수(1~14)를 배열에 저장 후 출력하시오
int[] a = new int[6];
		
for(int i=0; i<a.length; i++) {
	a[i] = rd.nextInt(13)+1;
	for(int j=0; j<i; j++) {
		if(a[i] == a[j]) {
			i--;
			break;
		}
	}
}
Arrays.sort(a);
for(int i=0; i<a.length; i++) {
	System.out.println(a[i]);
}
  • 랜덤한 숫자를 중복되지 않게 6개 뽑아내고, 배열에 저장해 출력하기
  • 첫번째 숫자(배열의 0번째 인덱스)를 뽑을 때는 그냥 뽑지만 두번째 숫자(배열의 1번째 인덱스)부터는 for문을 다시 돌려 i번째 인덱스와 j번째 인덱스가 같으면 i-1을 해주며 두번째 for문인 j for문을 종료하고 다시 큰 for문을 돌린다.
  • 배열에 숫자를 모두 저장하고 나면 Arrays.sort 함수를 이용하여 배열 내 숫자들을 순서대로 정리해줬다.
  • for문을 돌려 배열에 저장된 숫자들을 순서대로 출력했다.

 


 

질문한 내용이나 어려웠던 점 메모

1. BigDecimal

 


728x90
728x90

 

수업내용 정리 (Java)

 

1. 테스트

더보기
// 문제
public static void main(String[] args) {
	System.out.println("1번");
	operation(10,3);
	//덧셈 결과: 13
	//뺄셈 결과: 7
	//곱셈 결과: 30
	//몫 결과: 3
	//나머지 결과: 1
	
	System.out.println("\n2번");
	abs(10, 3);	//두 수 차의 절대값(거리의 개념): 7
	abs(3, 10);	//두 수 차의 절대값: 7
	
   	System.out.println("\n3번");
	System.out.println("원 둘레: "+cirRound(2.4));	//반지름
	// 원 둘레: (반지름*2)*3.14 / Math.PI
	System.out.println("원 넓이: "+cirArea(2.4));
	// 원 넓이: (반지름*반지름)*3.14
	
	System.out.println("\n4번");
	for(int i=2; i<11; i++) {
		if(isEven(i)) {	// 짝수 2,4,6,8,10
			System.out.println("숫자 "+i+"는 짝수입니다.");
		}
	}
}
결과 출력

 

 

// 1번
private static void operation(int i, int j) {
	System.out.println(i+" + "+j+" = "+(i+j));
	System.out.println(i+" - "+j+" = "+(i-j));
	System.out.println(i+" * "+j+" = "+(i*j));
	System.out.println(i+" / "+j+" = "+(i/j));
	System.out.println(i+" % "+j+" = "+(i%j));
}
  • 간단한 연산자를 출력할 때 sysout에 바로 계산해도 되지만(ex: i+j) 다른 문자와 연결하여 사용할 때는 소괄호()로 묶어서 사용해야 한다.

 

// 2번
private static void abs(int i, int j) {
	if(i>j) {
		System.out.println(i+", "+j+"의 절대값: "+(i-j));
	}else {
		System.out.println(i+", "+j+"의 절대값: "+(j-i));
	}
}
  • 절대값(두 수의 거리)은 음수값이 나오면 안 되기 때문에 if문으로 i가 j보다 작을 경우를 걸러준다.

 

// 3번
private static double cirRound(double d) {
	return d*2*Math.PI;;
}

private static double cirArea(double d) {
	double a = d*d*Math.PI;
	return a;
}
  • return에 값을 바로 반환하거나 임시변수에 값을 저장해서 임시변수를 반환할 수 있다.

 

// 4번
private static boolean isEven(int i) {
	if(i%2 == 0) {
		return true;
	}
	return false;	// return문이 있을때는 else가 없어도 됨
		// return i%2 == 0 도 되긴 하나 비추
}
  • return문일 때는 else가 없어도 된다. (if에서 바로 return하면 되기 때문에)
  • return i%2 == 0 이런 코드도 가능하지만 비추천!

 

2. 추상 클래스 (참고)

  • 하나 이상의 추상 메소드를 포함하는 클래스
  • 반드시 사용할 메소드는 추상 클래스에서 추상 메소드로 선언해두면 이 클래스를 상속하는 모든 클래스가 추상 클래스 내에 있는 모든 메소드를 반드시 재정의(오버라이딩)를 해야 한다.
  • 추상 메소드: 선언부만 남기고 바디를 날린, 동작이 존재하지 않는 메소드
  • public abstract를 붙이지 않아도 붙어있는 것과 동일하게 작동된다.
  • 인터페이스도 일종의 추상 클래스라고 볼 수 있다. (추상 클래스보다 추상화 정도가 높다.)
더보기
public class Ex02 {
	public static void main(String[] args) {
		Print p = new PrintImpl();
		p.printMonitor();
		p.printPaper();
		p.getMonitor();
		p.getPager();
		
	}//end main -> 프로그램 종료
}
  • 컨트롤 타워 (업무 지시만 하는 클래스)

 

public interface Print {
	public abstract void printPaper();
	public abstract void printMonitor();
	String getPager();
	public String getMonitor();	// 권장!
}
  • 인터페이스는 다른 클래스들의 기본 틀이 되는 클래스다.
  • public abstract void를 작성하지 않아도 정상작동하지만, public은 작성하는 것을 권장한다.
  • 정상작동하는 여러가지 방법을 통해 추상 메소드를 작성했다.

 

public class PrintImpl implements Print {
	@Override
	public void printPaper() {
		System.out.println("종이출력");
	}

	@Override
	public void printMonitor() {
		System.out.println("화면출력");
	}

	@Override
	public String getPager() {
		return "종이";
	}

	@Override
	public String getMonitor() {
		return "화면";
	}
}
  • 인터페이스를 상속할 때는 상속이 아닌 구현이라고 한다.
  • 추상 메소드를 오버라이딩해서 동작을 작성했다.

 

 

3. 예제

더보기
public class CalcMain {

	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 3;
		Calc c = new CompleteCalc();
		System.out.println(c.add(num1, num2));
		System.out.println(c.substract(num1, num2));
		System.out.println(c.time(num1, num2));
		System.out.println(c.divide(num1, num2));
		
		//1
		((CompleteCalc)c).divide(num1, num2);
		//2
		CompleteCalc c2 = new CompleteCalc();
		c2.divide(num1, num2);
	}
}
  • 1은 강제형변환, 2는 새로 객체를 만들어서 사용한 코드

 

public interface Calc {
	public final static double PI = 3.14;
	int ERROR = -999999999, OK = 200;
	
	public int add(int num1, int num2);
	public int substract(int num1, int num2);
	public int time(int num1, int num2);
	public int divide(int num1, int num2);
	
	// 인터페이스에 선언된 변수는 무조건 final 변수
}
  • 인터페이스에 선언된 변수는 무조건 final 변수이기 때문에, public final static 까지는 적지 않아도 자동 적용된다.
  • 파이값은 이미 Math.PI로 코드가 있지만 임의로 작성했다.

 

public class Calculator implements Calc {

	@Override
	public int add(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int substract(int num1, int num2) {
		return num1 - num2;
	}

	@Override
	public int time(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public int divide(int num1, int num2) {
		return num1 / num2;
	}
}
  • 인터페이스 Calc를 구현하는 클래스
  • 이렇게만 하면 num1, num2 중 0이 들어가면 divide 메소드에서 오류가 난다.

 

public class CompleteCalc extends Calculator{

	@Override
	public int divide(int num1, int num2) {
		if(num1 == 0 || num2 == 0) {
			return ERROR;	// -9999999
		}
		return num1/num2;
	}
	public void showInpo() {
		System.out.println("나눗셈 개선");
	}
}
  • 인터페이스 Calc를 구현하는 클래스2
  • 위의 클래스에서 오류가 나는 메소드를 개선하기 위해 만들었다. (해당 클래스에서 바로 만들어도 되지만 다른 사람이 나와 동시에 코드를 작성하고 더 나은 코드를 사용할 때 등을 위해서)

 

 

4. try-catch, throw / 예외처리 (참고1 / 참고2)

  • 에러 발생 시 프로그램을 종료시키지 않고 예외처리를 통해 정상작동하게 만들어 준다.
  • try와 catch는 한 몸으로 떨어져선 안 된다.
  • try 블록에서 예외가 발생할 수 있는 코드를 넣고, 예외가 발생되지 않았을 경우엔 catch 블록의 코드는 실행되지 않고 스킵된다.
  • try 블록에서 예외가 발생될 경우엔 실행을 멈추고 catch 블록으로 이동하여 예외처리 코드를 실행한다.
  • try, catch 블록은 무조건 하나씩 있어야 하지만, catch 블록은 하나 이상 있을 수 있다.
  • throw를 통해 예외를 던져 고의로 예외를 발생시킬 수 있다.
  • try에서 던진(throw를) catch에서 받는다.
더보기
try {
	String str = null;
	int len=str.length();
} catch (NullPointerException e) {
	System.out.println(e.getMessage());
	System.out.println("null포인터 예외 발생");
	e.printStackTrace();
}
  • try 블록에서 str 변수에 null 값을 넣어 str.length에 예외를 발생시켰다.
  • catch의 괄호에는 예외타입과 참조변수를 입력한다.
  • 예외 발생 시 발생 예외에 해당하는 클래스의 인스턴스가 만들어진다.
  • getMessage()의 경우 발생한 예외에 대한 기본 정보를 제공해준다. (간단)
  • printStackTrace()의 경우 자세한 예외 정보, 예외가 발생한 위치를 제공해준다.

 

try {
	int[] arr1 = new int[3];
	arr1[-1]=20;
} catch (ArrayIndexOutOfBoundsException e) {
	System.out.println(e.getMessage());
	System.out.println("인덱스 예외 발생");
	e.printStackTrace();
}

 

 4-1) 예제 ㄱ 

더보기
import java.io.IOException;
import java.util.Scanner;

public class ExceptionMain {
	public static void main(String[] args) {
		System.out.print("나이입력> ");
		try {
			int age = readAge();
			System.out.println("당신은 "+age+"세입니다.");
		} catch (AgeInputException e) {
			System.out.println(e.getMessage());
		} catch(IOException e) {
			System.out.println(e.getMessage());
			System.out.println("입출력 예외 발생");
		}
	}

	private static int readAge() throws AgeInputException, IOException{	//예외 여러개 사용 가능
		Scanner keyboard = new Scanner(System.in);
		int age = keyboard.nextInt();
		if(age < 0) {
//			AgeInputException excpt = new AgeInputException();
//			throw excpt;
			throw new AgeInputException();	//위 두 줄과 동일함
//			throw new IOException();
		}
		return age;
	}
}
// 프로그래머 정의 예외 클래스
public class AgeInputException extends Exception{
	public AgeInputException() {
		super("유효하지 않는 나이가 입력되었습니다.");
	}
}
  • 나이 입력에서 바로 try-catch를 통해 예외 상황을 만들어 해당하는 경우에는 throw를 통해 강제로 catch에 던진다.
  • 예외 상황에 해당하지 않는 경우엔 입력받은 값을 그대로 반환한다.

 


 

질문한 내용이나 어려웠던 점 메모

1. try-catch, throw

  • 처음엔 이해한듯 했는데 예제에서 throws(예외 여러개 사용 가능) 부분부터 헷갈린다. 우선 이해하려면 오래 걸릴 것 같아서 여러번 사용해보고 따라하면서 응용도 해봐야 객체마냥 자연스럽게 이해할 수 있을듯 싶어서 일단 머리에 집어넣기로 했다..

 


 

전체 피드백

  • try-catch, throw 여러번 사용해보기!

 


728x90
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
1 ··· 10 11 12 13 14 15 16 ··· 45