1. is a 관계와 has a 관계에 대하여 설명하시오.
- ia a: 상하 관계가 분명한 두 클래스가 가지는 특성
- ex) 자식 is a 부모
- has a: 하위 분류 클래스가 여러개로 가지는 상하 관계가 불분명한 특성
- ex) 아이폰, 갤럭시, G has a 스마트폰
2. 다형성이란 무엇인가?
: 부모 클래스는 곧 자식 클래스(부모 = 자식)가 되는 성질을 가진 객체지향프로그래밍 기법 중 하나이다.
SubCLS cls1 = new Sub(); // 일반적인 상속받은 클래스의 객체 생성
SupCLS cls2 = new Sub(); // 다형성을 이용하면 상위객체 타입으로도 하위 클래스의 객체가 생성가능하다.
3. 아래가 되지 않는 이유에 대하여 메모리 그림으로 설명하시오.
SmartPhone s = new MobilePhone(); // MobilePhone(부모) SmartPhone(자식)
4. 메소드 오버라이딩 이란?
: 메소드 오버라이딩(Overriding)은 상위와 하위 클래스 모두 같은 반환 타입, 이름, 파라미터 수를 가진 메소드가 존재할 때, 하위 클래스의 메소드의 구현부만이 출력하게 되는 특성을 지니는 기법이다.
// 상위 클래스
class Cake {
public void yummy() {
System.out.println("Yummy Cake");
}
}
// 하위 클래스
class CheeseCake extends Cake {
@Override // Annotation 표기로 오버라이드 메소드임을 컴파일에 명시하여, 이러한 방법이 적용되지 않은 메소드인 경우 컴파일 에러가 뜨게 한다.
public void yummy() { // 메소가 상위 클래스와 반환타입, 이름이 서로 동일
System.out.println("Yummy Cheese Cake");
}
}
// 메인 클래스
class MyCake {
public static void main(String[] args) {
Cake cake = new CheeseCake(); // 상위 = new 하위
CheeseCake cheeseCake = new CheeseCake(); // 하위 = new 하위
cake.yummy(); // 메소드 오버라이딩이 적용 cheeseCake.yummy();
}
}
> Yummy Cheese Cake > Yummy Cheese Cake
5. 갬블링 게임을 만들어보자. 두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력 받으며 각 사람은 Person 클래스로 작성하라. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자기 차례에서 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다. 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.
> 1번째 선수 이름>>수희
> 2번째 선수 이름>>연수
> [수희]: 3 1 1
> 아쉽군요!
> [연수]: 3 1 3
> 아쉽군요!
> [수희]: 2 2 1
> 아쉽군요!
> [연수]: 1 1 2
> 아쉽군요!
> [수희]: 3 3 3
> 수희님이 이겼습니다!
5-1. 메인 클래스
public class GamblingMain {
public static void main(String[] args) {
Gambling gambling = new Gambling();
gambling.getGame();
}
}
5-2. Gambling 클래스(참조 클래스)
import java.util.Random;
import java.util.Scanner;
public class Gambling {
private int i,j;
private final int NUM = 2; // 참가 선수 인원 설정
Scanner scanner = new Scanner(System.in);
Random random = new Random();
Person[] person = new Person[NUM]; // 선수
Person[][] card = new Person[NUM][3]; // 카드
private void inputPlayer() { // 선수 이름 입력
for (i = 0; i < person.length; i++) {
System.out.print((i+1) + "번째 선수 이름>>");
String user = scanner.nextLine();
person[i] = new Player(user);
}
}
public void getGame () {
inputPlayer();
loop:
while (true) {
for (i = 0; i < card.length; i++) { // 카드 패 돌리기
for (j = 0; j < card[i].length; j++) {
int cdnum = random.nextInt(3) + 1;
card[i][j] = new CardNum(cdnum);
}
}
for (i = 0; i < card.length; i++) {
System.out.print("[" + person[i].getUser() + "]:");
scanner.nextLine(); // 엔터키를 입력하여 턴 넘기기
for (j = 0; j < card[i].length; j++) {
System.out.print(card[i][j].getCard() + " "); // 한 줄마다 세 개씩 출력
}
if ((card[i][0].getCard() == card[i][1].getCard())
&& (card[i][0].getCard() == card[i][2].getCard())) { // 세 패 모두 숫자가 같은지 비교
System.out.println(person[i].getUser() + "님이 이겼습니다!");
break loop;
} else {
System.out.println("아쉽군요!");
}
}
}
}
}
5-3. Person 클래스(상위 클래스)
public class Person {
private int card;
private String user;
public Person(int card) {
this.card = card;
}
public Person(String user) {
this.user = user;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public int getCard() {
return card;
}
public void setCard(int card) {
this.card = card;
}
}
5-4. Player 클래스(하위 클래스 extends Person)
public class Player extends Person{
public Player(String user) {
super(user);
}
}
5-5. CardNum 클래스(하위 클래스 extends Person)
public class CardNum extends Person {
public CardNum(int card) {
super(card);
}
}
6. 문제 10의 갬블링 게임을 n명이 하도록 수정하라. 실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 입력받도록 수정하라.
> 겜블링 게임에 참여할 선수 숫자>>3
> 1번째 선수 이름>>황
> 2번째 선수 이름>>이
> 3번째 선수 이름>>김
> [황]: 2 3 3
> 아쉽군요!
> [이]: 1 2 2
> 아쉽군요!
> [김]: 2 2 3
> 아쉽군요!
> [황]: 3 2 2
> 아쉽군요!
> [이]: 1 1 3
> 아쉽군요!
> [김]: 2 2 1
> 아쉽군요!
> [황]: 2 2 2
> 황님이 이겼습니다!
6-1. 메인 클래스
public class GamblingMain {
public static void main(String[] args) {
Gambling gambling = new Gambling();
gambling.getGame();
}
}
6-2. Gambling 클래스(참조 클래스)
import java.util.Random;
import java.util.Scanner;
public class Gambling {
private int i,j;
private final int NUM; // 참가 선수 인원 설정
Scanner scanner = new Scanner(System.in);
Random random = new Random();
Person[] person = new Person[NUM]; // 선수
Person[][] card = new Person[NUM][3]; // 카드
private void inputPlayer() { // 선수 숫자 및 이름 입력
System.out.print("겜블링 게임에 참여할 선수 숫자>>")
NUM = scanner.nextInt();
for (i = 0; i < person.length; i++) {
System.out.print((i+1) + "번째 선수 이름>>");
String user = scanner.nextLine();
person[i] = new Player(user);
}
}
public void getGame () {
inputPlayer();
loop:
while (true) {
for (i = 0; i < card.length; i++) { // 카드 패 돌리기
for (j = 0; j < card[i].length; j++) {
int cdnum = random.nextInt(3) + 1;
card[i][j] = new CardNum(cdnum);
}
}
for (i = 0; i < card.length; i++) {
System.out.print("[" + person[i].getUser() + "]:");
scanner.nextLine(); // 엔터키를 입력하여 턴 넘기기
for (j = 0; j < card[i].length; j++) {
System.out.print(card[i][j].getCard() + " "); // 한 줄마다 세 개씩 출력
}
if ((card[i][0].getCard() == card[i][1].getCard())
&& (card[i][0].getCard() == card[i][2].getCard())) { // 세 패 모두 숫자가 같은지 비교
System.out.println(person[i].getUser() + "님이 이겼습니다!");
break loop;
} else {
System.out.println("아쉽군요!");
}
}
}
}
}
6-3. Person 클래스(상위 클래스)
public class Person {
private int card;
private String user;
public Person(int card) {
this.card = card;
}
public Person(String user) {
this.user = user;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public int getCard() {
return card;
}
public void setCard(int card) {
this.card = card;
}
}
6-4. Player 클래스(하위 클래스 extends Person)
public class Player extends Person{
public Player(String user) {
super(user);
}
}
6-5. CardNum 클래스(하위 클래스 extends Person)
public class CardNum extends Person {
public CardNum(int card) {
super(card);
}
}
7.다음을 만족하는 클래스 Employee를 작성하시오
(8번문제부터는 이것과 관련된 문제입니다).
- 클래스 Employee(직원)은 클래스 Regular(정규직)와 Temporary(비정규직)의 상위 클래스
- 필드: 이름, 나이, 주소, 부서, 월급 정보를 필드로 선언
- 생성자 : 이름, 나이, 주소, 부서를 지정하는 생성자 정의
- 메소드 printInfo() : 인자는 없고 자신의 필드 이름, 나이, 주소, 부서를 출력
7-1. HumanAffairsMain(메인 클래스)
public class HumanAffairsMain {
public static void main(String[] args) {
HumanAffairs humanAffairs = new HumanAffairs();
humanAffairs.printInfo(); // 직원 정보 출력
}
}
7-2. HumanAffair(참조 클래스)
import java.util.Scanner;
public class HumanAffairs {
Scanner scanner = new Scanner(System.in);
Employee regular = new Regular();
Employee temporary = new Temporary();
int age; // 나이
String name; // 이름
String address; // 주소
String department; // 부서
// 정규직
private String writeRegularName() {
System.out.print("당신의 이름을 입력하시오. >> ");
name = scanner.next();
regular.setName(name);
return regular.getName();
}
private int writeRegularAge() {
System.out.print("당신의 나이를 입력하시오. >> ");
age = scanner.nextInt();
regular.setAge(age);
return regular.getAge();
}
private String writeRegularAddress() {
System.out.print("당신의 주소를 입력하시오. >> ");
address = scanner.next();
regular.setAddress(address);
return regular.getAddress();
}
private String writeRegularDepartment() {
System.out.print("당신의 부서를 입력하시오. >> ");
department = scanner.next();
regular.setDepartment(department);
return regular.getDepartment();
}
// 비정규직
private String writeTemporaryName() {
System.out.print("당신의 이름을 입력하시오. >> ");
name = scanner.next();
temporary.setName(name);
return temporary.getName();
}
private int writeTemporaryAge() {
System.out.print("당신의 나이를 입력하시오. >> ");
age = scanner.nextInt();
temporary.setAge(age);
return temporary.getAge();
}
private String writeTemporaryAddress() {
System.out.print("당신의 주소를 입력하시오. >> ");
address = scanner.next();
temporary.setAddress(address);
return temporary.getAddress();
}
private String writeTemporaryDepartment() {
System.out.print("당신의 부서를 입력하시오. >> ");
department = scanner.next();
temporary.setDepartment(department);
return temporary.getDepartment();
}
private void getInfo() { // 예시용으로 정규직 정보만 가져오기
writeRegularName();
writeRegularAge();
writeRegularAddress();
writeRegularDepartment();
}
public void printInfo() { // 정보 출력
getInfo();
System.out.println(regular.toString()+ " " + regular.getName() + "님의 직원 정보는 다음과 같습니다.");
System.out.println();
System.out.println("------------------------------------");
System.out.println("이 름:\t" + regular.getName());
System.out.println("나 이:\t" + regular.getAge());
System.out.println("주 소:\t" + regular.getAddress());
System.out.println("부 서:\t" + regular.getDepartment());
}
}
7-3. Employee(상위 클래스)
public class Employee {
int age; // 나이
int salary; // 급여
String name; // 이름
String address; // 주소
String department; // 부서
public Employee() { }
public Employee(String name, int age, String address, String department) {
this.name = name;
this.age = age;
this.address = address;
this.department = department;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
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 getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
7-4. Regular(하위 클래스 extends Employee)
public class Regular extends Employee {
public Regular() { }
public Regular(String name, int age, int salary, String address, String department) {
super(name, age, salary, address, department);
}
@Override public int getAge() {
return age;
}
@Override public void setAge(int age) {
this.age = age;
}
@Override public int getSalary() {
return salary;
}
@Override public void setSalary(int salary) {
this.salary = salary;
}
@Override public String getName() {
return name;
}
@Override public void setName(String name) {
this.name = name;
}
@Override public String getAddress() {
return address;
}
@Override public void setAddress(String address) {
this.address = address;
}
@Override public String getDepartment() {
return department;
}
@Override public void setDepartment(String department) {
this.department = department;
}
public String toString() {
return "정규직";
}
}
7-5. Temporary(하위 클래스 extends Employee)
public class Temporary extends Employee {
public Temporary() { }
public Temporary(String name, int age, int salary, String address, String department) {
super(name, age, salary, address, department);
}
@Override public int getAge() {
return age;
}
@Override public void setAge(int age) {
this.age = age;
}
@Override public int getSalary() {
return salary;
}
@Override public void setSalary(int salary) {
this.salary = salary;
}
@Override public String getName() {
return name;
}
@Override public void setName(String name) {
this.name = name;
}
@Override public String getAddress() {
return address;
}
@Override public void setAddress(String address) {
this.address = address;
}
@Override public String getDepartment() {
return department;
}
@Override public void setDepartment(String department) {
this.department = department;
}
public String toString() {
return "비정규직";
}
}
8. 다음을 만족하는 클래스 Regular를 작성하시오.
- 클래스 Regular는 위에서 구현된 클래스 Employee의 하위 클래스
- 생성자 : 이름, 나이, 주소, 부서를 지정하는 상위 생성자 호출
- Setter : 월급 정보 필드를 지정
- 메소드 printInfo() : 인자는 없고 “정규직”이라는 정보와 월급을 출력
8-1. HumanAffairsMain(메인 클래스)
public class HumanAffairsMain {
public static void main(String[] args) {
HumanAffairs humanAffairs = new HumanAffairs();
humanAffairs.printInfo(); // 직원 정보 출력
}
}
8-2. HumanAffair(참조 클래스)
import java.util.Scanner;
public class HumanAffairs {
Scanner scanner = new Scanner(System.in);
Employee regular = new Regular();
Employee temporary = new Temporary();
int age; // 나이
int salary; // 급여
String name; // 이름
String address; // 주소
String department; // 부서
// 정규직
private String writeRegularName() {
System.out.print("당신의 이름을 입력하시오. >> ");
name = scanner.next();
regular.setName(name);
return regular.getName();
}
private int writeRegularAge() {
System.out.print("당신의 나이를 입력하시오. >> ");
age = scanner.nextInt();
regular.setAge(age);
return regular.getAge();
}
private String writeRegularAddress() {
System.out.print("당신의 주소를 입력하시오. >> ");
address = scanner.next();
regular.setAddress(address);
return regular.getAddress();
}
private String writeRegularDepartment() {
System.out.print("당신의 부서를 입력하시오. >> ");
department = scanner.next();
regular.setDepartment(department);
return regular.getDepartment();
}
private int writeRegularSalary() {
System.out.print("당신의 급여를 입력하시오. >> ");
salary = scanner.nextInt();
regular.setSalary(salary);
return regular.getSalary();
}
private void getInfo() { // 정보 가져오기
writeRegularName();
writeRegularAge();
writeRegularAddress();
writeRegularDepartment();
writeRegularSalary();
}
public void printInfo() { // 정보 출력
getInfo();
System.out.println(regular.toString()+ " " + regular.getName() + "님의 직원 정보는 다음과 같습니다.");
System.out.println();
System.out.println("------------------------------------");
System.out.println("이 름:\t" + regular.getName());
System.out.println("나 이:\t" + regular.getAge());
System.out.println("주 소:\t" + regular.getAddress());
System.out.println("부 서:\t" + regular.getDepartment());
System.out.println("급 여:\t" + regular.getSalary());
}
}
8-3. Employee(상위 클래스)
public class Employee {
int age; // 나이
int salary; // 급여
String name; // 이름
String address; // 주소
String department; // 부서
public Employee() { }
public Employee(String name, int age, String address, String department) {
this.name = name;
this.age = age;
this.address = address;
this.department = department;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
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 getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
8-4. Regular(하위 클래스 extends Employee)
public class Regular extends Employee {
public Regular() { }
public Regular(String name, int age, int salary, String address, String department) {
super(name, age, salary, address, department);
}
@Override public int getAge() {
return age;
}
@Override public void setAge(int age) {
this.age = age;
}
@Override public int getSalary() {
return salary;
}
@Override public void setSalary(int salary) {
this.salary = salary;
}
@Override public String getName() {
return name;
}
@Override public void setName(String name) {
this.name = name;
}
@Override public String getAddress() {
return address;
}
@Override public void setAddress(String address) {
this.address = address;
}
@Override public String getDepartment() {
return department;
}
@Override public void setDepartment(String department) {
this.department = department;
}
public String toString() {
return "정규직";
}
}
'WebDev > 본과정' 카테고리의 다른 글
인터페이스 심화 및 예외처리 (0) | 2021.05.12 |
---|---|
객체 비교와 인터페이스 (0) | 2021.05.12 |
정렬 심화와 상속 (0) | 2021.05.12 |
배열의 탐색 및 정렬 (0) | 2021.05.12 |
String 클래스의 메소드 및 배열 기초 (0) | 2021.05.12 |
최근댓글