[6장 1번]
다음 main()이 실행되면 아래 예시와 같이 출력되도록 MyPoint 클래스를 작성하라.
public static void main(String [] args) {MyPoint p = new MyPoint(3, 50);MyPoint q = new MyPoint(4, 50);System.out.println(p);if(p.equals(q)) System.out.println("같은 점");else System.out.println("다른 점");}
Point(3,50) 다른점
[풀이]
public class MyPoint {private int x, y;public MyPoint(int x, int y) {this.x = x;this.y = y;}public String toString() {return "Point(" + x + "," + y + ")";}public boolean equals(Object obj) {MyPoint p = (MyPoint)pbj;if(x == p.x && y == p.y)return true;elsereturn false;}public static void main(String [] args) {MyPoint p = new MyPoint(3, 50);MyPoint q = new MyPoint(4, 50);System.out.println(p);if(p.equals(q)) System.out.println("같은 점");else System.out.println("다른 점");}}
[6장 2번]
중심을 나타내는 정수 x, y와 반지름 radius 필드를 가지는 Circle 클래스를 작성하고자 한다. 생성자는 3개의 인자(x, y, raidus)를 받아 해당 필드를 초기화하고, equals() 메소드는 두 개의 Circle 객체의 중심이 같으면 같은 것으로 판별하도록 한다.
public static void main(String[] args) {Circle a = new Circle(2, 3, 5); // 중심 (2, 3)에 반지름 5인 원Circle b = new Circle(2, 3, 30); // 중심 (2, 3)에 반지름 30인 원System.out.println("원 a : " + a);System.out.println("원 b : " + b);if(a.equals(b))System.out.println("같은 원");elseSystem.out.println("서로 다른 원");}
원 a : Circle(2,3)반지름5 원 b : Circle(2,3)반지름30 같은 원
[풀이]
public class Circle {private int x, y, radius;public Circle(int x, int y, int radius) {this.x = x;this.y = y;this.radius = radius;}public String toString() {return "Circle("+x+","+y+")반지름"+radius;}public boolean equals(Object obj) {Circle p = (Circle)obj;if(p.x == x && p.y == y) //중심이 같으면 같은 원이다.return true;elsereturn false;}public static void main(String[] args) {Circle a = new Circle(2, 3, 5); // 중심 (2, 3)에 반지름 5인 원Circle b = new Circle(2, 3, 30); // 중심 (2, 3)에 반지름 30인 원System.out.println("원 a : " + a);System.out.println("원 b : " + b);if(a.equals(b))System.out.println("같은 원");elseSystem.out.println("서로 다른 원");}}
[6장 3번]
다음 코드를 수정하여, Calc 클래스는 etc 패키지에, MainApp 클래스는 main 패키지로 분리 작성하라.
class Calc {private int x, y;public Calc(int x, int y) { this.x = x; this.y = y; }public int sum() { return x+y; }}public class MainApp {public static void main(String[] args) {Calc c = new Calc(10, 20);System.out.println(c.sum());}}
[풀이]
- etc 패키지
package etc;public class Calc {private int x, y;public Calc(int x, int y) { this.x = x; this.y = y; }public int sum() { return x+y; }}
- main 패키지
package main;import etc.Calc;public class MainApp {public static void main(String[] args) {Calc c = new Calc(10, 20);System.out.println(c.sum());}}
[6장 4번]
다음 코드를 수정하여 Shape 클래스는 base 패키지에, Circle 클래스는 derived 패키지에, GraphicEditor 클래스는 app 패키지에 분리 작성하라.
public class Shape {public void draw() { System.out.println("Shape"); }}public class Circle extends Shape {public void draw() { System.out.println("Cirlce"); }}public class GraphicEditor {public static void main(String[] args) {Shape shape = new Circle();shape.draw();}}
[풀이]
- base 패키지
package base;public class Shape {public void draw() { System.out.println("Shape"); }}
- derived 패키지
package derived;import base.Shape;public class Circle extends Shape {public void draw() { System.out.println("Cirlce"); }}
- app 패키지
package app;import base.Shape;import derived.Circle;public class GraphicEditor {public static void main(String[] args) {Shape shape = new Circle();shape.draw();}}
[6장 5번]
Calendar 객체를 생성하면 현재 시간을 알 수 있다. 프로그램을 실행한 현재 시간이 4시에서 낮 12시 이전이면 "Good Morning"을, 오후 6시 이전이면 "Good Afternoon"을, 밤 10시 이전이면 "Good Evening"을, 그 이후는 "Good Night"을 출력하는 프로그램을 작성하라.
현재 시간은 10시 22분입니다. Good Morning
[풀이]
import java.util.Calendar;public class GoodMorning {public static void main(String[] args) {Calendar now = Calendar.getInstance(); // Calendar 객체 생성// now는 현재 시간 값을 가지고 있음int hour = now.get(Calendar.HOUR_OF_DAY);int minute = now.get(Calendar.MINUTE);System.out.println("현재 시간은 " + hour + "시 " + minute + "분입니다.");if(hour > 4 && hour < 12)System.out.println("Good Morning");else if(hour >= 12 && hour < 18)System.out.println("Good Afternoon");else if(hour >= 18 && hour < 22)System.out.println("Good Evening");elseSystem.out.println("Good Night");}}
[6장 6번]
경과시간을 맞추는 게임을 작성하라. 다음 예시를 참고하면, <Enter> 키를 입력하면 현재 초 시간을 보여주고 여기서 10초에 더 근접하도록 다음 <Enter> 키를 입력한 사람이 이기는 게임이다.
10초에 가까운 사람이 이기는 게임입니다. 황기태 시작키 >> 현재 초 시간 = 42 10초 예상 후 키 >> 현재 초 시간 = 50 이재문 시작 키 >> 현재 초 시간 = 51 10초 예상 후 키 >> 현재 초 시간 = 4 황기태의 결과 8, 이재문의 결과 13, 승자는 황기태
[풀이]
import java.util.Scanner;import java.util.Calendar;class Person {Calendar now = Calendar.getInstance();Scanner sc = new Scanner(System.in);private String name, buffer;private int sec1, sec2;public Person(String name) {this.name = name;}public int game() {System.out.print(name+" 시작 <Enter>키 >>");sec1 = enter();System.out.print("10초 예상 후 <Enter>키 >>");sec2 = enter();if(sec1 < sec2)return sec2-sec1;elsereturn (60-sec1) + sec2;}public int enter() {buffer = sc.nextLine();now = Calendar.getInstance();System.out.println("\t현재 초 시간 = "+ now.get(Calendar.SECOND));return now.get(Calendar.SECOND);}}public class chap06_prac06 {public static void main(String[] args) {Person person1 = new Person("황기태");Person person2 = new Person("이재문");System.out.println("10초에 가까운 사람이 이기는 게임입니다.");int result1 = person1.game();int result2 = person2.game();if(Math.abs(result1 - 10) < Math.abs(result2 - 10))System.out.println("황기태의 결과 "+result1+", 이재문의 결과 "+result2+", 승자는 황기태");elseSystem.out.println("황기태의 결과 "+result1+", 이재문의 결과 "+result2+", 승자는 이재문");}}
[6장 7번]
Scanner를 이용하여 한 라인을 읽고, 공백으로 분리된 어절이 몇 개 들어 있는지 "그만"을 입력할 때까지 반복하는 프로그램을 작성하라.
>>I love Java. 어절 개수는 3 >>자바는 객체 지향 언어로서 매우 좋은 언어이다. 어절 개수는 7 >>그만 종료합니다...
[Hint] Scanner.nextLine()을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.
(1) StringTokenizer 클래스를 이용하여 작성하라.
[풀이]
import java.util.*;public class WordCount {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(true) {System.out.print(">>");String s = scanner.nextLine();if(s.equals("그만")) {System.out.println("종료합니다...");break;}StringTokenizer st = new StringTokenizer(s, " ");System.out.println("어절 개수는 " + st.countTokens());}scanner.close();}}
(2) String 클래스의 split() 메소드를 이용하여 작성하라.
[풀이]
import java.util.*;public class WordCount {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(true) {System.out.print(">>");String s = scanner.nextLine();if(s.equals("그만")) {System.out.println("종료합니다...");break;}String [] words = s.split(" ");System.out.println("어절 개수는 " + words.length);}scanner.close();}}
[6장 8번]
문자열을 입력받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라.
문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다. I Love you Love youI Love youI ove youI L ve youI Lo e youI Lov youI Love youI Love ouI Love y uI Love yo I Love you
[Hint] Scanner.nextLine()을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.
[풀이]
import java.util.Scanner;public class chap06_prac08 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.");String str = sc.nextLine();for(int i = 1; i <= str.length() ;i++) {System.out.print(str.substring(i));System.out.println(str.substring(0, i));}sc.close();}}
[6장 9번]
철수와 컴퓨터의 가위바위보 게임을 만들어보자. 가위, 바위, 보는 각각 1, 2, 3 키이다. 철수가 키를 입력하면, 동시에 프로그램도 Math.Random()을 이용하여 1, 2, 3 중에 한 수를 발생시키고 이것을 컴퓨터가 낸 것으로 한다. 그런 다음 철수와 컴퓨터 중 누가 이겼는지 판별하여 승자를 출력하라.
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>1 철수(가위) : 컴퓨터(바위) 컴퓨터가 이겼습니다. 철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>3 철수(보) : 컴퓨터(바위) 철수가 이겼습니다. 철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>4
[풀이]
import java.util.Scanner;class Player {private String name;private Scanner scanner = new Scanner(System.in);public Player(String name) {this.name = name;}public String getName() { return name; }public int turn() {System.out.print(name + "[가위(1), 바위(2), 보(3), 끝내기(4)]>>");return scanner.nextInt();}}class Computer extends Player {public Computer(String name) {super(name);}public int turn() {return (int)(Math.random() * 3 + 1); // 1부터 3까지의 수}}public class Kawibawibo {private final String s[] = {"가위", "바위", "보"};private Player [] players = new Player[2];public Kawibawibo() {players[0] = new Player("철수");players[1] = new Computer("컴퓨터");}public void run() {int userChoice, computerChoice;while (true) {userChoice = players[0].turn(); // 철수 차례if (userChoice == 4)break; // 게임 끝내기computerChoice = players[1].turn(); // 컴퓨터 차례if (userChoice < 1 || userChoice > 3) {System.out.println("잘못 입력하셨습니다.");}else {System.out.print(players[0].getName() + "(" + s[userChoice-1] + ")" + " : ");System.out.println(players[1].getName() + "(" + s[computerChoice-1] + ")");int diff = userChoice - computerChoice;switch (diff) {case 0: // 같은 것을 낸 경우System.out.println("비겼습니다.");break;case -1: // 사용자가 가위, 컴퓨터가 바위 또는 사용자가 바위, 컴퓨터가 보case 2: // 사용자가 보, 컴퓨터가 가위System.out.println(players[1].getName()+"가 이겼습니다.");break;case 1: // 사용자가 바위, 컴퓨터가 가위 또는 사용자가 보, 컴퓨터가 바위case -2: // 사용자가 가위, 컴퓨터가 보System.out.println(players[0].getName()+"가 이겼습니다.");}}}}public static void main (String[] args) {Kawibawibo game = new Kawibawibo();game.run();}}
[6장 10번]
갬블링 게임을 만들어보자. 두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력 받으며 각 사람은 Person 클래스로 작성하라. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다. 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.
1번째 선수 이름>>수희 2번째 선수 이름>>연수 [수희]:3 1 1 아쉽군요! [연수]: 3 1 3 아쉽군요! [수희]: 2 2 1 아쉽군요! [연수]: 1 1 2 아쉽군요! [수희]: 3 3 3 수희님이 이겼습니다!
[풀이]
import java.util.Scanner;class Person {private int num1, num2, num3;public String name;public Person(String name) {this.name = name;}public boolean game() {num1 = (int) ((Math.random()*3)+1);num2 = (int) ((Math.random()*3)+1);num3 = (int) ((Math.random()*3)+1);System.out.print("\t"+num1+" "+num2+" "+num3+" ");if(num1 == num2 && num2 == num3)return true;elsereturn false;}}public class chap06_prac10 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("1번째 선수 이름>>");String name = sc.next();Person person1 = new Person(name);System.out.print("2번째 선수 이름>>");name =sc.next();Person person2 = new Person(name);String buffer = sc.nextLine();while(true) {System.out.print("["+person1.name+"]:<Enter>");buffer = sc.nextLine();if(person1.game()) {System.out.println(person1.name+"님이 이겼습니다!");break;}System.out.println("아쉽군요!");System.out.print("["+person2.name+"]:<Enter>");buffer = sc.nextLine();if(person2.game()) {System.out.println(person2.name+"님이 이겼습니다!");break;}System.out.println("아쉽군요!");}sc.close();}}
[6장 11번]
StringBuffer 클래스를 활용하여 명령처럼 문자열을 수정하라. 아래 실행 예시에서 love!LOVE는 love를 찾아 LOVE로 수정하라는 명령이다. 첫 번째 만난 문자열만 수정한다.
>>우리는 love Java Programming. 명령: 우리는!We We love Java Programming. 명령: LOV!사랑 찾을 수 없습니다! 명령: !Java 찾을 수 없습니다! 명령: love!LOVE We LOVE Java Programming. 명령: 그만 종료합니다
[풀이]
import java.util.Scanner;public class WordReplace {public static void main(String[] args) {System.out.print(">>");Scanner scanner = new Scanner(System.in);String text = scanner.nextLine(); // 한 라인을 문자열로 읽는다.StringBuffer sb = new StringBuffer(text);while(true) {System.out.print("명령: ");String cmd = scanner.nextLine(); // 한 라인을 문자열로 읽는다.if(cmd.equals("그만")) {System.out.print("종료합니다");break;}String [] tokens = cmd.split("!");if(tokens.length != 2) {System.out.println("잘못된 명령입니다!");}else {if(tokens[0].length() == 0 || tokens[1].length() == 0) {System.out.println("잘못된 명령입니다!");continue;}int index = sb.indexOf(tokens[0]);if(index == -1) { // not found!System.out.println("찾을 수 없습니다!");continue;}sb.replace(index, index+tokens[0].length(), tokens[1]);System.out.println(sb.toString());}}scanner.close();}}
[6장 12번]
문제 10의 갬블링 게임을 n명이 하도록 수정하라. 실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 입력받도록 수정하라.
겜블링 게임에 참여할 선수 숫자>>3 1번째 선수 이름>>황 2번째 선수 이름>>이 3번째 선수 이름>>김 [황]:2 3 3 아쉽군요! [이]: 1 2 2 아쉽군요! [김]: 2 2 3 아쉽군요! [황]: 3 2 2 아쉽군요! [이]: 1 1 3 아쉽군요! [김]: 2 2 1 아쉽군요! [황]: 2 2 2 황님이 이겼습니다!
[풀이]
import java.util.Scanner;class Person {private int num1, num2, num3;public String name;public Person(String name) {this.name = name;}public boolean game() {num1 = (int) ((Math.random()*3)+1);num2 = (int) ((Math.random()*3)+1);num3 = (int) ((Math.random()*3)+1);System.out.print("\t"+num1+" "+num2+" "+num3+" ");if(num1 == num2 && num2 == num3)return true;elsereturn false;}}public class chap06_prac12 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("겜블링 게임에 참여할 선수 숫자>>");int num = sc.nextInt();Person[] person = new Person[num];for(int i=0; i<num; i++) {System.out.print((i+1)+"번째 선수 이름>>");String name = sc.next();person[i] = new Person(name);}String buffer = sc.nextLine();while(true) {for(int i=0; i<num; i++) {System.out.print("["+person[i].name+"]:<Enter>");buffer = sc.nextLine();if(person[i].game()) {System.out.println(person[i].name+"님이 이겼습니다!");sc.close();return;}System.out.println("아쉽군요!");}}}}
'Solution_ > 명품 java' 카테고리의 다른 글
[명품 JAVA] 7장 실습문제(1~5) (제네릭과 컬렉션) (3) | 2019.09.22 |
---|---|
[명품 JAVA] 7장 연습문제 (제네릭과 컬렉션) (2) | 2019.05.27 |
[명품 JAVA] 6장 연습문제 (모듈과 패키지 개념, 자바 기본 패키지) (0) | 2019.05.15 |
[명품 JAVA] 5장 실습문제(9~14) (상속) (12) | 2019.04.21 |
[명품 JAVA] 5장 연습문제(8~16) (상속) (0) | 2019.04.20 |
댓글