명품 자바 프로그래밍 4장 실습문제 8번 - myeongpum jaba peulogeulaeming 4jang silseubmunje 8beon

8번 : 이름(name), 전화번호(tel) 필드와 생성자 등을 가진 Phone 클래스를 작성하고, 실행 예시와 같이 작동하는 PhoneBook 클래스를 작성하라.

여기서도 마찬가지로 클래스명을 PhoneBook 대신 varyeun으로 썼어요. 참고해주세요.

인원수>>3 이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>황기태 777-7777 이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>나명품 999-9999 이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>최자바 333-1234 저장되었습니다... 검색할 이름>>황기순 황기순 이 없습니다. 검색할 이름>>최자바 최자바의 번호는 333-1234 입니다. 검색할 이름>>그만

package varyeun; import java.util.Scanner; class Phone { String name; String tel; public boolean search(int d, String searchName) { int i=0; if(name.equals(searchName)) return true; else return false; } //처음엔 void로 선언해서 search안에서 출력까지 하게 했었는데 그렇게 했더니 번호가 없는 경우를 거르지 못함 } public class varyeun { public static void main(String [] args) { Scanner scanner = new Scanner(System.in); System.out.print("인원수>>"); int d = scanner.nextInt(); Phone phone[] = new Phone[d]; for(int i=0;i<d;i++) phone[i]=new Phone(); for(int i=0;i<d;i++) { System.out.print("이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>"); String name = scanner.next(); phone[i].name = name; String tel = scanner.next(); phone[i].tel = tel; } //저장까지는 main에서 진행 System.out.println("저장되었습니다..."); for(;;) { System.out.print("검색할 이름>>"); String searchName = scanner.next(); if (searchName.equals("그만")) break; //"그만" 미리 거르기 for(int i=0;i<d;i++) { if(true==phone[i].search(d,searchName)) {System.out.println(searchName+"의 번호는 "+phone[i].tel+" 입니다."); //찾았으니까 = 해당 i에 tel이 있으니까 phone[i].tel로 불러와도 됨 break;} //번호 출력했으면 이 for문은 바로 나가버려야 함 else if(false==phone[i].search(d, searchName)&&i==d-1) //뒤 조건 안 쓰면 tel이 i=0에 있지 않을 경우에 계속 "~이 없습니다."가 출력될 수 있음 (아마도) System.out.println(searchName+" 이 없습니다."); } } } }

명품 자바 프로그래밍 4장 실습문제 8번 - myeongpum jaba peulogeulaeming 4jang silseubmunje 8beon

너무 귀찮았어 .........

9번 : 다음 2개의 static 가진 ArrayUtil 클래스를 만들어보자. 다음 코드의 실행 결과를 참고하여 concat()와 print()를 작성하여 ArrayUtil 클래스를 완성하라.

여기서도 마찬가지로 클래스명을 ArrayUtil 대신 varyeun으로 썼어요. 참고해주세요.

class ArrayUtil { public static int [] concat(int[] a, int[] b) { /* 배열 a와 b를 연결한 새로운 배열 리턴 */ } public static void print(int[] a) { /* 배열 a 출력 */ } } public class varyeun { public static void main(String [] args) { int [] array1 = { 1, 5, 7, 9 }; int [] array2 = { 3, 6, -1, 100, 77 }; int [] array3 = ArrayUtil.concat(array1, array2); ArrayUtil.print(array3); } }

{ 1 5 7 9 3 6 -1 100 77 }

package varyeun; class ArrayUtil { public static int [] concat(int[] a, int[] b) { /* 배열 a와 b를 연결한 새로운 배열 리턴 */ int al, bl; //a의 length, b의 length라는 의미임 al=0; bl=0; for(int i=0; i<a.length;i++) { al++; } for(int j=0; j<b.length;j++) { bl++; } int cl = al+bl; //배열 c의 length라는 의미임 int[] c = new int[cl]; //메소드가 배열을 return 하니까 []c 만들어줘서 리턴할거임 for(int n=0; n<a.length;n++) { c[n]=a[n]; } //우선 a 옮겼음 for(int n=0;n<b.length;n++) { c[al]=b[n]; al++; //이걸 안해줘서 계속 77 0 0 0 0 이런식으로만 출력 //[]c 뒤에 이어서 붙여야되니까 al로 해줘야함 } return c; //c[] 이렇게 하면 안되고 그냥 배열 이름으로 리턴시켜야 함 } public static void print(int[] a) { int al = a.length; System.out.print("{ "); for(int i=0; i<al; i++) { System.out.print(a[i]+" "); } System.out.print("}"); } } public class varyeun { public static void main(String [] args) { int [] array1 = { 1, 5, 7, 9 }; int [] array2 = { 3, 6, -1, 100, 77 }; int [] array3 = ArrayUtil.concat(array1, array2); ArrayUtil.print(array3); } }

명품 자바 프로그래밍 4장 실습문제 8번 - myeongpum jaba peulogeulaeming 4jang silseubmunje 8beon

대단한 문제는 아닌데 코드만 긺..

*과제로 사용하실땐 반드시! 비밀댓글 바랍니다.*

package java4_8; // Phone 클래스와 PhoneBook 클래스를 한 패키지 안에 넣어놨다. 자바는 접근 지정자를 설정하지 않았을 때 default 즉, 같은 패키지 안에서는 접근 가능하게 설정되기 때문이다.

public class Phone {

String name; // 이름이 한글인데 String으로 해도 될까? 된다! String으로 하지 뭘로 하나. 따로 접근지정자는 정해주지 않았다. 자동으로 default 가 된다.

String tel; // 전화번호에 '-'가 포함되어 있어서 숫자가 아닌 문자로 입력 받음.

public Phone(String name, String tel) // 인수로 이름과 전번을 받는 생성자를 생성한다.

{

this.name = name; // this포인터를 사용해서 보다 쉽게 인수로 받은걸 객체의 멤버변수에 넣어준다. this는 여기서 이 생성자를 호출한 객체의 것이라고 생각하면 편하다.

this.tel = tel;

}

public static String phoneNum (Phone r) // 인수를 Phone타입의 객체로 받음. 이게 가능한가? 가능하다. 하지만 객체를 받아서 그 안 멤버변수중 하나만 리턴하는게 가능한지는 모르겠다. 우선 r.tel 로 리턴해보았다.

{

return r.tel; // 전번만 리턴함.

}

public static String phoneName (Phone r) // 인수를 Phone타입의 객체로 받음

{

return r.name; // 이름만 리턴함.

}

}

----------------------------------------------------------------------------------------------------------------------------------------------------------

위에 까지가 클래스 Phone이였고, 이제는 작동하는 PhoneBook 클래스를 짜볼려 한다.

package java4_8; // 클래스 Phone과 같은 패키지다.

import java.util.Scanner; // 이 클래스에선 다양하게 입력받아서 작동시켜야 되는데 자바에선 입력받으려면 Scanner 객체를 사용해야한다. 그래서 Scanner클래스를 import해준다.

public class PhoneBook { // 클래스 시작

int numberOfPeople; // 전화번호부에 저장할 사람의 수를 나타내는 변수다. for문 반복조건에서 유용하게 쓰일 아이다.

public static void main(String[] args) { // 메인함수 시작부분

int i; // for문 조건 제어변수이다. phone 객체 안 요소들을 하나하나 접근해서 이용하기 위해 for문 밖에서 선언하였다. for문 안에서 선언 시 이 변수의 범위는 오직 for문 안이기 때문에 아래 while문에서 i에 접근이 불가하다.

Scanner scanner = new Scanner(System.in); // 입력받기 위해 Scanner 객체를 생성한다.

System.out.println("인원수 >> "); // 화면에 출력하는 코드

int numberOfPeople = scanner.nextInt(); // 인원수를 nextInt()를 사용하여 정수로 입력받고 입력받은 정수를 변수 numberOfPeople에 넣어준다.

Phone [] phone = new Phone [numberOfPeople]; //객체배열. Phone 배열에 대한 레퍼런스 phone을 선언하고 numberOfPeople만큼의 레퍼런스 배열을 생성한다. ** 주의 ** 아직 객체가 생성된게 아니다!! 객체를 생성한 것이 아니라 단지 레퍼런스 배열만 생성한것이다. 객체의 생성은 다음 for문 안에 나온다.

for ( i=0; i < numberOfPeople ; i++ ) // 인원수만큼 이름과 전화번호를 반복해서 입력받는 for문이다. 여기서 아까 선언한 제어변수 i를 사용하였다.

{

System.out.println("이름과 전화번호 ( 이름과 번호는 빈 칸없이 입력) >> "); // 화면 출력 문자열

String name = scanner.next(); // 공백을 기준으로 이름을 입력받을거기 때문에 nextLine() 이 아닌 띄어쓰기 단위로 String을 입력받는 next()함수를 사용하였다.

String tel = scanner.next(); // 공백을 기준으로 번호를 입력받음. 나머지 설명은 위와 같다.

phone[i] = new Phone(name, tel); //!! 배열의 각 원소 객체 생성!! ** 여기서 객체를 생성한 것이다.**

if(i == numberOfPeople-1) break; // i가 마지막에 for문을 빠져나가기 전에 자동으로 i++이 돼서 ArrayIndexOutOfBoundsException이 생기는 것을 방지해준다. 풀어쓰자면, 만약 index가 마지막 방번호일때 i++하지 말고 그냥 반복 for문 빠져나가라는 얘기다.

}

System.out.println("저장되었습니다. . . "); // 반복 for문이 끝나면, 저장되었다는 멘트를 날려준다.

// System.out.println("검색할 이름 >> "); // 뭔가 이부분 틀린것 같은데... 검색할 이름>> 이게 두번 출력될것 가타요

//String name = scanner.next(); // 공백을 기준으로 이름을 입력받음

시행착오를 겪었다. 굳이 while의 반복조건문 부분에 "그만"입력때까지 라고 쓸려고 while( name.equals("그만")) 이라고 썼는데 name이 선언이 안되어있다고 자꾸 에러나더라. 그래서 그냥 포기하고 무한루프 돌게 반복조건문에 true를 넣어준다음 name입력 받은 후 if로 반복문 빠져나간 형태로 썼다. 반복문 빠져나가는 if는 앞쪽에 써줘야한다. 안그러면 실행되지 말았어야 하는 경우에도 한번 다 돌고 나서 루프를 빠져나가기 때문이다.

while( true) // 이름 검색후 이름을 찾으면 전화번호 출력 후 다시 이름을 입력받는 반복문을 반복 / 찾지 못하면 찾지못함을 알리고 다시 이름을 입력받는 반복문을 반복./ 사용자가 그만이라고 입력시 반복문을 빠져나감.

{

System.out.println("검색할 이름 >> ");

String name = scanner.next(); // 공백을 기준으로 이름을 입력받음. 어짜피 이름만 입력받는 거라 nextLine()을 써도 상관 없을 듯 하다.

if( name.equals("그만")) break; // 사용자가 "그만"을 입력시 바로 반복문을 빠져나가는 반복조건문이라 할 수 있다.

for ( i=0; i < numberOfPeople ; i++ ) // 객체배열안에 요소들중 일치하는 것이 있는지 for문을 이용해 찾는 반복문이다. 위에서 선언했던 제어변수 i를 선언해야 한다. 안그러면 "000의 번호는 000000이다" 이게 numberOfPeople만큼 나온다.

{

if(phone[i].name.equals(name)) // phone 객체 안에 있는 name 하고 비교하고 싶은데 어떻게 해야되는지 몰라서 애를 좀 먹었다. 따지고 보면 쉬운데 뭔가 클래스 Phone을 이용해야된다는 강박 때문에 클래스 Phone에 함수만들고 별짓 다했다. 바보짓이었다. 그냥 phone[i]에 점접근 연산자를 바로 써서 객체 본인의 멤버변수에 접근하면 된다. 이 if문을 해석하자면 입력받은 name이 객체 배열 요소랑 일치할 때.

{

System.out.println(name + "의 번호는 " +phone[i].tel); // 객체배열중 전화번호도 똑같이 점접근연산자 사용하여 접근하면 된다. 입력받은 name이 객체 배열요소랑 일치 시 번호를 출력한다.

break; // 그리고 break를 써서 반복문(for문)을 빠져나간다. 이렇게 되면 현재 i값은 이름이 일치한 배열의 방번호가 된다.

}

}

if( i==numberOfPeople) // 만약 입력받은 name이 객체배열 요소와 일치하는게 없을 시 반복문을 끝까지 돌고 빠져나오기 때문에 그때의 i는 numberOfPeople일 것이다. 한마디로 찾는 이름이 전화번호부에 없을시

System.out.println( name + "이(가) 없습니다. "); //없다고 출력해준다.

// 얘는 break 걸어주면 안된다. 다시 검색할 이름 입력받아야되기 때문에

}

}

}

총 평 : 시행착오를 여러번 겪었지만 자바 왕초보인 내가 풀 수 있을 정도면 쉬운편인것 같다.

주의깊게 봐야할 점은

1. for문 제어변수를 어디에 선언하고 사용하느냐

2. 객체배열 안 각 멤버변수를 어떻게 설정할 것이냐.

3. 입력받은 이름이 전화번호부에 없을 조건이 무엇이냐

4. 언제 for문을 빠져나가는 break를 쓰고 반복문을 어떻게 적절하게 여러개 사용할 것이냐.

이정도가 될것 같다.

다음은 실행 화면이다.

#자바 #명품자바 #명품자바프로그래밍 #프로그래밍 #개발자 #초보개발자