해결된 질문
작성
·
88
·
수정됨
0
강의13분대 관련 질문입니다.
public void paint()
{ System.out.print("A");
draw();}
여기서 draw();를 this draw(); 로 수정하게 되면 자식 draw가 아닌 부모 draw를 불러오나요?
강의 14분대 문제 질문입니다.
A b = new B(1)을 통해 자식 클래스에서 public B(int i)를 불러왔으면 부모 클래스에서도 public A(int i)를 불러와야 하는것이 아닌가요?
이전 강의에서 파라미터가 있는 생성자 car(a,b)예제를 들고 설명을 해주실 때 그렇게 이해를 했는데 무슨차이인지 통 모르겠네요..
17분대 specialDraw가 오류 나는 이유가 정확히 궁금해요
A b = new B(1); 을 통해 업캐스팅을 통해 B를 명시해줬기 때문에 에러가 나는걸까요?
뭔가 명확히 갈증이 해소되지 않는느낌이라 답답하네요...ㅠ
답변 1
0
안녕하세요, 답변드립니다.
아닙니다. 업캐스팅에서는 부모 메서드에 있는 this를 무시합니다.
해당 내용은 섹션: 헷갈리지 마세요! 의 "업캐스팅은 this를 무시합니다." 를 참고 부탁드립니다.
이유는 제가 굳이 설명은 잘 안하는데, 여기서의 this는 부모에 선언되어 있더라도 자식 형태의 객체를 가리키고 있기 때문입니다.
Java의 자식 클래스는 일단 무조건 부모 클래스의 기본 생성자(매개변수가 없는)를 먼저 실행하게 합니다.
말씀하신 대로 매개변수가 1개짜리 생성자를 실행하게 하려면 super(매개변수 1개)
로 호출해야 합니다. (아니면 부모의 기본생성자에서 this(매개변수 1개)
로 호출)
이건 그냥 받아들이시는 것이 편합니다. 업캐스팅 형태에서 자식에게만 있는 메서드를 실행할 수 없습니다. 업캐스팅을 하는 이유는 일단 부모의 형태로 태어나게 하고, 메서드를 재정의한 자식 클래스의 기능을 갈아끼우기 위해서 사용하는데요.
그런 것은 Java 개발자나 원리적으로 파악하는 것이 좋고, 수험생의 입장에서는
"부모의 형태로 태어났으니 자식에게 있는 것은 못 쓴다."로 암기하시는 것이 좋습니다.
그럼에도 불구하고 원리적으로 궁금하실까하여 답변을 추가하자면,
일단 업캐스팅은 참조 변수의 타입이 부모입니다. 이 경우에 자바 컴파일러 (Java 코드를 기계어로 변환하는 과정에서 참여하는 프로그램)는 참조 변수가 가리키는 객체의 실제 타입이 아니라 참조 변수의 선언된 타입에 따라 메서드 호출 가능 여부를 판단합니다.
(→ 참조 변수의 타입은 부모이나, 실제 객체의 타입은 자식의 생성자로 태어나고 있음.)
지금 업캐스팅 형태로 태어난 변수(객체)는 변수의 타입이 부모입니다. 그래서 부모 클래스에 정의된 메서드만 사용할 수 있다고 판단합니다. 그래서 자식 클래스에 있는 메서드를 실행하려는 순간 컴파일러는 해당 메서드를 찾지 못하고 에러를 뱉습니다.
사용을 하게 하려면, 다시 부모의 타입을 자식 타입으로 다운캐스팅(down-casting)하면 정상적으로 동작합니다.
답변 여부와 관계없이 시험을 준비할 때는 너무 언어를 원리적으로 다가가는 것을 경계하시는 것이 좋습니다. 특히 객체지향 기반 언어를 깊게 파게 되면, 알고 있는 것도 다르게 해석해서 틀릴 수 있습니다. 단순 암기로 바로 찍고 넘어갈 수 있도록 훈련하는 것이 정보처리기사식 문제에는 좀 더 유리하다고 생각합니다.. 😃