Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[2주차] 41. 클래스 상속 및 생성자의 'super', 메서드의 'super' 본문

K-DigitalTraining 강의/1. Java

[2주차] 41. 클래스 상속 및 생성자의 'super', 메서드의 'super'

이대곤 2022. 5. 25. 18:14

* 상속은 클래스 이름 오른쪽에 'extends' 를 넣어 상속받을 부모를 지정한다.

   또한, 상속시 부모의 생성자는 상속을 받지 않고, 메서드와 멤버변수만 상속받음을 알아야 한다.

 

* 이렇게 상속받은 메서드는 이름, 리턴타입, 인자의 타입 및 개수를 수정하지 않고 {}의 부분만 수정하여 동작을 바꿀 수
  있는데, 이렇게 상속받은 함수를 재정의 하는 것을 오버라이딩이라고 한다.

  아래에서 처럼 자식 클래스가 display() 메서드를 재정의 하지 않았다면 display() 호출시 부모한테 상속받은게 호출됨.

 

* super()

- 생성자 첫줄에 보이든 보이지 않든 무조건 존재하는 코드로 부모생성자를 호출하는 메서드이다.

  생성자내에서 단 한번만 호출이 가능하며, 자식 생성자에서는 몸통의 코드 시작전 부모 생성자를 '꼭' 한 번 호출해줘야 한다.

- 생성자내에 코드로 안써줘도 컴파일시 자동으로 인자를 받지않는 super()가 무조건 첫 줄에 추가되며,
   super() 이면 부모클래스의 생성자 중에서 인자가 없는 생성자가 호출되며,
   super(인자1,인자2,,) 이면 부모 클래스의 생성자 중에서 매개변수의 타입 및 개수가 매칭되는 생성자가 호출된다.

   자동으로 추가 되더라도 이를 직관적으로 보이기 위해 아무런 인자가 없는 super()를 코드로 적어주기도 한다.

- 인자를 받는 생성자 { } 내에서 super(인자,인자, 인자,...)를 안 적어주면 디폴트 생성자가 불리게 되며,
   super()이 컴파일 과정중 자동으로 추가되는데,

   이땐 부모 클래스의 인자없는 생성자가 호출되는 것이므로 부모 클래스에 인자없는 생성자가 존재해야 한다.
   자주 놓치는 경우로 부모 클래스에서 인자를 받는 생성자를 만들어두어 인자를 받지않는 생성자가 자동으로
   추가되지 않아 컴파일 오류가 나는 경우가 있으니 미리 알아두자.

- 자식의 생성자에서 super는 보통 상속받은 변수들만 조상의 생성자로 인자를 넘겨주어 초기화 시키는 역할을 한다.
  때문에, 상속받지 않은 변수만 직접 초기화 시켜준다.

  => 아래의 Baseball,Football 클래스 내 생성자 참고

 

* super.멤버함수 or super.멤버변수

- 부모의 변수 및 메서드에 접근하여 사용함으로써 중복되는 코드를 줄이고 싶을 때 사용할 수 있다.

  => 아래의 Baseball,Football 클래스 내 display 메서드 참고

코드

class Sports {

	String name;
	int inwon;

	Sports() {
		name = "야구";
		inwon = 9;
	}

	Sports(String name, int inwon) {
		this.name = name;
		this.inwon = inwon;
	}

	void display() {
		System.out.println("name: " + name);
		System.out.println("inwon: " + inwon);
	}
}// Sports

class Baseball extends Sports {

//	String name;   상속받은 멤버변수
//	int inwon;     상속받은 멤버변수
	double ta;

	Baseball(String name, int inwon, double ta) {
		super(name, inwon); // String과 int 를 받을 수 있는 부모 생성자로 감. 이걸 명시해주지 않았다면 매개변수를 받지않는 부모의 생성자가 자동으로 불렸을 것임.
		// 아래 두 줄의 코드는 부모 생성자에 의해서 처리되기 때문에 중복이라 생략 가능.
		// this.name = name;
		// this.inwon = inwon;
		this.ta = ta;
	}

	void display() { // 상속받은 메서드 오버라이딩
		super.display(); // 부모의 메서드를 사용함으로써 중복코드 제거
		System.out.println("ta:" + ta);
	}
}// Baseball

class Football extends Sports {

	int goal;

	Football(String name, int inwon, int goal) {
		super(name, inwon);
		// 아래 두 줄의 코드는 부모 생성자에 의해서 처리되기 때문에 중복이라 생략 가능.
		// this.name = name;
		// this.inwon = inwon;
		this.goal = goal;
	}

	void display() { // 상속받은 메서드 오버라이딩
		super.display(); // 부모의 메서드를 사용함으로써 중복코드 제거
		System.out.println("goal: "+ goal);
	}

}// Football

public class Ex06_01_상속 {
	public static void main(String[] args) {

		Sports s1 = new Sports();
		Sports s2 = new Sports("축구", 11);

		s1.display();
		s2.display();

		System.out.println();

		Baseball bb = new Baseball("야구", 5, 0.345);
		bb.display();

		System.out.println();
		Football fb = new Football("축구", 7, 3);
		fb.display();
	}
}

실행결과

name: 야구
inwon: 9
name: 축구
inwon: 11

name: 야구
inwon: 5
ta:0.345

name: 축구
inwon: 7
goal: 3
 
Comments