[Ava]OOP多形性(集約)*,参照変数の形変換


多形性を理解して復習しなければなりません!

多形性(Polymorphics)*

  • は、複数のタイプのオブジェクトを参照できる参照変数です.
  • =親タイプの参照変数、サブタイプのオブジェクトを処理する
  • class Tv { //부모 
    	boolean power; 
        int channel
        
        void power() { power = !power; }
        void channelUp() { ++channel; }
        void channelDown() { --channel; }
    }
    
    class SmartTv extends Tv { // 자식
    	String text;
        void caption() { }
    }
    
    
    //참조변수 타입과 인스턴스의 타입 일치 
    Tv t = new Tv();
    SmartTv s = new SmartTv(); //-> 7개의 멤버를 모두 쓸 수 있다
    
    //다형성은 타입이 일치해야하지만 불일치해도 ok - 조상타입 참조변수로 자손타입 객체를 다루는 것 
    Tv t = new SmartTv(); //-> 스마트티비를 티비 참조변수로 다루면 부모에 있는 5개 멤버만 참조변수로 사용 가능 
  • 祖先タイプの参照変数は、子孫タイプのインスタンスを参照することができ、逆に、子孫タイプの参照変数は、祖先タイプのインスタンス
  • を参照することができない.
    Tv t = new SmartTv(); //-> 가능
    
    SmartTv s = new Tv(); //-> 에러, 불가능
    メソッド出力結果-同じ配列に配置しても、結果はインスタンスごとに異なり、継承してもインスタンスタイプによって異なります.
    *これが多形性です

    参照変数の変形


    参照変数を変更して使用可能なメンバーの数を制御します.

    1)継承関係のあるタイプからタイプへの変換のみ


    2)子孫タイプ、祖先タイプを変形する場合


    サブタイプ->親タイプ:成形遷移は省略可能
    子孫タイプ<-祖先タイプ(Down-casting):変換を省略できません
    class Car { //부모 클래스 
    	String color;
        int door;
        
        void drive() { 
        	System.out.println("drive");
        }
        
        void stop() { 
        	System.out.println("stop!");
        }
    }
    
    class FireEngine extends Car { //Car를 부모로 하는 자식 클래스
    	void water() {
        	System.out.println("water!");
        }    
    }
    FireEngine f = new FireEngine(); 
    
    Car c = (Car)f; //조상인 Car타입으로 형변환 가능 (생략가능)
    FireEngine f2 = (FireEngine)c; //자손인 FireEngine타입으로 형변환 가능 (생략불가)
    Ambulance a = (Ambulance)f; //-> 에러 : 상속관계가 아닌 클래스간 형변환 불가 

    演算子の例


    参照変数の変形前に変形可能かどうかを決定するために使用します
  • 参照変数によって参照されるインスタンスの実際のタイプを確認します.
  • instanceofの演算結果がtrueの場合、タイプを->に変換できます.変換前にインスタンスofで
  • を決定する必要があります.
    void doWork(Car c) {
    	if(c instanceof FireEngine) { //1. 형변환이 가능한지 확인 -> true가 나오면 가능 
        	FireEngine fe = (FireEngine)c; //2. 형변환
            fe.water();
        }
        ...
        FireEngine fe = new FireEngine(); 
        System.out.println(fe instanceof Object); //true
        System.out.println(fe instanceof Car); //true
        System.out.println(fe instanceof FireEngine); //true
    }

    パラメータ多形性

  • 参照型パラメータは、メソッド呼び出し時に、自分と同じタイプ/サブタイプのインスタンスを渡すことができる.
  • 多機能:
    1)マルチパラメータ
    2)複数のオブジェクトを1つの配列で処理する
    class Product { //부모 
    	int price;
        int bonusPoint;
    }
    
    //자손 
    class Tv extends Product {}
    class Computer extends Product {}
    class Audio extends Product {}
    
    class Buyer {
    	int money = 1000;
        int bonusPoint = 0;
    }
    
    
    //오버로딩 - 메소드 이름이 같고 매개변수 타입만 다름 
    void buy(Computer c) {
    	money -= c.price;
        bonusPoint +=c.bonus;
    }
    void buy(Audio a) {
    	money -= a.price;
        bonusPoint +=a.bonus
    }
    
    //메소드를 여러개 써줄 필요 없이 이 메소드 하나로 적용해줄 수 있다 - 이러지 않으면 물견 별 항목에 하나하나 메소드 추가해줘야함 
    void buy(Product p) {
    	money -= p.price;
        bonusPoint += p.bonusPoint;
    }