Dev/Java

[Java] 클래스 상속

kjyyjk 2022. 7. 8. 23:10

상속

Java에서 상속은 현실에서 부모가 자식에게 물려주는 상속이랑 매우 유사하다.

 

상송을 통해 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다.

 

클래스를 재사용해서 새로운 클래스를 만들기 때문에 시간과 코드의 중복을 줄여주기 때문에 보다 효율적이다.

 

class Product{
	int count;
    String color;
}
class CellPhone extends Product{
	String name;
}

CellPhone클래스는  Product 클래스를 상속 받는다.

 

따라서 CellPhone의 멤버로는 Product클래스의 멤버인 count와 color를 기본적으로 가지면서,

 

추가적으로 따로 선언해주었기 때문에 name 필드도 가진다.

 

class CellPhone extends Product, Item{

}		//절대 안됨

다음과 같이 하나의 클래스가 둘 이상의 여러 클래스로부터 상속받는 것은 안된다.

 

즉 다중 상속은 지원하지 않는다.

 

super()

 

상속을 했을 경우 자식 객체를 생성하면 부모 객체가 먼저 생성된다. 그리고 객체는 생성자를 통해 생성된다.

 

즉. 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다.

 

class CellPhone extends Product{
	CellPhone(){
    	super();
    }
}

super()는 부모 클래스의 생성자를 호출한다.

 

이는 생성자를 선언하지 않았을 때 자동으로 호출되기도 하고, 내가 직접 부모 생성자를 호출하고 싶다면

 

명시적으로 호출할 수 있다.

 

class Product {
	String name; 
    int price;
    Product(String name ,int price){
    	this.name = name;
        this.price = price;
    }
}

class CellPhone extends Product{
	CellPhone(String n, int p){
    	super(n,p);
    }

}

CellPhone( )생성자에 매개변수로 name 정보의 n과 price p를 주고 생성자 안에서 super를 호출했다.

 

그리고 super를 호출하면서 n과 p를 매개변수로 넘겨주었다.

 

이는 곧 부모 Product()생성자에 n과 p를 매개변수로 넘긴 것과 같은 것이다.

 

따라서 Product의 생성자에 따라 이 객체의 name = n;         price = p; 가 된다.

 

만약 부모 클래스에 매개변수를 가진 생성자만 정의되어있는 상태에서 자식 클래스에서 디폴트 생성자를 호출하면?

 

class Product {
	String name; 
    int price;
    Product(String name ,int price){		//매개변수 있는 생성자만 정의
    	this.name = name;
        this.price = price;
    }
}

class CellPhone extends Product{
	CellPhone(){		//디폴트 생성자 - > 부모의 디폴트 생성자 호출.

    }

}

이 경우에는 부모에 디폴트 생성자가 명시적으로 정의되어 있지 않아 오류가 발생한다.

 

만약에 부모 클래스에 어떠한 생성자도 정의 되어있지 않았다면 자동으로 디폴트 생성자.

 

즉, 기본 생성자를 만들어 호출 했을 것이다.