자바
자동타입변환, 강제타입변환
애플쩀
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 변수로는 부모,자식 의 필드 ,메소드 사용가능
-강제타입변환 = 자식클래스 변수=(자식클래스)부모클래스변수;
다시 자식클래스의 필드, 메소드를 사용할 수 있음