(-는 -이다.) : 상속관계
노트북은 컴퓨터이다. (o)
전기 자동차는 자동차이다. (o)
ColorTV 는 TV이다. (o)
(-는 -를 가지고있다.) : 포함관계 (상속불가)
class Computer{
Cpu cpu;
Mainboard mainboard;
Memory memory;
...
}
상속 관계에서 서로 관련된 많은 클래스들이 있을 때 '다형성'이라고 말한다.
is-a 의 상속 관계라면 그 객체는 다형성이다.
polymorphism(다형성)의 활용 방법: 가상 메소드 호출(virtual method invocation)
부모 = 자식 (wihtout 형변환)
아래가 되지 않는 이유에 대하여 메모리 그림으로 설명하시오.
SmartPhone ph2 = new MobilePhone();
다음을 만족하는 클래스 Employee를 작성하시오
- 클래스 Employee(직원)은 클래스 Regular(정규직)와 Temporary(비정규직)의 상위 클래스 - 필드: 이름, 나이, 주소, 부서, 월급 정보를 필드로 선언 - 생성자 : 이름, 나이, 주소, 부서를 지정하는 생성자 정의 - 메소드 printInfo() : 인자는 없고 자신의 필드 이름, 나이, 주소, 부서를 출력 - 클래스 Regular는 위에서 구현된 클래스 Employee의 하위 클래스 - 생성자 : 이름, 나이, 주소, 부서를 지정하는 상위 생성자 호출 - Setter : 월급 정보 필드를 지정 - 메소드 printInfo() : 인자는 없고 "정규직"이라는 정보와 월급을 출력
class EmployeeSet {
private String name;
private int age;
private String addr;
private String dept;
int kyu;
public EmployeeSet(String name, int age, String addr, String dept) {
this.name = name;
this.age = age;
this.addr = addr;
this.dept = dept;
}
protected void printInfo() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("주소 : " + addr);
System.out.println("부서 : " + dept);
}
}
class Regular extends EmployeeSet {
public Regular(String name, int age, String addr, String dept) {
super(name, age, addr, dept);
}
public void setKyu(int kyu) {
super.kyu = kyu;
}
public void printInfo() {
System.out.println("[정규직]");
super.printInfo();
System.out.println("월급 : " + super.kyu);
}
}
class Temporary extends EmployeeSet {
int workHour;
int jiKyu;
public Temporary(String name, int age, String addr, String dept) {
super(name, age, addr, dept);
jiKyu = 10000;
}
public void setWorkHours(int workHour) {
this.workHour = workHour;
}
public void printInfo() {
System.out.println("[계약직]");
super.printInfo();
System.out.println("급여 : " + (this.workHour * jiKyu));
}
}
class Employee {
public static void main(String[] args) {
Regular bahk = new Regular("박온리", 26, "서울시 양천구", "IT3부");
bahk.setKyu(10000);
bahk.printInfo();
Temporary hwang = new Temporary("황지훈", 30, "인천시 연수구", "영업부");
hwang.setWorkHours(120);
hwang.printInfo();
}
}
갬블링 게임을 만들어 보자.(Main 안에서 모든 로직을 처리하지 말고, class로 만들어서 활용해 보도록 합시다.)
두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력 받으며 각 사람은 Person 클래스로 작성하라. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다. 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.
import java.util.Scanner;
class Person {
private String name;
public String getName() {
return name;
}
private int[] arrNum;
public Person(String name) {
this.name = name;
}
public boolean game() {
arrNum = new int[3];
for(int i=0; i<arrNum.length; i++) {
arrNum[i] = (int)(Math.random()*3+1);
}
System.out.print(arrNum[0]+" "+arrNum[1]+" "+arrNum[2]+" ");
if((arrNum[0] == arrNum[1]) && (arrNum[1] == arrNum[2])) {
return true;
}else
return false;
}
}
class Gamble {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("참여 선수 숫자>>");
int num = sc.nextInt();
Person[] perArr = new Person[num];
for (int i = 0; i < num; i++) {
System.out.println((i+1) + "번째 선수 이름>>");
String name = sc.next();
perArr[i] = new Person(name);
}
String buffer = sc.nextLine();
while(true) {
for(int i = 0; i < num; i++) {
System.out.println("[" + perArr[i].getName() + "] : <Enter>");
buffer = sc.nextLine();//enter받아내는 거
if (perArr[i].game()) {
System.out.println("[" + perArr[i].getName() + "]님이 이겼습니다");
return;
}
System.out.println("아쉽군요");
}
}
}
}