java/inheritance

[inheritance] 4. super키워드의 개념

jeri 2024. 4. 21. 18:50
반응형

1. super키워드란?

  • 자식클래스의 메소드에서 부모클래스의 객체를 저장하기 위한 숨겨진 매개변수
  • this키워드 = 자신의 객체 super키워드 = 부모의 객체
  • super 키워드로 자식클래스의 메소드에서 부모클래스의 객체필드 또는 메소드에 접근이 가능
  • 하지만 super 키워드를 사용하지 않아도 자식클래스의 메소드에서는 부모 클래스 객체의 필드 또는 메소드를 사용할 수 있음

 

2. 뭐?? this를 썼는데, 자동으로 super로 변환이 된다구??

  • 자식클래스의 메소드 내부에서 this 키워드로 자식클래스 객체의 필드 또는 메소드를 참조하고,
  • 만약 참조할 필드 또는 메소드가 없는 경우,
    자동으로 super 키워드로 부모클래스 객체의 필드 또는 메소드를 참조

 

3. super 사용 예시

//자식클래스에서 작성됨
public void display() {
	//System.out.println("아이디 = " +super.getId()); //super생략가능
	System.out.println("아이디 = " +getId());
	System.out.println("이메일 = " +getName());
	System.out.println("이메일 = "+email);
}
public void display() {
	super.display(); //(부모)의 메소드 호출
	display(); //error, 무한루프 : (자식)의 메소드 호출 - 알고리즘에는 재귀호출이 가능하지만, 자바에서는 무한루프!!
}
public void display() {
	this.onePlusOne();
  //super.onePlusOne(); //자식클래스 내 참조할 메소드가 없다면 자동으로 부모클래스 참조, super쓰지 않아도 됨
}

 

 

 

 

 

 

4. super 키워드를 사용해야 하는 경우

1. 자식클래스의 생성자에서 부모클래스의 생성자를 호출하기 위해

  • (가장중요!)

전제조건

  • 부모클래스에는 기본생성자가 이미 생성되어있어야만 super() 메소드 사용가능
  • 부모클래스의 생성자를 호출하는 명령 전에 다른 명령을 작성하면 에러 발생

형식

  • super(값, 값, ...);

예시

//1. 자식클래스에서 기본생성자 호출 시, 
//부모클래스super 매개변수에 값 전달이 없기 때문에 생략 가능
public MemberEvent() {
	//기본생성자를 호출하는 명령 생략 가능
	//super(); 부모클래스의 기본생성자 호출하는 명령 - 부모클래스의 객체가 생성
}


//2. 자식클래스에서 매개변수가 있는 생성자 호출 시, 
//부모클래스 super매개변수에 값을 전달하여 프로그램에서 부모와 자식이 연결된 객체를 생성과 초기화됨
public MemberEvent(String id, String name, String email) {
	super(id,name);
	this.email = email;
}


//3. error - 생성자를 호출하는 명령은 항상 첫번째 명령이어야함
public MemberEvent(String id, String name, String email) {
	//System.out.println();  //error
	super(id,name);
	this.email = email;
}

2. 자식클래스의 메소드에서 부모클래스의 숨겨진 메소드(Hide Method)를 호출하기 위해

  • 그렇다면 부모클래스의 메소드는 대체 왜 숨겨졌을까?
    • 자식클래스에서 부모클래스의 메소드를 재선언 하였기 때문에
    • 즉, 메소드오버라이드 되었기 때문에 숨겨짐

형식 

  • super.메소드명(값,값,...);

예시

//자식클래스 MemberEvent클래스에서..
//메소드 오버라이드
public void display() {
	System.out.println("아이디 = " +getId());
	System.out.println("이메일 = " +getName());
	System.out.println("이메일 = "+email);
}

//위와 같은 뜻의 메소드 오버라이드
@Override
public void display() {
	// super 키워드로 부모클래스의 숨겨진 메소드를 호출
	super.display(); //아이디와 이름을 출력하는 메소드
    //display(); //error 재귀호출, 무한루프
	System.out.println("이메일 = " + email);
}
반응형