super사용해봤는데 이해가 잘 안되네요
523
10 asked
저는 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();라고 코드를 작성했을 때
결과가
"동물소리를 내며 울어요."
"라이언의 울음소리는 크아앙"
이라고 뜰 줄 알았는데
"동물소리를 내며 울어요."만 뜨더라구요.
예상과 다르네요 ㅠ 왜 이런 걸까요??
Answer 2
1
안녕하세요?
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()부분이 호출되기 때문에 글쓴이님께서 원하시는 부분이 아래와 같이 출력됩니다.

0
아이구, 강사님께서 직접 답변을 달아주셔서 저로서는 영광입니다😄 복습차원에서 다른 학습자분들의 질문을 해결하면서 저도 리마인드가 되기 때문에 좋은 것 같아요.
퀄리티 좋은 강의덕분에 스프링 학습하는데 있어 자바관련된 것은 무리없이 이해가 되서 더욱 좋습니다. 혹시 자바 심화편은 이펙티브 자바와 관련된 부분인가요? 🤔
자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?
0
133
2
static이 뭐였는지 기억이 안나요 ㅜㅜ
0
110
2
Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의
0
69
1
사고력 키우는 법이 어떤게 있나요?
0
87
2
getter setter
0
100
2
섹션9. 66 메소드 오버로딩 시 질문이 있습니다.
0
77
1
안녕하세요 갑자기 프로그램 에러가 떠서 안되네요
0
75
2
변수 이름짓는법
0
114
2
intelli J 실행오류
0
114
2
혹시 이건 수학적 사고가 부족한 걸까요?
0
152
2
영상이 재생이 안됩니다.
0
163
3
이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.
0
114
2
응용이 어렵습니다.
0
203
2
IntelliJ가 보이지 않습니다.
0
182
3
JDK 버전 문의
0
128
2
BlackBox 파일 내에서 메소드 정의
0
135
1
동기화
0
120
2
Iterator 문의
0
101
1
코드 순서 문의
0
139
1
클래스 메소드
0
146
2
Quiz_05 관련 질문드립니다 !
0
115
2
다운로드가 안됩니다
0
162
2
다형성
0
115
2
HashMap
0
75
2

