23.08.17 02:48 작성
·
409
1
저는 super를 부모 클래스의 어떤 것을 사용하는 것으로 이해했습니다.
package nodocoding;
public class _18_ClassMethod {
public static void main(String[] args) {
Animal [] animals = new Animal[2];
animals[0] = new Animal();
animals[0].age = 10;
animals[1] = new Lion();
((Lion)animals[1]).name = "lion";
System.out.println(((Lion)animals[1]).name);
((Lion)animals[1]).cry();
}
}
class Animal {
int age;
String species;
void cry (){
System.out.println("동물소리를 내며 울어요.");
}
}
class Lion extends Animal{
String name;
void lionCry() {
super.cry();
System.out.println("라이언의 울음소리는 크아앙");
}
}
제가 생각한 것은
((Lion)animals[1]).cry();
라고 코드를 작성했을 때
결과가
"동물소리를 내며 울어요."
"라이언의 울음소리는 크아앙"
이라고 뜰 줄 알았는데
"동물소리를 내며 울어요."
만 뜨더라구요.
예상과 다르네요 ㅠ 왜 이런 걸까요??
답변 2
1
2023. 08. 20. 16:12
안녕하세요?
super 를 이용하면 부모 클래스의 메소드나 변수 등에 접근할 수 있습니다. 지금 Animal 클래스에는 cry() 메소드가 있고 Lion 클래스에는 lionCry() 메소드가 있어요. 그리고 질문자께서 작성하신 코드
((Lion)animals[1]).cry();
는 lionCry 가 아닌 cry() 메소드를 호출하는 것이므로 Animal 클래스의 cry() 메소드에 정의된 것처럼
void cry (){
System.out.println("동물소리를 내며 울어요.");
}
동물소리를 내며 울어요. 만 출력되는 것이 맞습니다.
Ambition 님께서 답변을 남겨주신 것처럼
"동물소리를 내며 울어요."
"라이언의 울음소리는 크아앙"
위 두 문장이 모두 출력되도록 하기 위해서는 Lion 클래스에 정의된 lionCry() 메소드가 호출되어야 하며 코드는 이렇게 변경되어야 합니다.
((Lion)animals[1]).lionCry();
Lion 클래스 안의 lionCry() 메소드의 이름을 cry() 로 바꾸게 되면 부모 클래스인 Animal 의 cry() 메소드를 오버라이딩(=덮어쓰기) 하게 되며,
// void lionCry() {
void cry() {
super.cry();
System.out.println("라이언의 울음소리는 크아앙");
}
이때부터는 원래 작성하셨던 것처럼
((Lion)animals[1]).cry();
라고 했을 때 Lion 클래스의 cry() 메소드가 호출되며 결국 아래 두 문장이 모두 출력되게 됩니다.
"동물소리를 내며 울어요."
"라이언의 울음소리는 크아앙"
감사합니다 😊
0
메인 함수 부분에서 ((Lion)animals[1]).cry();
부분을 ((Lion)animals[1]).lionCry();
로 바꿔서 다시 실행해봅시다.
참고로, Lion클래스의 메소드를 lionCry()
가 아닌 cry()
로 정의하면 ((Lion)animals[1]).cry();
이 부분을 그냥 animals[1].cry();
로 실행시켜도 다형성에 의해 Animal클래스의 cry()
부분이 오버라이딩되어 Lion클래스의 cry()
부분이 호출되기 때문에 글쓴이님께서 원하시는 부분이 아래와 같이 출력됩니다.
2023. 08. 23. 21:00
자바 심화편은 다른 일들로 바빠서 조금 지연되고 있네요 ㅠㅠ 제게 주어진 시간이 많았으면 좋겠습니다 ㅎㅎ 이펙티브 자바 내용은 아닙니다 ^^;
2023. 08. 20. 16:12
훌륭한 답변, 이번에도 감사드립니다 😊👍