-> 블로그 이전

[명품 Java] 6장 실습문제 (모듈과 패키지 개념, 자바 기본 패키지)

2021. 12. 8. 19:49Solution`/Java

[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)
다른점

≫ 풀이

package Java6_1;

class MyPoint{
    private int x, y;
    MyPoint(int x, int y){
        this.x = x;
        this.y = y;
    }
    public boolean equals(Object obj){
        MyPoint p = (MyPoint)obj;
        if(x==p.x && y==p.y)
            return true;
        else
            return false;
    }
    public String toString(){
        return "Point(" + x + "," + y + ")";
    }
}

public class Java6_1 {
    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)
다른 점

 

 

[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("같은 원");
	else 
		System.out.println("서로 다른 원");
}

원 a : Circle(2,3)반지름5
원 b : Circle(2,3)반지름30
같은 원

≫ 풀이

package Java6_2;

class Circle{
    private int x, y, radius;
    Circle(int x, int y, int radius){
        this.x = x;
        this.y = y;
        this.radius = radius;
    }
    public boolean equals(Object obj){
        Circle c = (Circle)obj;
        if(x==c.x && y==c.y)
            return true;
        else
            return false;
    }
    public String toString(){
        return "Circle(" + x + "," + y + ")반지름" + radius;
    }
}

public class Java6_2 {
    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("같은 원");
        else
            System.out.println("서로 다른 원");
    }
}
-------------------------
원 a : Circle(2,3)반지름5
원 b : Circle(2,3)반지름30
같은 원

 

 

[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());
	}
}

≫ 풀이

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; }
}
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();
	}
}

≫ 풀이

package base;

public class Shape {
    public void draw() { System.out.println("Shape"); }
}
package derived;
import base.Shape;

public class Circle extends Shape{
    public void draw() { System.out.println("Circle"); }
}
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

≫ 풀이

package Java6_5;
import java.util.Calendar;

public class Java6_5 {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.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");
        else
            System.out.println("Good Night");
    }
}
---------------------------
현재 시간은 17시 46분입니다.
Good Afternoon

 

 

[6장 6번]

경과시간을 맞추는 게임을 작성하라. 다음 예시를 참고하면, <Enter> 키를 입력하면 현재 초 시간을 보여주고 여기서 10초에 더 근접하도록 다음 <Enter> 키를 입력한 사람이 이기는 게임이다.

10초에 가까운 사람이 이기는 게임입니다.
황기태 시작 키  >>
	현재 초 시간 = 42
10초 예상 후 키  >>
	현재 초 시간 = 50
이재문 시작 키  >>
	현재 초 시간 = 51
10초 예상 후 키  >>
	현재 초 시간 = 4
황기태의 결과 8, 이재문의 결과 13, 승자는 황기태

≫ 풀이

package Java6_6;
import java.util.Calendar;
import java.util.Scanner;

class Person{
    Scanner sc = new Scanner(System.in);
    Calendar now;
    private String name, enter;
    private int sec1, sec2; // sec1 = 시작 enter, sec2 = 10초 후 enter
    Person(String name){
        this.name = name;
    }
    int game(){
        System.out.print(name + " 시작 <Enter>키>>");
        enter = sc.nextLine();
        now = Calendar.getInstance();
        sec1 = now.get(Calendar.SECOND);
        System.out.println("\t현재 초 시간 = " + sec1);

        System.out.print("10초 예상 후 <Enter>키>>");
        enter = sc.nextLine();
        now = Calendar.getInstance();
        sec2 = now.get(Calendar.SECOND);
        System.out.println("\t현재 초 시간 = " + sec2);

        if(sec1<sec2)
            return sec2-sec1;
        else{
            sec2+=60;
            return sec2-sec1;
        }
    }
}

public class Java6_6 {
    public static void main(String[] args) {
        Person a = new Person("황기태");
        Person b = new Person("이재문");

        System.out.println("10초에 가까운 사람이 이기는 게임입니다.");
        int result1 = a.game(); // 황기태 결과
        int result2 = b.game(); // 이재문 결과

        if(Math.abs(result1-10) < Math.abs(result2-10))
            System.out.println("황기태 결과 : " + result1 + " / 이재문 결과 : " + result2 + " >> 승자 : 황기태");
        else
            System.out.println("황기태 결과 : " + result1 + " / 이재문 결과 : " + result2 + " >> 승자 : 이재문");
    }
}
-----------------------------------------
10초에 가까운 사람이 이기는 게임입니다.
황기태 시작 <Enter>키>>
	현재 초 시간 = 5
10초 예상 후 <Enter>키>>
	현재 초 시간 = 11
이재문 시작 <Enter>키>>
	현재 초 시간 = 13
10초 예상 후 <Enter>키>>
	현재 초 시간 = 20
황기태 결과 : 6 / 이재문 결과 : 7 >> 승자 : 이재문

 

 

[6장 7번]

Scanner를 이용하여 한 라인을 읽고, 공백으로 분리된 어절이 몇 개 들어 있는지 "그만"을 입력할 때까지 반복하는 프로그램을 작성하라.

>>I love Java.
어절 개수는 3
>>자바는 객체 지향 언어로서 매우 좋은 언어이다.
어절 개수는 7
>>그만
종료합니다...

(1) StringTokenizer 클래스를 이용하여 작성하라.

package Java6_7;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Java6_7 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while(true){
            System.out.print(">>");
            String str = sc.nextLine();
            if(str.equals("그만")){
                System.out.println("종료합니다...");
                break;
            }
            StringTokenizer st = new StringTokenizer(str, " ");
            int num = st.countTokens();
            System.out.println("어절 개수는 " + num);
        }
    }
}

---------------------------------
>>i love java.
어절 개수는 3
>>자바는 객체 지향 언어로서 매우 좋은 언어이다.
어절 개수는 7
>>java is my life
어절 개수는 4
>>그만
종료합니다...

 

(2) String 클래스의 split() 메소드를 이용하여 작성하라.

package Java6_7;
import java.util.Scanner;


public class Java6_7_2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while(true){
            System.out.print(">>");
            String str = sc.nextLine();
            if(str.equals("그만")){
                System.out.println("종료합니다...");
                break;
            }
            String[] token = str.split(" ");
            System.out.println("어절 개수는 " + token.length);
        }
    }
}

------------------------------------
>>i love java
어절 개수는 3
>>java is my life...
어절 개수는 4
>>자바는 객체 지향 언어로서 매우 좋은 언어이다.
어절 개수는 7
>>i love you so much
어절 개수는 5
>>그만
종료합니다...

 

 

[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

≫ 풀이

package Java6_8;
import java.util.Scanner;

public class Java6_8 {
    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));
        }
    }
}

---------------------------
문자열을 입력하세요. 빈칸이 있어도 되고 영어 한글 모두 됩니다.
java is my life
ava is my lifej
va is my lifeja
a is my lifejav
 is my lifejava
is my lifejava 
s my lifejava i
 my lifejava is
my lifejava is 
y lifejava is m
 lifejava is my
lifejava is my 
ifejava is my l
fejava is my li
ejava is my lif
java is my life

 

 

[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

≫ 풀이

package Java6_9;
import java.util.Scanner;

class user{
    private String name;
    Scanner sc = new Scanner(System.in);
    user(String name){
        this.name = name;
    }
    String getName(){
        return name;
    }
    int game(){
        System.out.print(getName() + "[가위(1), 바위(2), 보(3), 끝내기(4)]>>");
        return sc.nextInt();
    }
}

class Computer extends user{
    Computer(String name) {
        super(name);
    }
    @Override
    int game(){
        return (int)(Math.random()*3+1);
    }
}

public class kbb {
    final String[] str = {"가위", "바위", "보"};
    user[] users = new user[2];

    public kbb(){
        users[0] = new user("철수");
        users[1] = new Computer("컴퓨터");
    }

    public void run(){
        int userselect, comselect;
        while(true){
            userselect = users[0].game();
            if(userselect == 4){
                System.out.println("게임 종료...");
                break;
            }
            comselect = users[1].game();

            if(userselect <0 || userselect >4)
                System.out.println("잘못 입력하였습니다.\n");
            else{
                System.out.print(users[0].getName() + "(" + str[userselect-1] + ") : ");
                System.out.println(users[1].getName() + "(" + str[comselect-1] + ")");
                int diff = userselect - comselect;
                switch(diff){
                    case 0:
                        System.out.println("비겼습니다.\n");
                        break;
                    case -1:
                    case 2:
                        System.out.println(users[1].getName() + "가 이겼습니다.\n");
                        break;
                    case 1:
                    case -2:
                        System.out.println(users[0].getName() + "가 이겼습니다.\n");
                }
            }
        }
    }

    public static void main(String[] args) {
        kbb game = new kbb();
        game.run();
    }
}

--------------------------------
철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>-1
잘못 입력하였습니다.

철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>5
잘못 입력하였습니다.

철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>1
철수(가위) : 컴퓨터(보)
철수가 이겼습니다.

철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>2
철수(바위) : 컴퓨터(바위)
비겼습니다.

철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>3
철수(보) : 컴퓨터(보)
비겼습니다.

철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>4
게임 종료...

 

 

[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  수희님이 이겼습니다!

≫ 풀이

package Java6_10;
import java.util.*;

class Person{
    Scanner sc = new Scanner(System.in);
    private String name;
    Person(String name){
        this.name = name;
    }
    String getName(){
        return name;
    }
    boolean game(){
        System.out.print("[" + getName() + "] : <Enter>");
        String enter = sc.nextLine();

        int[] n = new int[3];
        for(int i=0; i<3; i++){
            n[i] = (int)(Math.random()*3+1);
        }
        System.out.print("\t");
        for(int i=0; i<3; i++){
            System.out.print(n[i] + " ");
        }
        boolean result = true;
        for(int i=0; i<3; i++) {
            if (n[i] != n[0]) {
                result = false;
                break;
            }
        }
        return result;
    }
}

public class Gambling {
    Scanner sc = new Scanner(System.in);
    Person[] p = new Person[2];
    public Gambling(){
        for(int i=0; i<p.length; i++){
            System.out.print((i+1) + "번째 선수 이름>>");
            p[i] = new Person(sc.nextLine());
        }
    }
    public void run(){
        int i=0;
        while(true){
            if(p[i].game()){
                System.out.println(p[i].getName() + "님이 이겼습니다!!");
                break;
            }
            else{
                System.out.println("아쉽군요!");
                i++;
                i%=p.length;
            }
        }
    }
    public static void main(String[] args) {
        Gambling gam = new Gambling();
        gam.run();
    }
}

-----------------------------------
1번째 선수 이름>>손흥민
2번째 선수 이름>>박지성
[손흥민] : <Enter>
	1 3 1 아쉽군요!
[박지성] : <Enter>
	1 3 3 아쉽군요!
[손흥민] : <Enter>
	3 1 3 아쉽군요!
[박지성] : <Enter>
	2 2 3 아쉽군요!
[손흥민] : <Enter>
	1 3 1 아쉽군요!
[박지성] : <Enter>
	2 1 3 아쉽군요!
[손흥민] : <Enter>
	3 3 3 손흥민님이 이겼습니다!!

 

 

[6장 11번]

StringBuffer 클래스를 활용하여 명령처럼 문자열을 수정하라. 아래 실행 예시에서 love!LOVE는 love를 찾아 LOVE로 수정하라는 명령이다. 첫 번째 만난 문자열만 수정한다.

>>우리는 love Java Programming.
명령: 우리는!We
We love Java Programming.
명령: LOV!사랑
찾을 수 없습니다!
명령: !Java
찾을 수 없습니다!
명령: love!LOVE
We LOVE Java Programming.
명령: 그만
종료합니다

≫ 풀이

package Java6_11;
import java.util.*;

public class Java6_11 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print(">>");
        String text = sc.nextLine();
        StringBuffer sb = new StringBuffer(text);

        while (true) {
            System.out.print("명령 : ");
            String command = sc.nextLine();
            if(command.equals("그만")){
                System.out.println("종료합니다...");
                break;
            }
            String[] split = command.split("!");
            if(split.length != 2)
                System.out.println("잘못된 명령입니다!!");
            if(split[0].length() == 0 || split[1].length() == 0)
                System.out.println("잘못된 명령입니다!!");
            else{
                int index = sb.indexOf(split[0]);
                if(index == -1){
                    System.out.println("찾을 수 없습니다");
                    continue;
                }
                sb.replace(index, index+split[0].length(), split[1]);
                System.out.println(sb);
            }
        }
    }
}

-----------------------------------
>>자바 is my 삶.
명령 : !java
잘못된 명령입니다!!
명령 : 바자!java
찾을 수 없습니다
명령 : 자바!java
java is my 삶.
명령 : 삶!life
java is my life.
명령 : 그만
종료합니다...

 

 

[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  황님이 이겼습니다!

≫ 풀이

package Java6_12;
import java.util.*;

class Person{
    Scanner sc = new Scanner(System.in);
    private String name;
    Person(String name){
        this.name = name;
    }
    String getName(){
        return name;
    }
    boolean game(){
        System.out.print("[" + getName() + "] : <Enter>");
        String enter = sc.nextLine();

        int[] n = new int[3];
        for(int i=0; i<3; i++){
            n[i] = (int)(Math.random()*3+1);
        }
        System.out.print("\t");
        for(int i=0; i<3; i++){
            System.out.print(n[i] + " ");
        }
        boolean result = true;
        for(int i=0; i<3; i++) {
            if (n[i] != n[0]) {
                result = false;
                break;
            }
        }
        return result;
    }
}

public class N_Gambling {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("갬블링 게임에 참여할 선수 숫자>>");
        int num = sc.nextInt();
        sc.nextLine();
        Person[] p = new Person[num];

        for(int i=0; i<p.length; i++){
            System.out.print((i+1) + "번째 선수 이름>>");
            p[i] = new Person(sc.nextLine());
        }

        int j=0;
        while(true){
            if(p[j].game()){
                System.out.println(p[j].getName() + "님이 이겼습니다!!");
                break;
            }
            else{
                System.out.println("아쉽군요!");
                j++;
                j%=p.length;
            }
        }
    }
}
----------------------------------------
갬블링 게임에 참여할 선수 숫자>>3
1번째 선수 이름>>차범근
2번째 선수 이름>>박지성
3번째 선수 이름>>손흥민
[차범근] : <Enter>
	2 3 2 아쉽군요!
[박지성] : <Enter>
	1 3 3 아쉽군요!
[손흥민] : <Enter>
	2 2 1 아쉽군요!
[차범근] : <Enter>
	3 3 3 차범근님이 이겼습니다!!