inflearn logo
강의

Course

Instructor

Java Basics by Nadokoding - Full Course (20 hours)

Super

super사용해봤는데 이해가 잘 안되네요

523

zxcvbnm26815511

10 asked

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();

라고 코드를 작성했을 때

결과가

"동물소리를 내며 울어요."
"라이언의 울음소리는 크아앙"

 

이라고 뜰 줄 알았는데

"동물소리를 내며 울어요."

만 뜨더라구요.

예상과 다르네요 ㅠ 왜 이런 걸까요??

 

java 객체지향

Answer 2

1

nadocoding

안녕하세요?

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

Ambition

메인 함수 부분에서 ((Lion)animals[1]).cry(); 부분을 ((Lion)animals[1]).lionCry(); 로 바꿔서 다시 실행해봅시다.

참고로, Lion클래스의 메소드를 lionCry()가 아닌 cry()로 정의하면 ((Lion)animals[1]).cry(); 이 부분을 그냥 animals[1].cry(); 로 실행시켜도 다형성에 의해 Animal클래스의 cry()부분이 오버라이딩되어 Lion클래스의 cry()부분이 호출되기 때문에 글쓴이님께서 원하시는 부분이 아래와 같이 출력됩니다.

0

nadocoding

훌륭한 답변, 이번에도 감사드립니다 😊👍

0

Ambition

아이구, 강사님께서 직접 답변을 달아주셔서 저로서는 영광입니다😄 복습차원에서 다른 학습자분들의 질문을 해결하면서 저도 리마인드가 되기 때문에 좋은 것 같아요.

퀄리티 좋은 강의덕분에 스프링 학습하는데 있어 자바관련된 것은 무리없이 이해가 되서 더욱 좋습니다. 혹시 자바 심화편은 이펙티브 자바와 관련된 부분인가요? 🤔

0

nadocoding

자바 심화편은 다른 일들로 바빠서 조금 지연되고 있네요 ㅠㅠ 제게 주어진 시간이 많았으면 좋겠습니다 ㅎㅎ 이펙티브 자바 내용은 아닙니다 ^^;

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

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

114

2

다운로드가 안됩니다

0

162

2

다형성

0

115

2

HashMap

0

75

2