📌 다형성이란(polymorphism)?
부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리.
다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알수 없어도 ⭐오버라이딩⭐을 통해 자식 클래스를 접근할 수 있다.
📌어떻게 부모가 자식이 어떤 일을 하는 지 몰라도, 자식 멤버 함수를 호출시킬 수 있을까?
동적 바인딩 때문이다.
class A{..}
class B extends A {...}
class C extends A {...}
class D extends A {...}
public class Phone {
public static void main(String[] args) {
A a = new A(); //당연히 됨
B b = new B(); //당연히 됨
A ab = new B(); //부모 = 자식 B객체 생성
A ac = new C(); //부모 = 자식 C객체 생성
A ad = new D(); //부모 = 자식 D객체 생성
/*
위의 세 가지 경우는 모두 컴파일이 된다.
왜 에러 안남? 부모, 자식의 메모리가 다 올라가있어서 부모가 참조하려고 할 때 가능하다.
new 객체 생성시 B, C, D는 모두 A를 상속받아서 A의 정보를 가지기 때문에
메모리에 A → B, A → C, A → D 순으로 모든 정보가 올라간다.
ab, ac, ad는 각각 A타입으로, 참조하려는 A의 정보가 메모리에 모두 있기 때문에 컴파일이 가능하다.
*/
D da = new A(); //자식 = 부모, 에러남
//왜 에러? 부모 만 메모리에 올라가고 자기것을 메모리에 올리지 않아서 당연히 안됨
}
}
SmartPhone ph2 = new MobilePhone();
- 클래스 Employee(직원)은 클래스 Regular(정규직)와 Temporary(비정규직)의 상위 클래스
- 필드: 이름, 나이, 주소, 부서, 월급 정보를 필드로 선언
- 생성자 : 이름, 나이, 주소, 부서를 지정하는 생성자 정의
- 메소드 printInfo() : 인자는 없고 자신의 필드 이름, 나이, 주소, 부서를 출력
class Employee {
String name, addr, dept, money;
int age;
public Employee(String name, int age, String addr, String dept) {
this.name = name;
this.age = age;
this.addr = addr;
this.dept = dept;
}
public void printInfo() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("주소 : " + addr);
System.out.println("부서 : " + dept);
}
}
public class ggigigigi {
public static void main(String[] args) {
Employee employee = new Employee("권혁우", 34, "서울 강북구", "개발 1팀");
employee.printInfo();
}
}
Series_02 (필수)
클래스 Regular는 위에서 구현된 클래스 Employee의 하위 클래스
생성자 : 이름, 나이, 주소, 부서를 지정하는 상위 생성자 호출
Setter : 월급 정보 필드를 지정
메소드 printInfo() : 인자는 없고 "정규직"이라는 정보와 월급을 출력
class Employee {
String name, addr, dept, money;
int age;
public Employee(String name, int age, String addr, String dept) {
this.name = name;
this.age = age;
this.addr = addr;
this.dept = dept;
}
public void printInfo() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("주소 : " + addr);
System.out.println("부서 : " + dept);
}
}
class Regular extends Employee {
public Regular(String name, int age, String addr, String dept) {
super(name, age, addr, dept);
}
public void setMoney(String money) {
super.money = money;
}
public void printInfo() {
System.out.println();
super.printInfo();
System.out.println("나는 정규직");
System.out.println("월급 : " + super.money );
}
}
public class ggigigigi {
public static void main(String[] args) {
Employee employee = new Employee("권혁우", 34, "서울 강북구", "개발 1팀");
employee.printInfo();
Regular regular = new Regular("박재범", 35, "서울 강남구", "인사팀");
regular.setMoney("500만원");
regular.printInfo();
}
}
=================================================================================================
👉 결과
이름 : 권혁우
나이 : 34
주소 : 서울 강북구
부서 : 개발 1팀
이름 : 박재범
나이 : 35
주소 : 서울 강남구
부서 : 인사팀
나는 정규직
월급 : 500만원
(Main 안에서 모든 로직을 처리하지 말고, class로 만들어서 활용해 보도록 합시다.)
두 사람이 게임을 진행한다.
이들의 이름을 키보드로 입력 받으며 각 사람은 Person 클래스로 작성하라.
그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다.
두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자기 차례에서 <Enter> 키를 입력하면,
3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다.
난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.
======================
1번째 선수 이름>>수희
2번째 선수 이름>>연수
[수희]:
3 1 1 아쉽군요!
[연수]:
3 1 3 아쉽군요!
[수희]:
2 2 1 아쉽군요!
[연수]:
1 1 2 아쉽군요!
[수희]:
3 3 3 수희님이 이겼습니다
import java.util.*;
class Person {
String name;
int[] rarr = new int[3];
public Person(String name) {
this.name = name;
}
public boolean Game() {
boolean state = true;
for (int i = 0; i < rarr.length; i++) {
rarr[i] = (int) (Math.random() * 3) + 1;
System.out.print(rarr[i] + " ");
}
for (int i = 0; i < rarr.length; i++) {
if (rarr[0] != rarr[i]) {
state = false;
break;
}
}
return state;
}
}
public class gamblering {
public static void main(String[] args) {
String name, buffer;
Scanner sc = new Scanner(System.in);
System.out.print("1번째 선수 이름>> ");
name = sc.next();
Person p1 = new Person(name);
System.out.print("2번째 선수 이름>> ");
name = sc.next();
Person p2 = new Person(name);
while (true) {
System.out.println(p1.name + "님 <Enter>를 눌러주세요");
buffer = sc.nextLine();
if (p1.Game()) {
System.out.println(p1.name + "님이 이겼습니다!");
break;
}
System.out.println(">> 아쉽군요!\n");
System.out.print(p2.name + "님 <Enter>를 눌러주세요");
buffer = sc.nextLine();
if (p2.Game()) {
System.out.println(p2.name + "님이 이겼습니다!");
break;
}
System.out.println(">> 아쉽군요!\n");
}
sc.close();
}
}