2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

명품 자바 6장 실습문제

2023. 1. 12. 14:42ㆍ명품 자바 문제

다음 main()이 실행되면 아래 예시와 같이 출력되도록 MyPoint 클래스를 작성하라.

 

package 예제파일1번;

public class Example {
    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("다른 점 ");

    }

}
class MyPoint{
    int x=0; int y=0;
    MyPoint(int x,int y){
        this.x=x; this.y=y;
    }
    public String toString(){
        return "Point"+"("+x+","+y+")";
    }
}

 

여기서는 객체 값을 출력하면 객체 주소가 나오게 됩니다. 그러므로 toString을 오버라이딩해서 

출력값을 정해줘야 합니다.

 

 

 

 

[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 예제파일1번;

public class Example {
    public static void main(String[] args) {
       Circle a = new Circle(2,3,5);
       Circle b = new Circle(2,3,30);

       System.out.println("원 a :"+a);
       System.out.println("원 b : "+b);

       if(a.equals(b)) System.out.println("같은 원");
       else System.out.println("서로 다른 원 ");

    }

}
class Circle {
    int x;int y; int z;
    Circle(int x,int y,int z){
        this.x=x; this.y=y; this.z=z;
    }

    @Override
    public boolean equals(Object obj) {
        Circle a = (Circle) obj;
        if(x==a.x&&y==a.y){
            return true;
        }return false;
    }
    public String toString(){
        return "Circle ("+x+","+y+")"+"반지름 "+z;
    }
}

 

여기서는 객체의 중심만을 비교하기 때문에 equals를 오버라이딩 하지 않으면

객체 안에 있는 값들이 같더라도 false가 나오게 됩니다. 그렇기에 equals를 오버라이딩 해서

x,y값을 다시 재정의 한 후 써야 합니다 . 또한 toString을 쓰지 않으면 객체 주소가 나오기 때문에

객체값을 출력할땐 반드시 toString을 써야 합니다.

 

 

[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
 
 
package 예제파일1번;

import java.util.Calendar;

public class Example {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int m = calendar.get(Calendar.MINUTE);
        int ampm = calendar.get(Calendar.AM_PM);
        System.out.println("현재시간은 :"+hour+"시"+m+" 분 입니다.");
        if (hour > 4 && hour < 12) System.out.println("Good Morning");
        if(hour<=18&&hour>=12){
            System.out.println("Good Afternoon");
        }
        if(hour>=18&&hour<=22) System.out.println("Good Evening");
    }
}

[6장 6번]

 

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

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

 

[풀이]

package 예제파일1번;

import java.util.Calendar;
import java.util.Scanner;

public class chap06_prac08 {
    public static void main(String[] args) {
        Game game = new Game("황기태");
        Game game1 = new Game("이재문");
        int result = game.Game_method();
        int result1 = game1.Game_method();

        System.out.println("황기태의 결과 : "+result);
        System.out.println("이재문의 결과 :"+result1);

        if(Math.abs(result)>Math.abs(result)) System.out.println("황기태 승");
        else System.out.println("이재문 승");


    }
}
class Game{
    Scanner sc = new Scanner(System.in);
    String person;
    int second = 0;
    int second1 = 0;
    Game(String person){
        this.person=person;
    }
    int Game_method(){
        System.out.println("10초에 가까운 사람이 이기는 게임 입니다.");
        System.out.println(person+"시작 <Enter>키를 눌러주세요");
        second = enter();
        System.out.println("10초 예상 후 <Enter>키를 눌러주세요");
        second1 = enter();
        if(second>second1){
            int result = (60+second1)-second;
            return result;
        }else{
            int result = second1-second;
            return result;
        }
    }
    int enter(){
        String buffer = sc.nextLine();
        Calendar c = Calendar.getInstance();
        System.out.println("현재 초 시간은 :"+c.get(Calendar.SECOND));
        return c.get(Calendar.SECOND);
    }
}
해설: 황기태 시작을 기점으로 입력값을 enter() 메서드에 넣어줬습니다.
솔직히 입력값은 어떤 값이 들어가도 실행이 됩니다. 하지만 여기서 엔터키만 입력하라 했으니 엔터키만 입력합니다. 그러고 변수 c에 초 단위를 출력하게 끔 하고 return으로 현재 초를 반환 값으로 second에 받았습니다.
그리고 10초 예상 후에도 마찬가지로 현재 시간초를 받았습니다.
if로 second>second1가 클경우가 무엇이나면 첫번째 입력값을 57초라고 가정한다면 두 번째 입력값이 
2초가 된다면 저희는 텀이 5초라는 것을 알고 있지만 컴퓨터는 인식하지 못합니다.
그렇기에  second1 = 2초라고 나와있기 때문에 60초 + 2초  = 62초로 만든다음 57초를 뺀다면 5초가 남게 됩니다.
그 외에는 second1이 더 클 경우이기 때문에 second1 - second1로 해서 남는 시간차를 구하면 됩니다.
그리고 Math.abs 절대 값으로 비교를해서 더 근접한쪽이 승리하게 됩니다.

 

 

 

 

 

 

 

 

 

 

[6장 7번]

 

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

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

[Hint] Scanner.nextLine()을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.

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

 

 

 

package 예제파일1번;

import java.util.*;
public class WordCount {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

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


        }

    }
}

 

 

 

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

 

package 예제파일1번;

import java.util.*;
public class WordCount {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

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

        }
    }
}

 

 

 

 

[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 예제파일1번;

import java.util.Calendar;
import java.util.Random;
import java.util.Scanner;
import java.util.StringTokenizer;

public class chap06_prac08 {
    public static void main(String[] args) {
    Game game = new Game();
        game.Game_method();
    }
}
class Game{
    Scanner sc = new Scanner(System.in);
    void Game_method(){
        while (true){
            System.out.println("철수[가위(1) 바위(2) 보(3) , 끝내기 (4)");
            int result = sc.nextInt();
            if(result==4) break;
            computer(result);
        }

    }
    void computer(int result){
        Random random = new Random();
        int rand=random.nextInt(4);
        if(result==1){
            String scissors = "가위";
            if(rand==1) {
                System.out.print("철수(가위) 컴퓨터 (가위)");
                System.out.println("무승부 입니다.");
            }
            if(rand==2) {
                System.out.println("철수(가위) 컴퓨터 (바위)");
                System.out.println("컴퓨터가 이겼습니다.");
            }
            if(rand==3) {
                System.out.println("철수(가위) 컴퓨터 (보)");
                System.out.println("철수가 이겼습니다.");
            }
        }
        if(result==2){
            String rock = "바위";
            if(rand==1){
                System.out.println("철수 :"+rock+" 컴퓨터(가위)");
                System.out.println("철수가 이겼습니다.");
            }
            if(rand==2){
                System.out.println("철수 (바위) 컴퓨터 (바위)");
                System.out.println("비겼습니다.");
            }
            if(rand==3) {
                System.out.println("철수 (바위) 컴퓨터 (보)");
                System.out.println("컴퓨터가 이겼습니다.");
            }
        }
        if(result==3){
            if(rand==1){
                System.out.println("철수 (보) 컴퓨터 (가위)");
                System.out.println("컴퓨터가 이겼습니다.");
            }
            if(rand==2) {
                System.out.println("철수 (보) 컴퓨터 (바위)");
                System.out.println("철수가 이겼습니다.");
            }
            if(rand==3){
                System.out.println("철수 (보) 컴퓨터 (보)");
                System.out.println("무승부 입니다.");
            }
        }
    }
    }

 

해설:이런 문제의 경우는 포문을 사용할 수 없습니다. 그러므로 일일이 if문을 만들어줘야 합니다.
저의 경우는 Computer 메서드안에 매개인자로 철수의 결과 값을 받았습니다.
1일 경우 가위이기 때문에 가위에 대한 모든 결과값들을 만들어 주었습니다. 그렇게 다 만들고
Math 클래스를 사용해서 난수를 만들어도 되지만 저렇게 Random 클래스를 만들어서 사용해도 편리한 것을 보여주기 위해서 Random 클래스를 사용했습니다.

 

 

결과 값 

 

 

 

 

[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 예제파일1번;

import java.util.Calendar;
import java.util.Random;
import java.util.Scanner;
import java.util.StringTokenizer;

public class chap06_prac08 {

    public static void main(String[] args) {
        Person person = new Person();
        person.run();



    }
}
class Person{
    int i=0;
    String name;
    private int num = 0;
    private int num1 =0;
    private int num2 =0;
    Random rand = new Random();
    Scanner sc = new Scanner(System.in);

    void run(){
        System.out.println("1번째 선수 이름 :");
        String name1 = sc.nextLine();
        System.out.println("두번째 선수이름 :");
        String name2 = sc.nextLine();
        while (true){

            System.out.println(name1+": <Enter>");
            String start = sc.nextLine();
            num=rand.nextInt(4); num1=rand.nextInt(4); num2=rand.nextInt(4);

            if((num==num1&&num==num2)){
                System.out.println(name1+"님이 이겼습니다.");
                System.out.println(num+"  "+num1+"   "+num2);
                break;
            }else   System.out.println(num+"  "+num1+"   "+num2+ " 아쉽군요!");

            System.out.println(name2+"<Enter>");
            start = sc.nextLine();
            if((num==num1&&num==num2)){
                System.out.println(name2+"님이 이겼습니다.");
                System.out.println(num+"  "+num1+"   "+num2);
                break;
            }else  System.out.println(num+"  "+num1+"   "+num2+" 아쉽군요!");


        }
    }


}