[명품 JAVA Programming] 제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("다른 점");
}
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++;
}
}
}
}
실행 결과