자바 업캐스팅에 관한 질문입니다.
재미
public class shape
{
int j = 1;
public void draw()
{
System.out.println(draw shape);
}}
public class circle extends shape
{
int i = 2;
public void draw()
{
System.out.println(draw circle);
}
/*public static void main(String args[])
{
circle c = new circle();shape s = c;
System.out.println(c); //같은 메모리
System.out.println(s); //같은 메모리
s.draw();
System.out.println(s.i); //오류가 남(??)
System.out.println(s.j); //1이 출력이 됨
//s.draw2();
}*/
} circle클래스에서shape s = c;업캐스팅을 하였습니다.
그럼 s.i해도 오류가 나지 않고 2라는 값이 출력되어야 하지 않습니까?shape s = c;
System.out.println(c); //같은 메모리
System.out.println(s); //같은 메모리
하면 같은 메모리를 가지고 있습니다.
아 그리고 이상한건 s.i 는 않되는데 왜 s.draw();는 어째서 되는 것입니까?
-
보물선
만약에 circle c = new circle(); 를 아래처럼한다면 또 달라집니다.
circle c = (circle)new Shape();
라고 되어 있다면 어떤결과가 날까요? -
천사
shape s = c;
부모클래스형으로 업캐스팅이 되었기 때문에 자식클래스의 변수를 마음대로 사용할수 없고요.
상속을 받은 자식클래스는 부모클래스의 모든것을 직접적으로 사용할수 있지만(private 제외)
부모클래스로 형변환된 상태에서는 자식의 것을 자기것처럼 사용불가능 하다고 보면 됩니다.
다시 자식클래스로 다운캐스팅해야 마음대로 직접적인 접근이 가능하죠.
draw(); 메서드의 경우는 부모클래스와 자식클래스에 모두 선언이 되어있기 때문에
당연히 부모 -
치리
자바의 다형성을 공부하실때엔 2가지만 명심하면 됩니다.
1. 실제 생성된 객체의 타입과 2. 생성된 객체를 담는 변수의 타입 입니다.
호출가능한 변수와 메서드는 변수의 타입에 의해 결정되고
실제 호출되는 메서드는 최종적으로 오버라이딩한 메서드입니다.
문제를 보면
circle c = new circle();
c변수는 생성된 circle의 인스턴스를 가리킵니다.
c가 가리키는 객체는 shape의 자식이기 때문에 i와 j를 다가지고 있