Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

coyojo10의 개발블로그!

[자바] 다형성 정리! 본문

백엔드

[자바] 다형성 정리!

coyojo 2022. 11. 14. 09:42


다형성이란 ? 

=> 조상 타입 참조 변수로 자손 타입 객체를 다루는 것 

 예를 들면

1) class TV (부모 : 멤버변수 5개)

 

2) class SmartTV(자식 : 멤버변수 총 7개 (조상+2개) 객체일때 


    TV t = new SmartTV();   // 이렇게 객체를 생성

 

 

  부모 클래스 참조 변수 t로 자손 클래스인 SmartTV 객체를 다루는 것을 다형성이라 한다!


       원래는 TV t = new TV(); 이렇게 타입을 일치시켜야 하는데 타입이 불일치해도 접근할 수 있는 것이 다형성!!     
       
       but , 자손 타입의 참조변수로  조상  타입의 객체를 가리킬 수 없다.

 

         (ex smartTV리모컨에는 기능은 7개 있는데 tv에는 5개 기능뿐 smartTV에 있는 기능이 없으므로

          없는 기능을 호출해서 에러 발생)

 


      반대로 조상타입의 참조변수는 자손 타입의 객체를 가리킬 수 있다.

 

     (ex 조상 타입의 tv리모컨에는 5개 기능이 있고, smartTV에는 5개 포함하고 플러스로 2개 더 있는 것이므로

있는 기능을 안쓰는 것은 ok!  즉 있는 기능을 안쓰는 건 OK!) 
      

 

      즉 쓸수있는 기능보다 객체에 있는 기능이 더 적으면 에러발생!!!  없는 기능을 호출할 수 있는 가능성이 있으므로 

     반대로 실제로 쓸수있는 기능보다 객체에 더 많이 존재하는 것은 괜찮다!!
     
     
     
  <<  참조변수의 형변환  >>
  

   ==> 사용할 수 있는 멤버의 갯수를 조절하는 것 ! 


  ==> 조상, 자손 관계의 참조변수는 서로 형변환 가능!! (형제 관계는 NO!)
  
  ex) 
  class Phone{}
  class Galaxy extends Phone{ } // Galaxy는 Phone를 상속받는 자손 class
  class Iphone extends Phone { } // Iphone는 Phone를 상속받는 자손 class
  
  
  class Phone  {   // 멤버변수 4개
       String color;
       int price;
        void call( )  {
                 System.out.println("전화걸기~");
            }
      void message(  ) {
          System.out.println("메세지전송~");
          }


      }  //phone 클래스 블럭 끝 ! 

 


  
  Class Galaxy extends Phone {  // 멤버변수 5개 ( 조상4개 + 자손 본인것 1개)
   void music(){
   System.out.println("음악재생")
   } 
   
  ================================================
  public static void main (String[]args){
  
   Galaxy g = new Galaxy(); 
  
   Phone p = (Phone) g // 자손인 g 객체를 조상인 p에 대입하는데 조상인 Phone타입으로 형변환!!(생략가능) // 그러면 조상인 phone의 기능만 사용가능! 
  
   Galaxy g2 = (Galaxy)p; // 조상인 p객체를 자손이 Galaxy 타입으로 형변환(생략불가) ==> 자손으로 형변환 했으므로 자손의 기능을 쓸 수 있다!! 
  
   Apple a = (Apple) b ;  // 에러!! 상속관계가 아닌 클래스 간의 형변환 불가!!!
  
  
  } 
  

 

 

 

 

 

 

***************[[ 예제!!!! ]] ****************************
 

 

public static void main(String args[]) {

 Phone phone = null;
 Galaxy g = new Galaxy();
 Galaxy g2 = null;

 g.music();    //  실행 가능!! 
 phone = g;  // 조상인 phone객체에 자손인 g 객체를 대입! 형변환 생략됨!! 
 phone.music(); ?   // 에러발생!! why? 리모컨 역할인 참조변수가 조상꺼여서 조상 기능만 쓸 수 있으므로 phone클래스에는 music 메소드를 쓸 수 없다!! 

  g2 = (Galaxy)phone;  // 조상인 phone객체를 Galaxy로 형변환해서 g2객체에 대입
  g2.music();    // 실행가능!!! 리모컨이 자손이므로 자손에 있는 music 메소드 사용가능!! 
   

}  // 메인블럭 끝!
  
  
  
 **************************예제2*************************************

 

  public class polymorphism {

public static void main(String[] args) {

Phone phone = null;
          //phone객체에 null로 초기화
Galaxy g = new Galaxy();
           // galaxy 객체를 생성
Galaxy g2 = null;  
           // null으로 초기화한 galaxy 객체 g2를 생성 

g.music();    //  실행 가능!! 
phone = g;  // null로 초기화 했던 조상인 phone객체에 자손인 g 객체를 대입! 형변환 생략됨!! 
//phone.music();   
         //==> 에러발생!! why? 리모컨 역할을 하는 참조변수가 조상꺼여서 조상 기능만 쓸 수 있으므로 phone클래스에는 music 메소드를 쓸 수 없다!!컴파일부터 불가!!  

g2 = (Galaxy)phone;  
         //null값이였던 g2에 조상인 phone객객체를 Galaxy로 형변환해서 g2객체에 대입
g2.music();





System.out.println("****************************");

Phone p2 = new Phone(); 
        // 참조변수 p2인 phone객체 생성 
        
Galaxy g3 = (Galaxy)p2;
        // 형변환 실행 에러! /Exception in thread "main" java.lang.ClassCastException:
// g3는 초기화를 null로 해주지 않아서 galaxy 객체를 참조하고 있는데 p2를 대입하니 실행 에러 발생!! 
// (Galaxy)로 형변환을 하고 있어서 컴파일은 오류로 인식하지 않으나 실제 참조하는 instance가 p2 이므로 실행시 에러가 발생하는 것 

        g3.music(); 
        // 컴파일은 ok! (컴파일러는 형변환만 써주면 속는다!) 그러나 실제 참조하는 객체가 부모인 phone 객체 p2이므로 music메소드를 실행할 수 없다!!  

}