[til_211127][java] 상속
✔ java.lang.Object 클래스는 모든 클래스들의 최상위 조상 클래스로, 컴파일러에 의해 자동으로 상속이 이루어진다. 따라서 어떤 클래스를 생성할 때 예를 들어 class Name extends Object { } 에서 extends Object를 사용자가 따로 써주지 않아도 컴파일러가 알아서 부모 클래스인 Object 클래스를 호출해온다. 또한 예를 든 Name 클래스의 객체를 만들 때 메소드 호출 시 따로 만들어놓지 않았는데 리스트로 띄워주는 메소드들은 모두 컴파일러가 자동 호출한 Object 조상 클래스의 메소드들인 것이다.
✔ 서브클래스 생성자 작성시 슈퍼클래스의 생성자를 선택할 수 있다. main코드에서 서브클래스 호출시 서브클래스 생성자를 호출하고 자동으로 슈퍼클래스 생성자까지 호출하게 된다. 이 때 호출할 슈퍼클래스의 생성자를 선택할 수 있다는 것이다. 선택 방법은 super(parameter)인데, parameter에다가 선택할 슈퍼클래스 생성자의 type,개수를 맞추어 쓰면 된다. 아 물론 super()로 따로 선택하지 않으면 컴파일러가 자동으로 슈퍼의 기본생성자를 불러온다. 따라서 이 때 슈퍼에 기본생성자가 따로 없다면 오류가 뜸.
class Animal {
private String feed ;
//Animal() {}
Animal(String s) {
feed = s;
}
String get_feed() {
return feed;
}
}
class Fish extends Animal {
private int depth;
//private String feed;
Fish(String s, int d) {
super(s); // 서브클래스 생성자 작성시 슈퍼클래스 생성자 선택 가능 !!
//feed = s;
depth = d;
}
void show() {
System.out.println("먹은 것 : "+feed+", 현재수심 : "+depth+"ml");
}
}
public class Main {
public static void main (String args[]) {
Animal Tiger = new Animal ("토끼");
System.out.println("먹은 것: " + Tiger.get_feed());
Fish Shark = new Fish("참치",30);
Shark.show();
}
}
(출력: > 먹은 것 : 토끼
> 먹은 것 : 참치, 수심 : 30ml)
주석처리 해놓은 코드는 내가 super()를 쓰는 방법을 떠올리지 못해서 private인 슈퍼클래스의 필드를 재사용하지 못해 서브클래스에다가도 private 으로 필드를 따로 또 만들어준 코드다. 하지만 이렇게 하면 상속을 만들어 놓은 의미가 없다는 ...
super()를 통해 슈퍼클래스의 생성자를 서브클래스에서도 재사용할 수 있다.
여기서 super()의 parameter로는 선택할 슈퍼클래스의 생성자 parameter의 type과 개수를 똑같이 작성하면 해당 생성자를 선택한 것으로 보고 호출하게 된다.
그러면 재사용 성공!