'다형성(polymorephism)'에 해당되는 글 1건

  1. 2012.07.28 다형성(polymorephism)

* 다형성(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("호랑이가 사냥해서 먹는다.");
 }

 
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

추상화(abstract)  (0) 2012.07.28
다형성 - 실습  (0) 2012.07.28
의존관계(dependency)  (0) 2012.07.28
final변수  (0) 2012.07.28
this, super키워드  (0) 2012.07.28
Posted by 조은성
,