* 추상화(모든 자식class들이 동일하게 하는 것들을 모아서 부모class에 추상화 시켜 놓는 것)
- 추상메소드 :  자식클래스들이 부모클래스의 메소드를 오버라이딩 해서 사용하게 하려고 만듬.
Animal
------
eat()     <- 추상메소드


Dog       Cat        Lion
----      ----       -----
eat()     eat()      eat()

* abstact - instance 메소드, class에 사용되는 제한자
          - 의미 :  추상적이다->구현이 안되었다.
- 메소드 :  메소드 구현없이 선언만한 메소드
예) public abstact void go(); ->{}붙으면 안됨.
->하위 class에서의 overriding 을 강제한다.
->하위class들이 구현할 메소드의 template(틀)역할.


- class -> 객체생성을 못하는 class
예 ) public abstact class Animal{구현}

-abstract 메소드를 가지는 class는 반드시 abstract class가 되야한다.
-부모 class에 정의된 abstract메소드를 overriding 안하면 abstract class가 되야한다.
-abstract class는 구현된 일반메소드도 가질수 있따.

- > 역할 :  자식 class의 template, 자식 객체에 대한 type 역할 - 다형성

 

* abstract class - 일반class
                   field
                   생성자
                   메소드
                   추상메소드
                  

*
project : day18
package : abstr.test
class : AbstractTest

package abstr.test;

abstract class Super{
 int num;

 public Super() {}

 public Super(int num) {
  this.num = num;
 }
 public abstract void methodA();
 public void templateMethod(){
  System.out.println("하위클래스의 구현이 모두 같은 메소드 : "+num);
 }
}
class Sub extends Super{
 public Sub(){}
 public Sub(int num){
  super(num);
 }
 
 public void methodA(){
  System.out.println("Sub.methodA()");
 }
}
public class AbstractTest {
 public static void main(String[] args) {
  //Super s = new Super(); //추상클래스는 객체 생성을 할 수 없다.
  Sub sub = new Sub();
  sub.methodA();
  Sub sub2 = new Sub(100);
  sub2.templateMethod();
 }
}

---------------------------------

project : day18
package : abstr.animal
class : PolymorphicArgsTest


package abstr.animal;

public class PolymorphicArgsTest {
 public void raise(Animal an){
  an.eat();
  an.sleep();
  
 }
 public static void main(String[] args) {
  Dog d = new Dog();
  Lion l = new Lion();
  
  d.eat();
  d.sleep();
  
  System.out.println("------------------------");
  
  PolymorphicArgsTest pt = new PolymorphicArgsTest();
  pt.raise(d);
  pt.raise(l);
 }
}


------


package abstr.animal;

//하위클래스들의 type, 하위클래스들의 틀(Template) -> 추상클래스
public abstract class Animal {
 public abstract void eat();
 public abstract void sleep();

}

---------

package abstr.animal;

public class Lion extends Animal{

 @Override
 public void eat() {
  System.out.println("사자가 먹는다.");
 }

 @Override
 public void sleep() {
   System.out.println("사자가 잔다.");
 }
 
}


------

package abstr.animal;

public class Dog extends Animal{

 @Override
 public void eat() {
  System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("개집에서 잔다.");
 }

 
}

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

컬렉션(collection)  (0) 2012.07.28
인터페이스(interface)  (0) 2012.07.28
다형성 - 실습  (0) 2012.07.28
다형성(polymorephism)  (0) 2012.07.28
의존관계(dependency)  (0) 2012.07.28
Posted by 조은성
,

다형성 연습

UML - word

package : wordprocessorTest
class : WordUser

package : wordprocessor.word
class : Word

package : wordprocessor.format
class : Format
 AstaFormat
 EqulFormat
 SharpFormat


------


package wordprocessorTest;


import wordprocessor.format.AstaFormat;
import wordprocessor.format.Format;
import wordprocessor.format.SharpFormat;
import wordprocessor.word.Word;

public class WordUser {
 public static void main(String[] args) {
  Word word = new Word();
  Format f = new Format();
  AstaFormat af = new AstaFormat();
  SharpFormat sf = new SharpFormat();
  word.print("출력할 내용 :  Hello",f);
  word.print("출력할 내용 :  Hello",af);
  word.print("출력할 내용 :  Hello",sf);
 }
}


----------

package wordprocessor.word;

import wordprocessor.format.Format;
public class Word {
 public void print(String message, Format format){
  System.out.println(format.getFormat(message));
 }
}


----------

package wordprocessor.format;

public class Format {
 public String getFormat(String message){
  String str;
  str = "---------------------\n"+message+"\n---------------------";
  return str;
 }
}


----------

package wordprocessor.format;


public class AstaFormat extends Format{

 @Override
 public String getFormat(String message) {
  // TODO Auto-generated method stub
  return super.getFormat(message).replace('-','*');
 }
 
}


------------

package wordprocessor.format;

public class EqulFormat extends Format{

 @Override
 public String getFormat(String message) {
  // TODO Auto-generated method stub
  return super.getFormat(message).replace('-', '=');
 }
 

}


-------------

package wordprocessor.format;

public class SharpFormat extends Format{

 @Override
 public String getFormat(String message) {
  // TODO Auto-generated method stub
  return super.getFormat(message).replace('-', '#');
 }
 
}


-----------------------------------------------------------------------------------

=====================================================================================================
       


* 2012-3-16

* 다형성 - 부모tyoe  변수 - 자식객체 (compile시점에 되는 경우는 상속인 경우 부모가 자식보다 더 큰 tyoe이면 다형성이 된다) , 실행시점에서는 부모의 객체와 자식의 객체가 둘다 생성되서 접근가능.
         -> 부모에 정의된 메소드만 호출가능.

- Super s = new Super();
   s.a();(o)자식에 있는 a()를 호출
 s.b();(x)자식에는 b()가 있지만 부모에 없어서 컴파일 시점에서 에러가 난다. 
        

Super              Sub
----- <-------     ------
a()                a()
                   b()

- 배열 Heterogeneous -> reference type의 배열.


* Super = new Super()           c : o
  Sub1 sub = (Sub1)s;           R : x


* Sub1 sub1 = new Sub1();           C : X   (컴파일시점)
  Sub2 sub2 = (Sub2)sub1;           R : X   (실행시점)

* Super s = new Super();            C : O
  Sub1 s1 = (Sub1)s;                R : O

 

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

인터페이스(interface)  (0) 2012.07.28
추상화(abstract)  (0) 2012.07.28
다형성(polymorephism)  (0) 2012.07.28
의존관계(dependency)  (0) 2012.07.28
final변수  (0) 2012.07.28
Posted by 조은성
,

* 다형성(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 조은성
,