JAVA - 클래스와 상속 실습
문제1. 제시된 두 개의 클래스가 공통으로 갖는 필드와 메소드를 추상 클래스와 재정의를 사용하여 도형 넓이를 계 산하는 프로그램으로 완성 하시오

public abstract class Shapes{
abstract double area();
abstract void write();
}
class Circle extends Shapes{
static final double PI = 3.14;
double r;
public Circle(double r) {
this.r=r;
}
double area() {
return r * r * PI;
}
void write() {
System.out.print("Circle [radius="+r);
System.out.printf("\tarea= %.2f]\n", area());
}
}
class Rectangle extends Shapes{
private double d1,d2;
Rectangle(double d1, double d2){
this.d1=d1;
this.d2=d2;
}
double area() {
return d1 * d2;
}
void write() {
System.out.print("Rectangle [d1:"+d1+", d2:"+d2);
System.out.printf("\tarea= %.2f]\n", area());
}
}
import java.util.Scanner;
public class ShapesTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
Shapes obj=null;
System.out.println("반지름 입력>>");
double r = in.nextDouble();
obj = new Circle(r);
obj.write();
System.out.println("가로 세로 입력>>");
obj = new Rectangle(in.nextDouble(),in.nextDouble());
obj.write();
}
}
문제2. 상속과 재정의를 활용하여 제시된 결과처럼 출력하는 프로그램을 완성하시오

public class Account{
private String acNum;
private String acname;
private int balance;
Account(String num, String name, int bal){
acname=name;
acNum=num;
balance=bal;
}
void deposit(int amount) { //예금
balance += amount;
}
int withdraw(int amount) { //인출
if(amount > balance)
System.out.println((amount-balance)+"만큼 잔액 부족");
else
balance -= amount;
return amount;
}
public int getBalance() {
return balance;
}
void disPlay() {
System.out.println("계좌번호: "+acNum);
System.out.println("예금주: "+acname);
System.out.println("잔액: "+balance);
}
}
class CheckingAccount extends Account{
private String cardNo;
CheckingAccount(String num,String name,int bal,String ca){
super(num,name,bal);
cardNo=ca;
}
int pay(String cardNo,int amount) {
if(!cardNo.equals(this.cardNo)||(getBalance()<amount)) {
System.out.println("지불이 불가능합니다.");
return amount;
}
else
return withdraw(amount);
}
void write() {
disPlay();
System.out.println("카드번호: "+cardNo);
}
}
public class AccountApp {
public static void main(String[] args) {
System.out.println(">>예금전<<");
CheckingAccount obj = new CheckingAccount("111-22-3333","홍길동",100000,"55-66-77-88");
obj.write();
System.out.println(">>예금후<<");
obj.deposit(20000);
obj.write();
System.out.println(">>직불카드 사용후<<");
obj.pay("55-66-77-88", 20000);
obj.write();
}
}
문제3. Person 클래스를 설계합니다. Person 클래스는 이름, 주소, 전화번호를 필드로 가집니다. 하나 이상의 생성자 를 정의하고 각 필드에 대하여 접근자/설정자 메소드를 작성하세요. Person 클래스를 상속 받아 Customer 클래스를 작성합니다. Customer는 고객 번호와 마일리지를 필드로 가집니다. 한 개 이상의 생성자를 작성하 고 적절한 접근자/설정자 메소드를 작성하세요. 테스트 클래스를 작성하여 위 클래스 타입의 객체를 만들고 각 객체의 모든 정보를 출력하세요.
public class Person {
private String name;
private String address;
private String num;
Person(){
this(null,null);
}
Person(String name, String address){
this.name=name;
this.address=address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + ", num=" + num + "]";
}
}
class Customer extends Person{
int customNum;
int mile;
Customer(){
this(null,null,0,0);
}
Customer(String name,String address,int customNum,int mile){
super(name,address);
this.customNum=customNum;
this.mile=mile;
}
public int getCustomNum() {
return customNum;
}
public void setCustomNum(int customNum) {
this.customNum = customNum;
}
public int getMile() {
return mile;
}
public void setMile(int mile) {
this.mile = mile;
}
@Override
public String toString() {
String str =super.toString();
return str+"Customer [customNum=" + customNum + ", mile=" + mile + "]";
}
}
public class PersonTest {
public static void main(String[] args) {
Customer cus = new Customer("hallym","강원도",23,34);
Person per = new Person("parent","경기도");
System.out.println(cus);
System.out.println(per);
}
}
문제4. 일반적인 책을 나타내는 Book 클래스를 상속받아서 잡지를 나타내는 Magazine 클래스를 작성합니다. Book 클래스는 제목, 페이지수, 저자 등의 정보를 가집니다. Magazine 클래스는 추가로 발매일 정보를 가집니다. 생성자, 접근자, 설정자를 포함하여서 각각의 클래스를 작성하세요. 이들 클래스들의 객체를 만들고 각 객체 의 모든 정보를 출력하는 테스트 클래스를 작성하세요.
class Book{
private String title;
private int page;
private String writer;
Book(String title,int page, String writer){
this.title=title;
this.page=page;
this.writer=writer;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
@Override
public String toString() {
return "제목=" + title + "\n페이지수=" + page + "\n저자=" + writer + "\n";
}
}
class Magazine extends Book{
String date;
Magazine(String title, int page, String writer,String date) {
super(title, page, writer);
this.date=date;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
String str = super.toString();
return str+"발매일=" + date + "\n";
}
}
public class BookTest {
public static void main(String[] args) {
Magazine magA = new Magazine("잡지A",10,"기자 A","2010년 2월 25일");
Magazine magB = new Magazine("잡지B",14,"기자B","2010년 3월 13일");
System.out.println(magA.toString());
System.out.println(">>bookA 객체 저자 변경 후<< ");
magA.setWriter("기자변경");
System.out.println(magA.toString());
System.out.println(magB.toString());
System.out.println(">>bookB 객체 페이지 변경 후<< ");
magB.setPage(50);
System.out.println(magB.toString());
System.out.println(">>bookB 객체 발매일 변경 후<< ");
magB.setDate("2020년9월 21일");
System.out.println(magB.toString());
}
}
문제5. 일반적인 음식을 나타내는 Food 클래스를 상속받아서 멜론을 나타내는 Melon 클래스를 작성합니다. Food 클래스는 칼로리, 가격, 중량 등의 정보를 가집니다. Melon 클래스는 추가로 경작농원정보를 가집니다. 생성 자, 접근자, 설정자를 포함하여서 각각의 클래스를 작성합니다. 이들 클래스들의 객체를 만들고 각 객체의 모 든 정보를 출력하는 테스트 클래스도 작성합니다.

class Food{
private int cal;
private int cost;
private int kg;
Food(int cost, int kg){
this.cost=cost;
this.kg=kg;
}
public int getCal() {
return cal;
}
public void setCal(int cal) {
this.cal = cal;
}
public int getCost() {
return cost;
}
public void setCost(int cost) {
this.cost = cost;
}
public int getKg() {
return kg;
}
public void setKg(int kg) {
this.kg = kg;
}
@Override
public String toString() {
return "[cost=" + cost + ", kg=" + kg ;
}
}
class Melon extends Food{
String info;
Melon(int cost,int kg,String info){
super(cost,kg);
this.info=info;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
String str = super.toString();
return str+" info=" + info + "]";
}
}
public class MelonTest {
public static void main(String[] args) {
Melon m1 = new Melon(2500,21,"hallym_farm");
Melon m2 = new Melon(2000,10,"Software_farm");
System.out.println("m1 객체 정보"+m1);
System.out.println("m2 객체 정보"+m2);
System.out.println(">>m2 객체의 cost와 경작농원 정보 변경 후 <<");
m2.setCost(3000);
m2.setInfo("Java_farm");
System.out.println("m2:"+m2);
}
}
문제 6. 제시된 클래스를 상속과 재정의를 사용하여 프로그램을 작성하고 각 클래스에 대한 객체를 생성하고 테스트 하시오


import java.util.Scanner;
class Persons{
private String pname;
private String pnum;
Persons(String pName, String pnum){
this.pname=pName;
this.pnum=pnum;
}
public int computeSalary() {
return 0;
}
@Override
public String toString() {
return "이름:" + pname + ", 사번:" + pnum ;
}
}
class SalriedEmployee extends Persons{
int salary;
SalriedEmployee(String pName, String pnum, int salary) {
super(pName, pnum);
this.salary=salary;
}
public int computeSalary() {
return salary * 12;
}
@Override
public String toString() {
String str = super.toString();
return str+", 급여:" + salary + ", 연봉:"+computeSalary();
}
}
class HourEmployee extends Persons{
private int h_pay, hours;
public HourEmployee(String pName,String pnum,int h_pay, int hours) {
super(pName,pnum);
this.h_pay=h_pay;
this.hours=hours;
}
public int computeSalary() {
return h_pay*hours;
}
@Override
public String toString() {
return super.toString()+", 시간당 임금:" + h_pay + ", 일한시간:" + hours + ", 금액:"+computeSalary();
}
}
public class PersonsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
boolean flag = true;
Persons per = null;
while(flag) {
System.out.print("1:Salaried 객체 생성, 2:Hour 객체 생성, 3: 종료 -->");
int menu = in.nextInt();
switch(menu) {
case 1:
System.out.println("이름, 사번, 급여를 입력하세요");
per = new SalriedEmployee(in.next(),in.next(),in.nextInt());
break;
case 2:
System.out.println("이름, 사번, 시간당임금, 시간을 입력하세요");
per = new HourEmployee(in.next(),in.next(),in.nextInt(),in.nextInt());
break;
case 3:
flag = false;
break;
default:
System.out.println("잘못된 입력입니다.");
}
System.out.println(per);
}
in.close();
System.out.println("프로그램을 종료합니다.");
}
}