본문 바로가기

Java

상속이란?

상속

상속이 무엇인가? 부모님이 자식에게 자신의 재산을 물려주고 자식은 부모님의 재산을 자신의 것처럼 사용하는 것을 상속이라고 한다. 

자바에서의 상속도 이와 같다. 부모 클래스를 상속받아 부모 클래스의 멤버등을 자식클래스가 사용하는 것이다. 

이때 부모클래스는 상속 클래스, 자식클래스는 하위, 파생클래스라고도 불린다. 

그렇다면 상속은 왜 하는것인가?

첫번째로 중복 코드를 줄여주기위해서 한다. 

예를 들어  Car1, Car2,Car3 ,Car4 ,Car5 ,.......라는 클래스를 생성한다고 가정해보자

그리고 이 코드들의 기본적인 멤버들이 같다고 가정할때 이렇게 같은 코드를 가진 클래스들을 여러개 생성하지않고

중복되는 코드들은 따로 클래스를 만든 뒤 이 클래스를 상속받아 사용하는 방식으로 중복되는 코드를 줄일 수 있다. 

public class Car1{

int Speed; << 기본 멤버

String model; << 기본멤버

void method1(){<< 클래스 마다 다른 멤버

  }

이런 경우 상속을 받지 않으면 모든 클래스에 기본 멤버를 작성 해야 한다. 

하지만 상속을 하면 그냥 상속받은 클래스와 다른 멤버를 적기만 하면된다. 효율적이고 개발 시간을 줄일수있다. 

두번째로는 수정을 최소화 할 수 있다는 것.

상속을 받지않고 코드를 작성 할 경우 기본멤버를 수정하면 그 영향을 받는 다른 코드들 까지 전부 다시 작성해야한다. 

상속을 받고 있다면 부모 클래스만 수정하면 상속받고 있는 다른 클래스들은 수정 할 필요가 없다.

- 상속을 한다고 해도 부모클래스의 모든 멤버, 메소드를 사용 할 수 있는 것은 아니다. 

지난 시간에 했던 접근지정자의 영향으로 부모클래스에서 private접근지정이 되있는 멤버,메소드는 자식에서 사용이 불가능하다. 

그리고 패키지가 다른경우에서도 접근 제한자의 영향을 받으니 접근제한자 별로 접근영역을 다시한번 숙지하자


-클래스 상속

자바에서 상속은 자식이 부모를 골라서 상속받는다.  상속을 받는 방법은 아래와 같다.

class 자식클래스 extends 부모클래스{

//필드

//생성자

//메소드

}

이때 자바의 경우 다중상속을 허용하지 않으므로 

다.  상속을 받는 방법은 아래와 같다.

class 자식클래스 extends 부모클래스,부모2,부모3........{

//필드

//생성자

//메소드

}

위와같은 상속은 불가능하다. 


-부모 생성자 호출

만약 자식의 객체를 만들때 상속받은 부모의 객체는 만들어지는것일까??

그럼 무엇이 먼저 만들어질까?? 부모없는 자식은 있을수 없듯 부모의 객체가 생성된 뒤 자식의 객체가 생성된다. 

메인 메소드에서 자식 객체만 만들어보자

부모클래스 : CellPhone 

자식클래스 : DmbCellPhone

DmbCellPhone dmbcellPhone = new DmbCellPhone(); 

이렇게 자식 클래스만 만들었다고 하자 하지만 자식클래스 내부에 포함되어 있는 부모클래스의 객체가 먼저 만들어진뒤

자식객체가 만들어 진다는것

모든 객체는 생성자를 호출해야 만들어지는데 우리는 자식클래스에 따로 부모객체를 만드는 생성자는 만들지 않았다 왜 부모객체가 먼저 만들어질까>???

사실 부모생성자를 호출하는 코드는 존재한다. 자식클래스에있는데 보이지 않을뿐이다. 

부모클래스의 생성자 호출 코드는 자식 클래스의 생성자 첫줄에 존재한다. 기억 나는가? 우리가 클래스를 만들때 생성자를 만들지않으면 컴파일러는 자동으로 기본생성자를 만든다 하지만 우리에게는 보이지않는다.

이것과 마찬가지다 만약 자식클래스의 생성자에 부모클래스의 생성자를 호출하지않으면 컴파일러는 자동적으로 기본생성자를 생성한다.

예) publinc DmbCellPhone(){

super(); <<

} 

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

public CellPhone(){}

를 호출하는것. 만약 부모의 기본생성자가 아닌 다른 생성자를 호출하고싶다면 

publinc 자식클래스(매개변수1,매개변수2....){

super( 매개값.....); <<

} 

이런방법으로 호출이 가능하고 이때 매개값과 일치하는 부모생성자를 호출한다. 만약 일치하는 생성자가 없다면 오류가 난다. 

만약 매개값이 없이 super()를 호출한다면 부모의 기본생성자를 호출하는데 이 때 부모 클래스내부에 기본생성자없이 다른 생성자만 존재한다면 당연히 컴파일러는 기본생성자를 찾을 수 없어 에러가 난다. 

그리고 super();는 반드시 자식 생성자 첫줄에 위치해야한다.  다른줄에 있다면 에러가 난다.

'Java' 카테고리의 다른 글

타입변환. 다형성  (0) 2018.12.20
메소드 재정의(Override)와 몇가지..  (0) 2018.12.12
접근 제한자 ,Getter/Setter  (0) 2018.11.22
정적인 자식 Static  (0) 2018.11.21
메소드와 인스턴스멤버, this.  (0) 2018.11.19