인프런 커뮤니티 질문&답변

최은희님의 프로필 이미지
최은희

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

Super

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

작성

·

430

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

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

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()부분이 호출되기 때문에 글쓴이님께서 원하시는 부분이 아래와 같이 출력됩니다.

나도코딩님의 프로필 이미지
나도코딩
지식공유자

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

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

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

나도코딩님의 프로필 이미지
나도코딩
지식공유자

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

최은희님의 프로필 이미지
최은희

작성한 질문수

질문하기