[JAVA]オブジェクトに変換


📝 オブジェクト形式のコピー

  • 基本型変数のように、参照変数のグラフィック変換を行うことができる.
  • セグメントは、相互に関係を継承するクラス間でのみ実行できます.
  • Parent parent = new Child();	
  • の代入演算では、左(親、Parent)、右(子、child)のオブジェクトタイプは次のとおりです.
    異なる場合、2つのタイプは異なる継承関係を持ち、左側のオブジェクトは右側のオブジェクトの親に位置します.
    クラスの場合にのみ暗黙的な変換が発生します.
  • 子クラスは、親タイプとして指定できます.逆も同様です.
    明示的な変換を行います.
  • 📃 暗黙的変換

  • サブクラス親のみ継承機能
  • 機能の変更ではなく、機能の制限に注意する必要があります.
  • すべてのオブジェクトは、その親の形式で暗黙的に変換できます.
  • すなわち,過剰な機能しか使用できず,追加の実装機能は使用できない.

    サイレント変換が可能


    	// 👉 가능하다.
    	A a1 = new B();
    	A a2 = new X();
    	-------------------
    	A a3 = new C();
    	A a4 = new Y();
    	-------------------				
    	B b1 = new C();
    	X x1 = new Y();
    	-------------------
    	C c = new C();
    	B b2 = c;
    	-------------------
    	Y y = new Y();
    	X x2 = y;
    
    	// ❗❗ 불가능하다.
        C c1 = new B();
        C c2 = new X();
    ϥ暗黙変換コード例)
    // 부모 클래스
    public class Unit {
    	private String name;
    	
    	// 생성자 정의
    	public Unit(String name) {
    		super(); 
    		this.name = name;
    	}
    	
    	public String getName() {
    		return name;
    	}
    	
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	// 재정의 대상
    	public void attack() {
    		System.out.println(this.name + " >>> 공격준비 ");
    	}
    }
    // 자식 클래스
    
    // 육군
    public class Army extends Unit {
    
    	// 부모 클래스의 생성자를 강제 호출하기 위한 생성자
    	public Army(String name) {
    		super(name);
    	}
    	
    	// 공격의 형태를 육군에 맞게 변경하지만,
    	// 부모 클래스가 가지고 있는 공격 준비 기능을
    	// super 키워드를 통해 보전
    	@Override
    	public void attack() {
    		super.attack();
    		System.out.println(super.getName() + " >> 지상공격 실행");
    	}
    	
    	public void tank() {
    		System.out.println(super.getName() + " >> 탱크공격");
    	}
    	
    }
    
    // 해군
    public class Navy extends Unit{
    
    	public Navy(String name) {
    		super(name);
    	}
    
    	@Override
    	public void attack() {
    		super.attack();
    		System.out.println(this.getName() + " >> 어뢰발사");
    		System.out.println(this.getName() + " >> 지상 상륙");
    	}
    	
    	public void nucleus() {
    		System.out.println(this.getName() + " >> 핵미사일");
    	}
    }
    
    // 공군
    public class AirForce extends Unit {
    
    	public AirForce(String name) {
    		super(name);
    	}
    
    	@Override
    	public void attack() {
    		super.attack();
    		System.out.println(super.getName() + " >> 이륙");
    		System.out.println(super.getName() + " >> 공중공격 실행");
    	}
    	
    	public void bombing() {
    		System.out.println(this.getName() + " >> 폭격");
    	}
    }
    // Main 클래스
    public class Main01 {
    
    	public static void main(String[] args) {
    		// army, navy, airforce로 각각의 객체생성
    		Army army = new Army("육군");
    		Navy navy = new Navy("해군");
    		AirForce air = new AirForce("공군");
    		
    		// 그 각각의 객체의 고유 기능을 사용
    		army.tank();
    		navy.nucleus();
    		air.bombing();
    		
    		System.out.println("----------------------------------");
    		
    		// 상위 객체 형태로 암묵적 형변환
    		Unit temp1 = army;
    		Unit temp2 = navy;
    		Unit temp3 = air;
    		
    		// 형변환이 되더라도 상속받거나 재정의한(Override)
    		// 자신들의 기본 특성들은 그대로 유지
    		temp1.attack();
    		System.out.println();
    		temp2.attack();
    		System.out.println();
    		temp3.attack();
    		
    		// 상위 클래스 형태로 형변환이 되면, 자신들의 독립 기능은
    		// 사용하지 못한다.
    //		temp1.tank();
    //		temp2.nucleus();
    //		temp3.bombing();
    		
    	}
    
    }
    👉 実行結果
    육군 >> 탱크공격
    해군 >> 핵미사일
    공군 >> 폭격
    ----------------------------------
    육군 >>> 공격준비 
    육군 >> 지상공격 실행
    
    해군 >>> 공격준비 
    해군 >> 어뢰발사
    해군 >> 지상 상륙
    
    공군 >>> 공격준비 
    공군 >> 이륙
    공군 >> 공중공격 실행

    📙 暗黙変換の定理


    オブジェクトを親に変換しても、オフセットされた機能は失われません.
    ただし、追加の実装機能は使用できません.

    📃 明示的な変換

  • 親クラスのオブジェクトを子クラス
  • に変換
  • 型を変換するには、次のように変換するクラス名を明確に指定する必要があります.
  • ChildClass child = (ChildClass)parent;
    [100](100)オブジェクトを最初に作成すると、サブクラスとして作成され、親に変換されます.
    元の子類形態に戻る時だけ可能だ.
    ChildClass child1 = new ChildClass();
    ParentClass parent = child1;		// 암묵적 형변환
    ChildClass child2 = (ChildClass)parent;	// 명시적 형변환

    明示的な変換


    明示的な変換コードの例)
    public class Main01 {
    
    	public static void main(String[] args) {
    		// army, navy, airforce로 각각의 객체생성
    		Army army = new Army("육군");
    		Navy navy = new Navy("해군");
    		AirForce air = new AirForce("공군");
    		
    		System.out.println("----------------------------------");
    		
    		// 상위 객체 형태로 암묵적 형변환
    		Unit temp1 = army;
    		Unit temp2 = navy;
    		Unit temp3 = air;
    		
    		temp1.attack();
    		System.out.println();
    		temp2.attack();
    		System.out.println();
    		temp3.attack();
    		
    		System.out.println("----------------------------------");
     
    		// 하위 클래스 형태로 명시적 형변환
    		Army re1 = (Army)temp1;
    		Navy re2 = (Navy)temp2;
    		AirForce re3 = (AirForce)temp3;
    		
    		re1.tank();
    		re2.nucleus();
    		re3.bombing();
    		
    	}
    
    }
    👉 実行結果
    육군 >>> 공격준비 
    육군 >> 지상공격 실행
    
    해군 >>> 공격준비 
    해군 >> 어뢰발사
    해군 >> 지상 상륙
    
    공군 >>> 공격준비 
    공군 >> 이륙
    공군 >> 공중공격 실행
    ----------------------------------
    육군 >> 탱크공격
    해군 >> 핵미사일
    공군 >> 폭격
    {明示的に変換できない
    Unit u = new Unit();
    Army army = (Army)u;		// 최초 객체 생성이 부모 형태로 만들어진 경우 불가능하다.
    Army army = new Army();
    Unit u = army;
    Navy navy = (Navy)u;		// 다른클래스로 만들어진 객체에 명시적 형변환은 불가능하다.

    📙 暗黙変換の定理


    サブクラス形式で明示的に変換することで,独自の独立した機能(方法)を用いることができる.