JAVA

[til_211127][java] 상속

yuull 2021. 11. 27. 21:56

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과 개수를 똑같이 작성하면 해당 생성자를 선택한 것으로 보고 호출하게 된다.

그러면 재사용 성공!