* 다형성(polymorephism) - 부모type의 변수에 자식type의 객체를 대입
int i = 10;
long l = 10; <-작은 type을 큰 타입으로 바꿔주므로 된다. long l = 10L;
byte b = 20;
short s = 5
int i = 30;
long l = b;(o)
long l = s;(o)
long l = i;(o)
- 상속관계일 때는 저렇게 a를 생성하는게 가능하다.
Animal- Dog
- Cat
- Human
Animal a = new Animal();(O)
a = new Cat();
a = new Dog();
* 컴파일 시점에는 소스코드로 가서 본다 .
Animal
------
eat() <------
|
^ |
| |
Dog Cat
---- ----
eat() eat()
cry() cry()
Animal c = new Cat(); ok
c.eat(); ok //Animal class에 eat()가 있어서 되지만
c.cry(); no //Animal class에 cry()를 찾는데 없어서 컴파일 시점에 실행되지 않는다.
이렇게 바꾸면 된다.
Animal a = new Cat();
Cat c = (Cat)a;
c.cry();
* class 변수 = new 생성자()
변수, 메소드()
compile ->type
실행 -> 객체(값)
Animal a = new Cat();
a.eat();
eat() - compie시점 : Animal
실행시점 : Cat
다형성 : 부모에 선언된 메소드만 호출가능.
자식에 선언된 메소드 사용하려면 형변환 필요.
Animal a = new Cat();
a.eat() - c : Animal
- R : Cat
a.cry() - C : Animal - compile 에러
따라서
Cat c - (Cat) a ;
c.cry() - C : Cat
R : Cat
* 다형성은 거의 배열에 정의한다. (다형성의 개념은 중요하지만 우리가 직접 사용하지는 않는다. 쓸것은 이미 class에 다 정의 되어 있다. )
--------------------------------------
project : day17
package : polymorphism.dto
class : Animal, Dog, Cat
project : day17
package : polymorphism.test
class : PolymorphismTest
package polymorphism.test;
import polymorphism.dto.Animal;
import polymorphism.dto.Cat;
import polymorphism.dto.Dog;
public class PolymorphismTest {
public static void main(String[] args) {
//다형성을 이용해 객체 생성
//부모 타입 변수 = 자식 타입 객체
Animal an1 = new Dog();
Animal an2 = new Cat();
//모든 클래스의 최상위 -> Object
Object obj1 = new Animal();
Object obj2 = new Cat();
Object obj3 = new Dog();
//이런것도 Polymorphism(다형성)이다.
Cat c = new Cat();
Animal an3 = c;
an1.eat();
an1.sleep();
an2.eat();
an2.sleep();
//부모타입변수, 자식의 메소드() an2.cry();가 Animal type이라 Animal 가도 없으니 Cat type으로 형변환 시켜줘야한다.
//an2.cry();
//((Cat) an2).cry();
Cat c2 = (Cat)an2;
c2.cry();
}
}
------------------------
package polymorphism.dto;
public class Animal {
public void eat(){
System.out.println("동물이 먹는다. ");
}
public void sleep(){
System.out.println("동물이 잔다.");
}
}
-----------------------------
package polymorphism.dto;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("고양이가 고양이 밥을 먹는다.");
}
@Override
public void sleep() {
System.out.println("고양이가 잔다.");
}
public void cry(){
System.out.println("고양이가 운다..야옹.....");
}
}
-----------------------------
package polymorphism.dto;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
}
@Override
public void sleep() {
System.out.println("개집에서 잔다.");
}
}
-----------------------------
* Heterogemeous Collection - 다른 type의 Data를 모으는 배열(객체)!
- 배열에 다형성이 적용된 것.
////////////
//객체데이터 모음을 관리 할 수 있다.
for( Animal a : anArr){
a.eat();
}
/////////////////
long[] l = new long[5];
l[0]=10;
l[1]=20L;
//이렇게 보면 int도 들어가고 long도 들어간다.
Animal[] anArr = new Animal[5];
anArr : Animal[]
anArr[0] : Animal
anArr[0] = new Animal();
anArr[1] = new Dog();
anArr[2] = new Cat();
* 부모 type의 배열에 자식 type 객체들을 할당(대입)
* 자바에서 존재하는 type은 1. 프리미티브 2. 레퍼런스 두개가 있다.
project : day17
package : polymorphism.test
class : HeterogemeousTest
package polymorphism.test;
import polymorphism.dto.Animal;
import polymorphism.dto.Cat;
import polymorphism.dto.Dog;
public class HeterogemeousTest {
public static void main(String[] args) {
//배열에 다형성을 적용 - 부모 type배열에 자식 타입의 객체를 넣는것.
Animal[] an1 = new Animal[3];
Animal[] an2 = new Cat[4];
an1[0] = new Animal();
an1[1] = new Cat();
an1[2] = new Dog();
Animal[] an3 = {new Animal(), new Dog(), new Cat()};
for( int i = 0; i< an1.length;i++){
an1[i].eat();
}
System.out.println("============향상된 for문==============");
//for(변수선언 : 배열)
for(Animal an : an3){
if(an instanceof Cat){
Cat c = (Cat)an;
c.cry();
}
an.sleep();
}
boolean b = an3[0] instanceof Cat;
String str ="abc";
//b = str instanceof Dog; //둘이 상속이 아니라서 에러가 난다. instanceof는 상속관계에서 사용한다. if문에서 주로 객체비교 시사용
}
}
*instanceof
비교할 객체 instanceof Type : boolean
a instanceof B -> a가 참조하는 객체가 B type 인지 검사해서 맞으면 true return
boolean "abc" instanceof A; //에러난다. a와 B의 type이 상속관계에 있어야 한다.(서로 완전히 다른 객체면 비교할 필요가 없기 때문이다.)
- a의 type이 B의 상쉬 type일 때만 비교할 수 있다.
* class 는 Datatype로 사용하지만
class 가 Datatype은 아니다.
Animal an = new Animal(); //an에는 Animal, Dog, Cat 다 들어갈 수 있다.
* Polymorphic Argument -> 매개변수에 다형성이 적용된 것이다.
Animal - Cat
<- Dog
- Snake
void go( Cat c){
c.eat();
}
void go(Dog d){
d.eat();
}
void go(Snake s){
s.eat();
}
------------
위에 go()메소드를
void go(Animal a){
a.eat();
}
을로 바꿔주면 세개의 메소드를 한개만 만들면 된다. 대신 호출 시 go(d)나 go(c)나 go(s)로 해야한다.
----------------------------------------------
project : day17
package : polymorphism.test
class : Zookeeper(사육사), PolymeorphicArgsTest
project : day17
package : polymorphism.dto
class : Lion
package polymorphism.test;
import polymorphism.dto.Cat;
import polymorphism.dto.Dog;
import polymorphism.dto.Lion;
public class PolymeorphicArgsTest {
public static void main(String[] args) {
//사육사 객체를 생성
ZooKeeper zk = new ZooKeeper();
Dog d = new Dog();
Cat c = new Cat();
Lion l = new Lion();
zk.raise(d);
zk.raise(c);
zk.raise(l);
}
}
--------------------------
package polymorphism.test;
import polymorphism.dto.Animal;
public class ZooKeeper {
/*
* 우리 청소
* 밥 먹이기
* 잠 재우기
*/
public void raise(Animal a){
System.out.println("--------------------");
System.out.println("우리를 청소한다.");
a.eat();
a.sleep();
}
}
-------------------------
package polymorphism.dto;
public class Lion extends Animal{
@Override
public void eat() {
System.out.println("사자가 먹는다.");
}
@Override
public void sleep() {
System.out.println("사자가 잔다.");
}
}
--------------------------
package polymorphism.dto;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
}
@Override
public void sleep() {
System.out.println("개집에서 잔다.");
}
}
---------------------------
package polymorphism.dto;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("고양이가 고양이 밥을 먹는다.");
}
@Override
public void sleep() {
System.out.println("고양이가 잔다.");
}
public void cry(){
System.out.println("고양이가 운다..야옹.....");
}
}
-----------------------------------
package polymorphism.dto;
public class Animal {
public void eat(){
System.out.println("동물이 먹는다. ");
}
public void sleep(){
System.out.println("동물이 잔다.");
}
}
-------------------------------------
============================================================================
package polymorphism.test;
import polymorphism.dto.Cat;
import polymorphism.dto.Dog;
import polymorphism.dto.Lion;
import polymorphism.dto.Tiger;
public class PolymeorphicArgsTest {
public static void main(String[] args) {
//사육사 객체를 생성
ZooKeeper zk = new ZooKeeper();
Dog d = new Dog();
Cat c = new Cat();
Lion l = new Lion();
Tiger t = new Tiger();
zk.raise(d);
zk.raise(c);
zk.raise(l);
zk.raise(t);
}
}
-------------------------------
package polymorphism.test;
import polymorphism.dto.Animal;
import polymorphism.dto.Tiger;
public class ZooKeeper {
/*
* 우리 청소
* 밥 먹이기
* 잠 재우기
*/
public void raise(Animal a){
System.out.println("--------------------");
System.out.println("우리를 청소한다.");
if(a instanceof Tiger){
Tiger t = (Tiger)a;
t.hunt();
//((Tiger) a).hunt();
}
else{
a.eat();
}
a.sleep();
}
}
-------------------------------------
package polymorphism.dto;
public class Animal {
public void eat(){
System.out.println("동물이 먹는다. ");
}
public void sleep(){
System.out.println("동물이 잔다.");
}
}
package polymorphism.dto;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("고양이가 고양이 밥을 먹는다.");
}
@Override
public void sleep() {
System.out.println("고양이가 잔다.");
}
public void cry(){
System.out.println("고양이가 운다..야옹.....");
}
}
package polymorphism.dto;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
}
@Override
public void sleep() {
System.out.println("개집에서 잔다.");
}
}
package polymorphism.dto;
public class Lion extends Animal{
@Override
public void eat() {
System.out.println("사자가 먹는다.");
}
@Override
public void sleep() {
System.out.println("사자가 잔다.");
}
}
package polymorphism.dto;
public class Tiger extends Animal{
@Override
public void eat() {
System.out.println("호랑이가 먹는다.");
}
@Override
public void sleep() {
System.out.println("호랑이가 잔다.");
}
public void hunt(){
System.out.println("호랑이가 사냥해서 먹는다.");
}
}