자바

자동타입변환, 강제타입변환

애플쩀 2022. 1. 25. 15:36
부모클래스 변수= 자식클래스타입; 
1.
Animal animal=new Cat();

2.
Cat cat=new Cat();
Aniaml animal=cat; 
  • 타입이 부모로 변환되었으니 부모클래스에 선언된 필드랑 메소드만 접근이 가능
  • 변수로 접근 가능한 멤버는 부모 클래스 멤버로만 
  • 예외!  자식클래스에서 오버라이딩된 메소드는 자식클래스의 메소드가 호출된다 

 

자동타입변환을 하는 이유

부모객체에 자식 객체를 저장해도 , 이미 상속이 되어있고(부모의 필드랑 메소드를 가지고 있고), 자식객체는 부모 객체에 있는 필드랑 메소드만 사용하기에 상관이 없다. 

오버라이딩을 하면서 다양한 결과를 만들 수 있다. 

 

 

 

배열로 객체 관리 

하나하나씩 Tire 변수명= new Tire(location,maxRotation);을 선언해도 되는데 

Tire[] tires= {
new Tire("앞왼쪽",6),
new Tire("앞오른쪽",2),
new Tire("뒷왼쪽",3),
new Tire("뒷오른쪽",4) };

배열로 자식객체를 대입하면 자동 타입변환이 일어난다. 

배열로 객체를 생성하면 반복문을 사용하기에 유리하다 

변수명이 아닌 tire[인덱스]로 사용  

 

 

강제타입변환 
자식클래스 변수=(자식클래스) 부모클래스타입;

child->자식 parent->부모
Child child =(Child) parent;

이렇게 되면 다시 자식의 필드, 메소드 사용 가능 

 

boolean result= 좌항(객체) instanceof 우항(타입)

parent instanceof Child ->Chlid타입으로 변환이 가능한지 확인 

    

 

 

예 

package two;

public class Parent {
 public String field1;
 public void method1() {
	 System.out.println("parent-method1()1");
	 
 }
 public void method2() {
	 System.out.println("Parent-method2");
 }
 
}
package two;

public class Child extends Parent{
public String field2;
@Override
public void method2() {
	System.out.println("Child-method2오버라이딩 ㅎㅎ");
}
public void method3() {
	System.out.println("Child-method3");
}
}
package two;

public class ChildExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Child child=new Child();
		Parent parent=child; 
		parent.method1();
		parent.method2();
		child.method3();
		
		Child child2=(Child)parent;
		child2.method2();
		child2.method3();
		
	}

}

 

 

 

 

내가 헷갈렸던 것을 정리하면, 

- 부모클래스 부모변수=자식클래스변수  -> 자동변환 

- 자동변환을 하면,  그 부모변수로는 부모 필드, 부모 메소드만 사용가능함 

- 부모의 메소드가 자식클래스 안에서 오버라이딩 되었다면  오버라이딩된 메소드가 호출됨, 

- Child child =new Child(); Parent parent=new Parent(); 하고 

parent.부모의 메소드();를 사용하는 것이다. 오버라이딩했다면 그  자식클래스의 오버라이딩한 메소드가 호출됨 

child 변수로는 부모,자식 의 필드 ,메소드 사용가능  

 

-강제타입변환 = 자식클래스 변수=(자식클래스)부모클래스변수;

 다시 자식클래스의 필드, 메소드를 사용할 수 있음