본문으로 바로가기

[Chapter4_실습문제]

category withTextBook/명품 JAVA 프로그래밍 2021. 4. 14. 17:40

1. 자바 클래스를 작성하는 연습을 해보자.

1. 다음 main( ) 메소드를 실행하였을 때 예시와 같이 출력되도록 TV 클래스를 작성하라.

 

public class TV {
	
	public String name;
	public int year;
	public int inch;
	
    
	public TV (String name, int year, int inch) {
    
		this.name = name;
		this.year = year;
		this.inch = inch;
	}
	
    
	public void show () {
    
		System.out.println(this.name + "에서 만든 " + this.year + "년형 " + this.inch + "인치 TV");
	}
	
    
	public static void main(String[] args) {
    
		TV myTV = new TV("LG", 2017, 32);
		myTV.show();	
	}
}

2. Grade 클래스를 작성해보자.

2. 3 과목의 점수를 입력받아 Grade 객체를 생성하고 성적 평균을 출력하는 main( )과 실행 예시는 다음과 같다.

 

import java.util.Scanner;

public class Grade {
	
	private int math;
	private int science;
	private int english;
	
    
	public Grade (int math, int science, int english) {
    
		this.math = math;
		this.science = science;
		this.english = english;
	}
	
    
	public int average () {
    
		return (math + science + english) / 3; 
	}
	
	
	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("수학, 과학, 영어 순으로 3개의 점수 입력>>");
		int math = scanner.nextInt();
		int science = scanner.nextInt();
		int english = scanner.nextInt();
        
        
		Grade me = new Grade(math, science, english);
		System.out.println("평균은 " + me.average());
		
        
		scanner.close();
	}
}

3. 노래 한 곡을 나타내는 Song 클래스를 작성하라.

3. Song은 다음 필드로 구성된다.

  • 노래의 제목을 나타내는 title
  • 가수를 나타내는 artist
  • 노래가 발표된 연도를 나타내는 year
  • 국적을 나타내는 country

3. 또한 Song 클래스에 다음 생성자와 메소드를 작성하라.

  • 생성자 2개: 기본 생성자와 매개변수로 모든 필드를 초기화하는 생성자
  • 노래 정보를 출력하는 show( ) 메소드
  • main( ) 메소드에서는 1978년, 스웨덴 국적의 ABBA가 부른 "Dancing Queen"을 Song 객체로 생성하고
    show( )를 이용하여 노래의 정보를 다음과 같이 출력하라.

 

public class Song {
	
	private String title;
	private String artist;
	private int year;
	private String country;
	
    
	public Song () { }
	
    
	public Song (String title, String artist, int year, String country) {
    
		this.title = title;
		this.artist = artist;
		this.year = year;
		this.country = country;
	}
	
    
	public void show() {
    
		System.out.println(year + "년 " + country + "국적의 " + artist + "가 부른 " + title);
	}
	
    
	public static void main(String[] args) {
    
		Song song = new Song("Dancing Queen", "ABBA", 1978, "스웨덴");
		song.show();
	}
}

4. 다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.

  • int 타입의 x, y, width, height 필드: 사각형을 구성하는 점과 크기 정보
  • x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자
  • int square( ): 사각형 넓이 리턴
  • void show( ): 사각형의 좌표와 넓이를 화면에 출력
  • boolean contains(Rectangle r): 매개변수로 받은 r이 현 사각형 안에 있으면 true 리턴
  • main( ) 메소드의 코드와 실행 결과는 다음과 같다

 

public class Rectangle {
	
	private int x;
	private int y;
	private int width;
	private int height;
	
	
	public Rectangle (int x, int y, int width, int height) {
		
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
	}
	
	
	public int square() {
		
		return this.width * this.height;
	}
	
	
	public void show() {
		
		System.out.println("(" + x + "," + y + ")에서 크기가 " + width + "x" + height + "인 사각형");
	}
	
    
	public boolean contains(Rectangle r) {
		
		if((this.x < r.x) && (this.x + this.width > r.x + r.width) && (this.y < r.y)&& (this.y + this.height > r.y + r.height))
			return true;
		else
			return false;
	} 
	
    
	public static void main(String[] args) {
		
		Rectangle r = new Rectangle(2, 2, 8, 7);
		Rectangle s = new Rectangle(5, 5, 6, 6);
		Rectangle t = new Rectangle(1, 1, 10, 10);
		
		r.show();
		System.out.println("s의 면적은 " + s.square());
		if(t.contains(r)) System.out.println("t는 r을 포함합니다.");
		if(t.contains(s)) System.out.println("t는 s를 포함합니다.");
	}
}

5. 다음 설명대로 Circle 클래스와 CircleManager 클래스를 완성하라.

5. 다음 실행 결과와 같이 3개의 Circle 객체 배열을 만들고 x, y, radius 값을 읽어 3개의 Circle 객체를 만들고

5. show( )를 이용하여 이들을 모두 출력한다.

 

import java.util.Scanner;

public class Circle {
	
	private double x, y;
	private int radius;
	
    
	public Circle (double x, double y, int radius) {
    
		this.x = x;
		this.y = y;
		this.radius = radius;
	}
	
    
	public void show() {
		System.out.println("(" + x + "," + y + ")" + radius);
	}
}



public class CircleManager {

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
        
		Circle c [] = new Circle[3];
        
		for (int i = 0; i < 3; i++) {
			System.out.print("x, y, radius >> ");
			double x = scanner.nextDouble();
			double y = scanner.nextDouble();
			int radius = scanner.nextInt();
            
			c[i] = new Circle(x, y, radius);
		}
		
        
		for (int i = 0; i < c.length; i++)
			c[i].show();
		
        
		scanner.close();
	}
}

6. 앞의 5번 문제는 정답이 공개되어 있다.

6. 이 정답을 참고하여 Circle 클래스와 CircleManager 클래스를 수정하여 다음 실행 결과처럼 되게 하라.

 

import java.util.Scanner;

public class Circle {
	
	private double x, y;
	private int radius;
	
    
	public Circle (double x, double y, int radius) {
    
		this.x = x;
		this.y = y;
		this.radius = radius;
	}
	
    
	public int getRadius() {
    
		return this.radius;
	}
	
    
	public void show() {
    
		System.out.println("가장 면적이 큰 원은 (" + x + "," + y + ")" + radius);
	}
}



public class CircleManager {	

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
		Circle c [] = new Circle[3];
        
		for (int i = 0; i < 3; i++) {
			System.out.print("x, y, radius >> ");
			double x = scanner.nextDouble();
			double y = scanner.nextDouble();
            
			int radius = scanner.nextInt();
			c[i] = new Circle(x, y, radius);
		}
		
        
		int largestIndex = 0;
		for (int i = 1; i < c.length; i++) { // 반지름이 가장 큰 원 찾기
			if (c[i].getRadius() > c[largestIndex].getRadius())
				largestIndex = i;
		}
        
		c[largestIndex].show();
		
        
		scanner.close();
	}
}

7. 하루의 할 일을 표현하는 클래스 Day는 다음과 같다.

7. 한 달의 할 일을 표현하는 MonthSchedule 클래스를 작성하라.

7. MonthSchedule 클래스에는 Day 객체 배열과 적절한 필드, 메소드를 작성하고

7. 실행 예시처럼 입력, 보기, 끝내기 등의 3개의 기능을 작성하라.

 

import java.util.Scanner;

class Day {
	
	private String work;
	
    
	public void set (String work) {
    
		this.work = work;
	}


	public String get() {
    
		return work;
	}
	
    
	public void show() {
    
		if(work == null) System.out.println("없습니다.");
		else System.out.println(work + "입니다.");
	}
}



class MonthSchedule {
	
	private int days;
	private Day[] month;
	private Scanner scanner;
	
    
	public MonthSchedule (int days) {
    
		this.days = days;
		month = new Day[days];
		scanner = new Scanner(System.in);
	}
	
    
	public void input() {
		
		System.out.print("날짜(1~30)?");
		int d = scanner.nextInt();
        
		System.out.println("할일(빈칸없이 입력)?");
		String s = scanner.next();
		
		month[d-1] = new Day();
		month[d-1].set(s);
	}
	
    
	public void view() {
		
		System.out.print("날짜(1~30)?");
		int d = scanner.nextInt();
        
		System.out.print(d + "일의 할 일은 ");
		month[d-1].show();
	}
	
    
	public void finish() {
    
		System.out.println("프로그램을 종료합니다.");
	}
	
    
	public void run() {
		
		while (true) {
        
			System.out.print("할일(입력:1, 보기:2, 끝내기:3) >>");
			int num = scanner.nextInt();
			
			if (num == 1)
				input();
			
			else if (num == 2)
				view();
			
			else if (num == 3) {
				finish();
				break;
			}
		}
	}
	
    
	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("이번달 스케줄 관리 프로그램.");
		MonthSchedule april = new MonthSchedule(30);
		april.run();
		
        
		scanner.close();
	}
}

8. 이름(name), 전화번호(tel) 필드와 생성자 등을 가진 Phone 클래스를 작성하고,

8. 실행 예시와 같이 작동하는 PhoneBook 클래스를 작성하라.

 

import java.util.Scanner;

public class Phone {
	
	private String name;
	private String tel;
	
	
	public Phone() { }
	public Phone (String name, String tel) {
		
		this.name = name;
		this.tel = tel;
	}
	
	
	public String gets() {
    
		return name;
	}
	
    
	public void show (String s) {
		if (name.equals(s))
			System.out.println(name + "의 번호는 " + tel + "입니다.");
	}
}



public class PhoneBook {
	
	public int person;
	private Phone[] phone;
	private Scanner scanner;
	
    
	public PhoneBook() {
		scanner = new Scanner(System.in);
	}
	
    
	public void view() {
    
		while (true) {
			System.out.print("검색할 이름>>");
			String name = scanner.next();
			
            
			if (name.equals("그만"))
				finish();
			
            
			for (int i = 0; i < person; i++) {
				if (name.equals(phone[i].gets())) {
					phone[i].show(name);
					break;
				}
                
				if (i == person - 1)
					System.out.println(name + " 이 없습니다.");
			}
		}
	}
	
    
	public void finish() {
		System.exit(0);
	}
	
    
	public void run() {
    
		this.phone = new Phone[person];
		
		for (int i = 0 ; i < person; i++) {
			System.out.print("이름과 전화번호(이름과 번호는 빈 칸없이 입력)>>");
			String name = scanner.next();
			String tel = scanner.next();
            
			phone[i] = new Phone(name, tel);
		}
        
		System.out.println("저장되었습니다...");
        
		view();
	}


	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
		PhoneBook phonebook = new PhoneBook();
        
		System.out.print("인원수>>");
		phonebook.person = scanner.nextInt();
        
		phonebook.run();
		
        
		scanner.close();
	}
}

9. 다음 2개의 static 메소드를 가진 ArrayUtil 클래스를 만들어보자.

9. 다음 코드의 실행 결과를 참고하여 concat( )와 print( )를 작성하여 ArrayUtil 클래스를 완성하라.

 

class ArrayUtil {
	
	public static int [] concat (int[] a, int[] b) {
		
		int size = a.length + b.length;
		int[] ab = new int[size];
		
        
		for (int i = 0; i < size; i++) {
			if(i < a.length)
				ab[i] = a[i];
			else
				ab[i] = b[i-a.length];
		}
		
        
		return ab;
	}
	
    
	public static void print (int[] a) {
		
		System.out.print("[ ");
        
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
            
		System.out.print("]");
	}
}



public class StaticEx {

	public static void main(String[] args) {
    
		int [] array1 = {1, 5, 7, 9};
		int [] array2 = {3, 6, -1, 100, 77};
		int [] array3 = ArrayUtil.concat(array1, array2);
        
        
		ArrayUtil.print(array3);
	}
}

10. 다음과 같은 Dictionary 클래스가 있다.

10. 실행 결과와 같이 작동하도록 Dictionary 클래스의 kor2Eng( ) 메소드와 DicApp 클래스를 작성하라.

 

import java.util.Scanner;

public class Dictionary {

	private static String [] kor = {"사랑", "아기", "돈", "미래", "희망"};
	private static String [] eng = {"love", "baby", "money", "future", "hope"};
	
    
	public static String kor2Eng(String word) {
    
		for (int i = 0; i < kor.length; i++) {
			if (kor[i].equals(word))
				return eng[i];
		}
        
		return ("저의 사전에 없습니다.");
	}
}



public class DicApp {

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
        
		Dictionary dictionary = new Dictionary();
		
		System.out.println("한영 단어 검색 프로그램입니다.");
        
		while (true) {
			System.out.print("한글 단어?");
			String word = scanner.next();
			
			if(word.equals("그만"))
				break;
			
			System.out.print(word);
            
			word = dictionary.kor2Eng(word);
			System.out.println("은 " + word);
		}
		
        
		scanner.close();
	}
}

11. 다수의 클래스를 만들고 활용하는 연습을 해보자.

11. 더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수행하는 각 클래스 Add, Sub, Mul, Div를 만들어라.

11. 이들은 모두 다음 필드와 메소드를 가진다.

  • int 타입의 a, b 필드: 2개의 피연산자
  • void setValue(int a, int b): 피연산자 값을 객체 내에 저장한다.
  • int calculate( ): 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.

11. main( ) 메소드에서는 다음 실행 사례와 같이 두 정수와 연산자를 입력받고

11. Add, Sub, Mul, Div 중에서 이 연산을 실행할 수 있는 객체를 생성하고

11. setValue( )와 calculate( )를 호출하여 결과를 출력하도록 작성하라.

11. (참고: 이 문제는 상속을 이용하여 다시 작성하도록 5장의 실습문제로 이어진다.)

 

import java.util.Scanner;

public class Add {
	
	public int a;
	public int b;
	
    
	public void setValue (int a, int b) {
    
		this.a = a;
		this.b = b;
	}
	
    
	public int calculate() {
    
		return this.a + this.b;
	}
}



public class Sub {
	
	public int a;
	public int b;
	
    
	public void setValue (int a, int b) {
    
		this.a = a;
		this.b = b;
	}
	
    
	public int calculate() {
    
		return this.a - this.b;
	}
}



public class Mul {
	
	public int a;
	public int b;
	
    
	public void setValue (int a, int b) {
    
		this.a = a;
		this.b = b;
	}
	
    
	public int calculate() {
    
		return this.a * this.b;
	}
}



public class Div {
	
	public int a;
	public int b;
	
    
	public void setValue (int a, int b) {
    
		this.a = a;
		this.b = b;
	}
	
    
	public int calculate() {
    
		return this.a / this.b;
	}
}



public class Cal {

	public static void main(String[] args) {
    
		Scanner scanner = new Scanner(System.in);
		
        
		System.out.print("두 정수와 연산자를 입력하시오>>");
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		char c = scanner.next().charAt(0);
		
        
		switch (c) {
			case '+' :
				Add add = new Add();
				add.setValue(a,  b);
				System.out.println(add.calculate());
				break;
			case '-' : 
				Sub sub = new Sub();
				sub.setValue(a,  b);
				System.out.println(sub.calculate());
				break;
			case '*' : 
				Mul mul = new Mul();
				mul.setValue(a,  b);
				System.out.println(mul.calculate());
				break;
			case '/' : 
				Div div = new Div();
				div.setValue(a,  b);
				System.out.println(div.calculate());
				break;
		}
		
        
		scanner.close();
	}
}

12. 간단한 콘서트 예약 시스템을 만들어보자.

12. 다수의 클래스를 다루고 객체의 배열을 다루기에는 아직 자바 프로그램 개발이 익숙하지 않은 초바자에게 다소 무리가 있을 것이다.

12. 그러나 반드시 넘어야 할 산이다.

12. 이 도전을 통해 산을 넘어갈 수 있는 체력을 키워보자.

12. 예약 시스템의 기능은 다음과 같다.

  • 공연은 하루에 한 번 있다.
  • 좌석은 S석, A석, B석으로 나뉘며, 각각 10개의 좌석이 있다.
  • 예약 시스템의 메뉴는 "예약", "조회", "취소", "끝내기"가 있다.
  • 예약은 한 자리만 가능하고, 좌석 타입, 예약자 이름, 좌석 번호를 순서대로 입력받아 예약한다.
  • 조회는 모든 좌석을 출력한다.
  • 취소는 예약자의 이름을 입력받아 취소한다.
  • 없는 이름, 없는 번호, 없는 메뉴, 잘못된 취소 등에 대해서 오류 메시지를 출력하고 사용자가 다시 시도하도록 한다.

 

import java.util.Scanner;

public class Reserve {
	
	private String name = " --- ";
	
	public void show() {
    
		System.out.print(name);
	}
	
    
	public void set (String name) {
    
		this.name = name;
	}
	
	public boolean check (String nameS) {
    
		if (nameS.equals(this.name))
			return true;
		else
			return false;
	}
}



public class ReserveSystem {
	
	private Reserve[] seatS = new Reserve[10];
	private Reserve[] seatA = new Reserve[10];
	private Reserve[] seatB = new Reserve[10];
	private Scanner scanner;
	
    
	public ReserveSystem() {
    
		scanner = new Scanner(System.in);
	}
	
    
	public void book() { // 예약
		
        while (true) {
			System.out.print("좌석구분 S(1), A(2), B(3)>>");
			int num = scanner.nextInt();
            
			switch(num) {
			case 1:
				System.out.print("S>> ");
				for (int i = 0; i < 10; i++)
					seatS[i].show();
				
				System.out.print("\n이름>>");
				String nameS = scanner.next();
                
				while (true) {
					System.out.print("번호>>");
					int seatSNum = scanner.nextInt();
					
					if (seatSNum < 1 || seatSNum > 10) {
						System.out.println("없는 좌석입니다. 다시 입력해주세요.");
						continue;
					}
                    
					seatS[seatSNum-1].set(nameS);
					break;
				}
				break;
			case 2:
				System.out.print("A>> ");
				for (int i = 0; i < 10; i++)
					seatA[i].show();
				
				System.out.print("\n이름>>");
				String nameA = scanner.next();
                
				while (true) {
					System.out.print("번호>>");
					int seatANum = scanner.nextInt();
					
					if (seatANum < 1 || seatANum > 10) {
						System.out.println("없는 좌석입니다. 다시 입력해주세요.");
						continue;
					}
                    
					seatA[seatANum-1].set(nameA);
					break;
				}
				break;
			case 3:
				System.out.print("B>> ");
				for(int i = 0; i < 10; i++)
					seatB[i].show();
				
				System.out.print("\n이름>>");
				String nameB = scanner.next();
                
				while (true) {
					System.out.print("번호>>");
					int seatBNum = scanner.nextInt();
					
					if (seatBNum < 1 || seatBNum > 10) {
						System.out.println("없는 좌석입니다. 다시 입력해주세요.");
						continue;
					}
                    
					seatB[seatBNum-1].set(nameB);
					break;
				}
				break;
			default:
				System.out.println("없는 좌석입니다. 다시 입력해주세요.");
				continue;
			}
			break;
		}
	}
	
    
	public void view() { // 조회
		System.out.print("S>> ");
		for (int i = 0; i < 10; i++) {	
			seatS[i].show();
		}
        
		System.out.print("\nA>> ");
		for (int i = 0; i < 10; i++) {
			seatA[i].show();
		}
        
		System.out.print("\nB>> ");
		for (int i = 0; i < 10; i++) {
			seatB[i].show();
		}
		System.out.println("\n<<<조회를 완료하였습니다.>>>");
	}
	
    
	public void cancel() { // 취소
		System.out.print("좌석 S:1, A:2, B:3>>");
		int num = scanner.nextInt();
        
		switch(num) {
		case 1:
			System.out.print("S>> ");
			for (int i = 0; i < 10; i++)
				seatS[i].show();
                
			System.out.print("\n이름>>");
			String nameS = scanner.next();
            
			for (int i = 0; i < 10; i++) {
				if(seatS[i].check(nameS))
					seatS[i].set(" --- ");
			}
			break;
			
		case 2:
			System.out.print("A>> ");
			for (int i = 0; i < 10; i++)
				seatA[i].show();
                
			System.out.print("\n이름>>");
			String nameA = scanner.next();
            
			for (int i = 0; i < 10; i++) {
				if (seatA[i].check(nameA))
					seatA[i].set(" --- ");
			}
			break;
			
		case 3:
			System.out.print("B>> ");
			for(int i = 0; i < 10; i++)
				seatB[i].show();
                
			System.out.print("\n이름>>");
			String nameB = scanner.next();
            
			for (int i = 0; i < 10; i++) {
				if (seatB[i].check(nameB))
					seatB[i].set(" --- ");
			}
			break;	
		}
	}
	
    
	public void finish() {
    
		System.exit(0);
	}


	public void run() {
		for (int i = 0; i < 10; i++) {
			seatS[i] = new Reserve();
			seatA[i] = new Reserve();
			seatB[i] = new Reserve();
		}
		
		System.out.println("명품콘서트홀 예약 시스템입니다.");
        
		while (true) {
			System.out.print("예약:1, 조회:2, 취소:3, 끝내기:4>>");
			int num = scanner.nextInt();
            
			switch (num) {
				case 1:
					book();
					continue;
				case 2:
					view();
					continue;
				case 3:
					cancel();
					continue;
				case 4:
					finish();
					continue;
			}		
		}
	}
	
	
	public static void main(String[] args) {
		
		ReserveSystem reservesystem = new ReserveSystem();
		reservesystem.run();
	}
}