안녕하세요..다형성 질문입니다^^
별빛
안녕하세요!!
요즘 학원에서 스터디를 하고 있습니다..한분씩 단원별루 준비해서 발표하고 회의를 하는 형태로..ㅎㅎ
제가 다형성을 해야합니다만..이해가 가질 않는 부분이 있어서요!!
메모리에 어떻게 올라가는지랄까요??
아래 인터넷에서 퍼온 예제인데요..
abstract class Tire{
int max=100;
public void run(){
System.out.println(나는 달려요);
}
abstract public void myPr();
}
class NonSkidTire extends Tire{
int max = 80;
public void myPr(){
System.out.println(최대속도는 +max+km/h 이고 저는 눈길 빗길에도 미끄럽지 않습니다.);
}
}
class Car{
public static void main(String[] args){
Tire nt = new NonSkidTire();
nt.run();
nt.myPr();
System.out.println(((NonSkidTire)nt).max);
}
}
nt객체로 메소드를 부를 때 오버라이딩 되지않으면 부모클래스..아니면 자식클래스 사용하고..
nt객체로 멤버필드는 부모클래스의 멤버필드를 사용하며..자식의 멤버필드를 사용할때는 오버라이딩된 메소드안에서 사용할 수 있다.. 이거는 규칙이니깐 이해를 하겠습니다만..
인터넷에도 다 예제를 써서 저렇게 된다는 말만 있고..
왜 저렇게 되는지..확실한 뭔가가 빠진듯 하네요..
마지막줄에 System.out.println(((NonSkidTire)nt).max);
이거는 대충은 되는구나 생각은 했습니다만..형변환이 과연 왜 되는지..
class Parent{}
class DerivedOne extends Parent{}
class DerivedTwo extends Parent{}
public class Test{
public static void main(String args[]){
Parent p = new Parent();
DerivedOne d1=new DerivedOne();
DerivedTwo d2=new DerivedTwo();
}
}
위 와 같은 소스는 SCJP문제 풀이중 나왔습니다..
마지막줄이 바뀌면서 여러문제가 나왔는데요..
d2=d1;
--컴파일 에러
p=d2;
--됨
d2=(DerivedTwo)d1;
--컴파일 에러
d2=(DerivedTwo)p;
--컴파일은 되나 런타임에러
p=(Parent)d1;
--됨
d2=p;
--컴파일 안됨
위 소스한개로 한줄만 바꿔치기해서 6문제가 나와버렸네요..
아..직접 써서 컴파일 안해보니 모르겠더군요..
맨위에 쓴Tire 클래스 소스만의 개념만 가지고 있으니
형변환에서 완전 막히고..
시원하게 답변 좀 부탁드립니다..아니면 어디 설명 잘된 곳 이라두..^^
ps. 글구 저번에 찬님 답변 감사했습니다..제가 하노이 타워 스윙때문에 질문드렸었는데 잘풀렸습니다..
스레드로 넣으니까 잘되더군요..한가지 제가 의아했던 점은요..
swing으로 안하고 awt로 하면 된다는 점이에요..awt는 OS의 자원을 사용하니깐 그래픽이 그려지는 거 같고
swing은 아니라서 그런 것 같습니다..확실히는 모르겠습니다만..swing은 스레드를 돌리니깐 된다는거..아무튼
찬님 감사합니다^^
-
단순드립
그럼 자식 = (자식)부모 가 런타임시 에러가 나는데 왜 부모자식간에 캐스팅이 가능하도록 해 놨나요? 어떤 특별한 이유가 있나요? 차라리 코드에러로 잡는게 프로그래머 입장에서 편한거 아닌가요?.. 그러니까 부모자식간 양쪽다 캐스팅을 되게 하지 말고 부모 = 자식 대입연산자나 부모 = (부모)자식 형태의 캐스팅만 가능하게 해 놓게 맞지 않나요?
-
아이돌
ㅎㅎ네..스터디에서 발표도 잘됐고..다들 잘 이해한것 같네요..하나하나 풀려갈때마다 그 쾌감이 좋군요^^
-
파도
많이 하다보면 아시게 될것이예요. ㅎㅎ \체득\하신다고 하죠. ㅋㅋ.
모르는것 같은데, 몸은 알고 있어. ㅎㅎ. -
물맑
감사합니다..이해가 안되서 계속 읽어봤습니다^^어느정도 이해했네요..어렵긴 어렵군요..ㅜㅜ갈길이 아직 먼듯..
-
텃골돌샘터
d2 = (DerivedTwo)p 의 경우에는
1. p를 DerivedTwo로 캐스팅하는것은 가능합니다. ( 부모자식간의 casting 이 가능. 컴파일 에러 안남 )
2. 하지만 실행 할때에, 결국에는 d2 = p로 되는것 ( 자식참조에 부모 객체를 넣는것 - 문제가 생김 ) -
시크포텐
3.
가장 결정적인것은, 부모자식간에만 casting을 할 수 있도록 만들어 두었다는것입니다.
위의 예제를 보면
DerivedOne 과 DerivedTwo는 부모 자식간의 관계가 아니기 때문에 캐스팅이 불가능합니다.
( 정확하게 말하자면, 꼭 부모자식의 관계가 아니라, interface도 캐스팅이 가능합니다. ) -
보아라
내용에 대한 답변.
1.
부모의 참조변수에 자식의 객체를 할당하는것은 가능합니다.
자식이라는 말은, 부모에게서 상속 받아 무언가가 추가 될 수 있다. 라는 의미입니다.
이때, 자식은 부모에게 받은것을 가지고 있다는 \보장\이 있기 때문에,
부모참조로 사용할 수 있는 각종 메소드를 호출하여도, 자식에 있기 때문에 잘 수행될것입니다.
2.
하지만 자식참조변수에 부모의 객체를 할당하면 문제가 됩니다.
자식은 부모를 확장할 수 있기 때문에, 부모가 가지고 -
연와인
PS에 대한 답변.
1. 예전 답변에 Java에서 그림을 그릴때에는 Event Dispatch Thread에서 수행된다고 적어 두었습니다.
2. 하지만 이것은 거짓말입니다. 정확하게 말하면 Swing만 EDT에서 수행 됩니다.
3. AWT는 OS(Windows)에서 그림을 그립니다.
4. 움직이는것은 Java의 데이터도, 그리는것은 OS이니 안 멈추게 됩니다.
앞으로 시간이 오래 걸리는 무슨일을 할때에는 왠만하면 꼭 스레드를 이용해 주세요~ ㅎㅎ