YJ/JAVA

[명품 JAVA Programming] 제6장 모듈과 패키지 개념, 자바 기본 패키지 - 실습문제

Team DAON 2021. 1. 7. 02:17

[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("다른 점");
}
import java.util.*;

class MyPoint {//MyPoint 클래스
	private int x;
	private int y;
	
	public MyPoint(int x, int y) {//생성자
		this.x = x;
		this.y = y;
	}
	public String toString() {//형식에 맞춰 x, y에 저장된 값 출력
		return ("Point("+x+","+y+")");
	}
}

public class Main{
	public static void main(String[] args) {
		MyPoint p = new MyPoint(3, 50);//객체 생성
		MyPoint q = new MyPoint(4, 50);//객체 생성
		System.out.println(p);//p는 p.toString()으로 자동 변환
		if(p.equals(q)) //p는 p.toString()으로, q는 q.toString()으로 자동 변환
			System.out.println("같은 점");//p와 q가 같은 경우
		else //p와 q가 다른 경우
			System.out.println("다른 점");
	}
}

실행 결과


[2번]

중심을 나타내는 정수 x, y와 반지름 radius 필드를 가지는 Circle 클래스를 작성하고자 한다. 생성자는 3개의 인자(x, y, radius)를 받아 해당 필드를 초기화하고, 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("다른 원");
}
import java.util.*;

class Circle {//Circle 클래스
	private int x, y, radius;
	//생성자 x, y, radius 초기화
	public Circle(int x, int y, int radius) { this.x = x; this.y = y; this.radius = radius; }
	
	public String toString() {//주어진 형식에 맞춰 x, y, radius ㅜㄹ력
		return ("Circle("+x+","+y+")반지름"+radius);
	}
	
	public boolean equals(Object obj) {//두 객체의 x, y 값 비교, equals 오버라이딩
		Circle c = (Circle)obj;//객체 obj를 Circle 타입으로 다운 캐스팅
		if(x == c.x &&y == c.y)//두 객체의 x, y값이 같으면
			return true;//true 반환
		else//다르면
			return false;//false 반환
	}
}

public class Main{
	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("다른 원");
	}
}

실행 결과


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

2개의 패키지 생성

 

Calc.java

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

MainApp.java

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

 

MainApp.java 실행 결과


[4번]

다음 코드를 수정하여 Shape 클래스는 base 패키지에, Circle 클래스는 derived 패키지에, GraphicEditor 클래스는 app 패키지에 분리 작성하라.

class Shape {
	public void draw() { System.out.println("Shape"); }
}
class Circle extends Shape {
	public void draw() { System.out.println("Circle"); }
}
public class GraphicEditor{
	public static void main(String[] args) {
		Shape shape = new Circle();
		shape.draw();
	}
}

3개 패키지 분리 작성

 

Shape.java

package base;

public class Shape {
	public void draw() { System.out.println("Shape"); }
}

Circle.java

package derived;
import base.Shape;

public class Circle extends Shape {
	public void draw() { System.out.println("Circle"); }
}

GraphicEditor.java

package app;

import base.Shape;
import derived.Circle;

public class GraphicEditor {
	public static void main(String[] args) {
		Shape shape = new Circle();
		shape.draw();
	}
}

GraphicEditor.java 실행 결과

 


[5번]

Calendar 객체를 생성하면 현재 시간을 알 수 있다. 프로그램을 실행한 현재 시간이 새벽 4시에서 낮 12시 이전이면 "Good Morning"을, 오후 4시 이전이면 "Good Afternoon"을, 밤 10시 이전이면 "Good Evening"을, 그 이후는 "Good Night"을 출력하는 프로그램을 작성하라.

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Calendar now = Calendar.getInstance();//캘린더 객체 생성
		int hour = now.get(Calendar.HOUR_OF_DAY);//24시간 단위로 현재 시를 hour에 저장
		int minute = now.get(Calendar.MINUTE);//현재 분을 minute에 저장
		String result = null;//문장 저장용 변수
		if(hour>=4 && hour<12) //새벽 4시에서 낮 12시 사이인 경우
			result = "Good Morning";
		else if(hour>=12&&hour<18)//낮 12시에서 오후 6시 이전인 경우
			result = "Good Afternoon";
		else if(hour>=18&&hour<22)//오후 6시에서 밤 10시 이전인 경우
			result = "Good Evening";
		else//밤 10시에서 새벽 4시 이전인 경우
			result = "Good Night";
		System.out.println("현재 시간은 "+hour+"시 "+minute+"분입니다.");//현재 시간 출력
		System.out.println(result);//문장 출력
	}
}

실행 결과

왼쪽은 코드 실행 결과, 오른쪽은 네이버 시계로 나타낸 현재 시간


[6번]

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

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

Hint!
<Enter> 키를 입력받기 위해서는 Scanner.nextLine()을 호출하면 된다.
import java.util.*;

public class Main{
	public static int time() {
		Calendar time = Calendar.getInstance();//캘린더 객체 생성
		return time.get(Calendar.SECOND);//엔터키를 누른 시점의 초 반환
	}
	public static int game(String name) {
		Scanner scanner = new Scanner(System.in);
		System.out.print(name+" 시작 <Enter>키>>");
		String input = scanner.nextLine();//엔터키 인식
		int first_minute = time();//현재 초 저장
		System.out.println("\t현재 초 시간 = "+first_minute);
		
		
		System.out.print("10초 예상 후 <Enter>키>>");
		input = scanner.nextLine();//엔터키 인식
		int second_minute = time();//예상 초 저장
		System.out.println("\t현재 초 시간 = "+second_minute);
		
		if(first_minute <= second_minute) {//현재 초보다 예상 초가 더 크거나 같은 경우
			return second_minute-first_minute;//예상 초에서 현재 초를 빼면 초의 차이를 알 수 있음
		}
		else {//현재 초보다 예상초가 작은 경우
			return 60-first_minute+second_minute;//60에서 현재 초를 뺸 후, 예상 초를 더하면 초의 차이를 알 수 있음
		}
	}
	
	public static void run() {
		System.out.println("10초에 가까운 사람이 이기는 게임입니다.");
		int first = game("황기태");//game 함수 호출, 시작 초와 10초 예상 후 초의 차 반환
		int second = game("이재문");//game 함수 호출, 시작 초와 10초 예상 후 초의 차 반환
		System.out.print("황기태의 결과 "+first+", 이재문의 결과 "+second+", ");//문장 출력
		first = Math.abs(10-first);//10에 근접하는 정도를 보기 위해 10에서 해당 차를 뺸 후 절댓값을 씌움
		second = Math.abs(10-second);//절댓값에 따라 승패가 결정
		if(first>second)//first가 더 큰 경우, 이재문의 승리
			System.out.print("승자는 이재문");
		else if(first==second)//둘이 같은 경우, 비김
			System.out.print("비겼습니다.");
		else//second가 더 큰 경우, 황기태의 승리
			System.out.print("승자는 황기태");
	}
	
	public static void main(String[] args) {
		run();//run 함수 실행
	}
}

실행 결과


[7번]

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

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

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

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

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(true) {//break문을 만나기 전까지 반복
			System.out.print(">>");
			String text = scanner.nextLine();//한 줄 입력받기
			
			if(text.equals("그만")) {//그만을 입력한 경우
				System.out.println("종료합니다...");//문장 출력
				break;//while문 종료
			}
			else {//그만이 아닌 경우
				//하나의 문자열을 여러 개의 문자열로 분리하기 위해 사용되는 클래스, 빈칸을 기준으로 text를 여러 토큰으로 분리
				StringTokenizer st = new StringTokenizer(text, " ");
				System.out.println("어절 개수는 "+st.countTokens());//분리한 토큰의 개수 리턴
			}
		}
			
	}
}

실행 결과

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

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(true) {//break문을 만나기 전까지 반복
			System.out.print(">>");
			String text = scanner.nextLine();//한 줄 입력받기
			
			if(text.equals("그만")) {//그만을 입력한 경우
				System.out.println("종료합니다...");//문장 출력
				break;//while문 종료
			}
			else {//그만이 아닌 경우
				String[] s = text.split(" ");//공백으로 기준으로 text를 나누어 배열 형식으로 s에 저장
				System.out.println("어절 개수는 "+s.length);//배열의 크기 출력
			}
		}
			
	}
}

실행 결과


[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.*;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("문자열을 입력하세요. 빈칸이나 있어도 되고 영어 한글 모두 됩니다.");
		String text = scanner.nextLine();//문자열 입력받기
		
		for(int i = 1; i<=text.length(); i++) {//문자열의 문자 수만큼 반복
			String first = text.substring(0, i);//0번째부터 i-1번째까지 자르기
			String second = text.substring(i);//i번째부터 끝까지 자르기
			
			System.out.println(second+first);//형식에 맞춰 second+first 값 출력하기
		}
	}
}

실행 결과


[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.*;

public class Main{
	public static String change(int choice) {//1, 2, 3에 대한 값 반환
		switch(choice) {
		case 1: return "가위";//1인 경우 가위 
		case 2: return "바위"; //2인 경우 바위
		case 3: return "보";//3인 경우 보
		default: return null;
		}
	}
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(true) {//break문 전까지 반복
			System.out.print("철수[가위(1), 바위(2), 보(3), 끝내기(4)]>>");
			int choice = scanner.nextInt();//철수의 선택
			int random = (int)(Math.random()*3+1);//컴퓨터의 선택, 1~3까지 중 랜덤값
			String result = null;//결과값 저장용 변수
			if(choice == 4)//끝내기를 선택한 경우
				break;//while문 종료
			else if(choice == 1) {//철수가 가위인 경우
				if(random == 1)//컴퓨터가 가위인 경우
					result = "비겼습니다.";
				else if(random == 2)//컴퓨터가 바위인 경우
					result = "컴퓨터가 이겼습니다.";
				else//컴퓨터가 보인 경우
					result = "철수가 이겼습니다.";
			}
			else if(choice == 2) {//철수가 바위인 경우
				if(random == 1)//컴퓨터가 가위인 경우
					result = "철수가 이겼습니다.";
				else if(random == 2)//컴퓨터가 바위인 경우
					result = "비겼습니다.";
				else//컴퓨터가 보인 경우
					result = "컴퓨터가 이겼습니다.";
			}
			else if(choice == 3) {//철수가 보인 경우
				if(random == 1)//컴퓨터가 가위인 경우
					result = "컴퓨터가 이겼습니다.";
				else if(random == 2)//컴퓨터가 바위인 경우
					result = "철수가 이겼습니다.";
				else//컴퓨터가 보인 경우
					result = "비겼습니다.";
			}
			else {//1, 2, 3, 4 이외의 값 입력 시
				result = "잘못된 입력입니다.";
			}
			//철수와 컴퓨터가 선택한 값 String 형식으로 변환 후 출력
			System.out.println("철수("+change(choice)+") : 컴퓨터("+change(random)+")");
			System.out.println(result);//결과값 출력
		}
	}
}

실행 결과


[10번]

겜블링 게임을 만들어보자. 두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력받으며 각 사람은 Person 클래스로 작성하라. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다. 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.

1번째 선수 이름>>수희
2번째 선수 이름>>연수
[수희]:<Enter>
		3	1	1	아쉽군요!
[연수]:<Enter>
		3	1	3	아쉽군요!
[수희]:<Enter>
		2	2	1	아쉽군요!
[연수]:<Enter>
		1	1	2	아쉽군요!
[수희]:<Enter>
		3	3	3	수희님이 이겼습니다!
import java.util.*;

class Person {//Person 클랫
	private String name;//이름 저장용 변수
	private int a, b, c;//세 수 저장용 변수
	private boolean count;//경기 종료 여부 저장용 변수
	Scanner scanner;
	public Person(String name) {//생성자
		scanner = new Scanner(System.in);
		this.name = name;//이름 초기화
		this.count = false;//종료 여부 false로 저장
	}
	public int setRandom() {//1~3 사이의 랜덤값 반환
		return (int)(Math.random()*3+1);
	}
	public void setNumber() {//a, b, c에 값 저장
		System.out.print("["+this.name+"]:<Enter>");//이름 출력
		String s = scanner.nextLine();//Enter 키 입력
		this.a = setRandom();//a, b, c에 난수 저장
		this.b = setRandom();
		this.c = setRandom();
	}
	public boolean getCount() {//종료 여부 반환
		return count;//true면 종료, false면 계속 진행
	}
	public String result() {//결과 문장 반환
		String result = "\t"+a+"  "+b+"  "+c+"  ";//a, b, c값 저장
		if(a==b&&b==c) {//세 수가 같은 경우
			count = true; //종료 여부 true
			return (result+this.name+"님이 이겼습니다!");//문장 반환
		}
		else {//세 수가 같지 않은 경우
			count = false;//종료 여부 false
			return (result+"아쉽군요!");//문장 반환
		}
	}
}

public class Main{
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("1번째 선수 이름>>");//선수 이름 입력받기
		String first = scanner.next();
		Person p1 = new Person(first);//객체 생성
		System.out.print("2번째 선수 이름>>");
		String second = scanner.next();
		Person p2 = new Person(second);//객체 생성
		
		while(true) {//break문 전까지 계속 반복
			p1.setNumber();//1번째 선수 a, b, c값 생성
			System.out.println(p1.result());//결과 문장 출력
			if(p1.getCount() == true) break;//종료 여부가 true인 경우 while문 종료
			p2.setNumber();//2번째 선수 a, b, c값 생성
			System.out.println(p2.result());//결과 문장 출력
			if(p2.getCount() == true) break;//종료 여부가 true인 경우 while문 종료
		}
	}
}

실행 결과


[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.*;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print(">>");//문장 입력
		String s = scanner.nextLine();//<Enter>키를 기준으로 입력
	    StringBuffer sb = new StringBuffer(s);//StingBuffer 생성
	    
	    while(true) {//break문이 나오기 전까지 반복
	    	System.out.print("명령:");
	    	String change = scanner.nextLine();//명령 입력받기
	    	if(change.equals("그만")) {//그만인 경우
	    		System.out.println("종료합니다.");
	    		break;//while문에서 나오기
	    	}
	    	String [] t = change.split("!");//!를 기준으로 단어 분리해서 t에 배열 형식으로 저장
			if(t.length != 2) {//단어가 두 개가 아닌 경우
				System.out.println("잘못된 명령입니다!");
			}
			else {//
				if(t[0].length() == 0 || t[1].length() == 0) {//단어의 길이가 0인 경우
					System.out.println("잘못된 명령입니다!");
				}
				int index = sb.indexOf(t[0]);//문장 내에서 바꿀 단어의 위치 저장
				if(index == -1) {//문장 내에 단어가 없는 경우
					System.out.println("찾을 수 없습니다!");
				}
				else{//모든 조건을 만족한 경우
					sb.replace(index, index+t[0].length(), t[1]);//바꿀 단어를 바꾸려는 단어로 교체
					System.out.println(sb.toString());//문장 출력
				}
			}
	    }
	}
}

실행 결과


[12번]

만제 10의 겜블링 게임을 n명이 하도록 수정하라. 실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 입력받고록 수정하라.

갬블링 게임에 참여할 선수 숫자>>3
1번째 선수 이름>>황
2번째 선수 이름>>이
3번째 선수 이름>>김
[황]:<Enter>
		2	3	3	아쉽군요!
[이]:<Enter>
		1	2	2	아쉽군요!
[김]:<Enter>
		2	2	3	아쉽군요!
[황]:<Enter>
		3	2	2	아쉽군요!
[이]:<Enter>
		1	1	3	아쉽군요!
[김]:<Enter>
		2	2	1	아쉽군요!
[황]:<Enter>
		2	2	2	황님이 이겼습니다!
        
import java.util.*;

class Person {//Person 클랫
	private String name;//이름 저장용 변수
	private int a, b, c;//세 수 저장용 변수
	private boolean count;//경기 종료 여부 저장용 변수
	Scanner scanner;
	public Person(String name) {//생성자
		scanner = new Scanner(System.in);
		this.name = name;//이름 초기화
		this.count = false;//종료 여부 false로 저장
	}
	public int setRandom() {//1~3 사이의 랜덤값 반환
		return (int)(Math.random()*3+1);
	}
	public void setNumber() {//a, b, c에 값 저장
		System.out.print("["+this.name+"]:<Enter>");//이름 출력
		String s = scanner.nextLine();//Enter 키 입력
		this.a = setRandom();//a, b, c에 난수 저장
		this.b = setRandom();
		this.c = setRandom();
	}
	public boolean getCount() {//종료 여부 반환
		return count;//true면 종료, false면 계속 진행
	}
	public String result() {//결과 문장 반환
		String result = "\t"+a+"  "+b+"  "+c+"  ";//a, b, c값 저장
		if(a==b&&b==c) {//세 수가 같은 경우
			count = true; //종료 여부 true
			return (result+this.name+"님이 이겼습니다!");//문장 반환
		}
		else {//세 수가 같지 않은 경우
			count = false;//종료 여부 false
			return (result+"아쉽군요!");//문장 반환
		}
	}
}

public class Main{
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("갬블링 게임에 참여할 선수 숫자>>");
		int n = scanner.nextInt();//선수 숫자 저장
		Person[] person = new Person[n];//Person 클래스 배열
		for(int i = 0; i<n; i++) {//선수 숫자만큼 객체 생성
			System.out.print(i+1+"번째 선수 이름>>");
			String name = scanner.next();
			person[i] = new Person(name);
		}
		int j = 0;
		while(true) {//break문 전까지 무한 반복
			person[j].setNumber();//a, b, c값 1~3 사이의 랜덤 값으로 변경
			System.out.println(person[j].result());//결과값 출력
			if(person[j].getCount() == true) break;//세 수가 같은 경우 while문 중단
			else {//세 수가 같지 않은 경우
				if(j == n-1) j = 0;//무한 반복을 위해 j값 변경
				else j++;
			}
		}
	}
}

실행 결과