상속이란
현실 세계와 마찬가지로 자바에도 자식과 부모의 개념이 있으며, 그 관계에서의 상속 또한 존재한다.
자바에서의 상속도 말 그대로 자식이 부모로부터 무언가를 물려받는 개념이다.
현실 세계에서 부모는 자식들에게 돈이나, 물건 등을 상속하여 건내주고,
자바 세계에서는 부모가 자식들에게 변수와 메소드 등을 물려줄 수 있다.
* 단 부모 클래스의 멤버 접근지정자가 private일 경우 상속 불가
상속을 쓰는 이유
전자기기나 자동차 등의 객체를 만들 때 각각의 객체 마다 매번 새롭게 설계하고 만들고자 하면 작업이 비효율적이게 된다. 그래서 공통된 부분을 한데 모아 부모 클래스로 만들고, 필요에 따라 부모클래스에서 하나씩 가져와 사용하는 자식 클래스를 두어 객체를 만들어 내는 것이다.
자동차를 예로 들면, 모든 자동차는 바퀴, 프레임, 창문.. 등 공통되는 부분을 가진다. 이러한 부분을 부모 클래스로 만들어 둔다. 그리고 A자동차, B자동차, C자동차.. 를 만들 때 따로 변수를 선언하지 않고 부모 클래스로 부터 부품을 가져와 각각의 사이즈와 색을 설정하여 자동차를 만드는 것이다. 그렇게 되면 사용자가 자동차를 만들때 마다 처음부터 새로 다 설계를 할 필요 없이 부모클래스를 재사용하여 효율적으로 자동차를 만들 수 있게된다.
상속 문법
Class 부모클래스 {
}
Class 자식클래스 extends 부모클래스 {
}
부모객체와 자식객체의 구분 (super.멤버)
매개 변수에 대해서 배울 때, 매개 변수명과 객체 변수명이 같을 경우 매개 변수로 넘어온 변수와 객체 변수를 구별하기 위해 객체 변수의 앞에 this를 붙였다. 마찬가지로 자식 클래스에서 부모 클래스의 변수를 가져다 쓸 때 부모 클래스의 변수 명과 자식 클래스의 변수 명이 중복 될 경우 부모 클래스의 변수 명 앞에 super를 붙여 구분해 줄 수 있다.
부모생성자 호출 (super())
부모 클래스로부터 상속받은 자식 클래스가 객체로 만들어지고 실행될 때 부모의 기본 생성자도 함께 호출되고 실행된다. 이때 부모의 기본생성자는 default값으로 super()로 숨겨져 있다.
즉 super를 따로 호출 하지 않으면 부모클래스의 기본생성자가 호출, 실행되기 때문에 부모 클래스에 매개변수 생성자만 존재하고 기본 생성자가 없는 경우에는 자식클래스는 부모클래스를 상속받을 수없다.
이런 경우 자식 객체를 생성하고 실행할 때 부모 클래스의 기본생성자가 아닌 매개변수를 생성자를 super(매개변수 값); 를 자식클래스의 생성자에 만들어주어 실행하면 된다.
정리하자면
1. 객체를 만들 때 생성자가 필요한데, 자식이 부모를 상속하는경우 부모의 생성자도 필요하다.
2. 우리 눈에는 보이지 않지만 기본적으로 자식 클래스에 super()가 있어 부모클래스의 생성자도 함께 실행된다.
3. 부모클래스에 생성자가 없으면 자식 객체도 생성할 수 없다.
4. 부모의 기본생성자가 아닌 매개변수 생성자를 받고싶다면 super(매개변수 값);
-> 물론 부모클래스에 매개변수 생성자가 있어야한다.
5. 호출 순서는 자식 클래스 → 부모 클래스, 실행 순서는 부모 클래스 → 자식 클래스
상속 사용 예시
class human {
String name;
int age;
int money = 100;
void action() {
System.out.println("나의 이름은 " + name + "입니다.");
System.out.println("나의 나이는 " + age + "입니다.");
}
}
class human1 extends human {
int money = 0;
void InMoney(){
System.out.println("홍길동의 상속받기 전 돈은 " + money + "원 입니다.");
money = super.money;
System.out.println("홍길동의 상속받은 후 돈은 " + money + "원 입니다.");
}
}
class human2 extends human {
int money = 20;
void InMoney(){
System.out.println("이순신의 상속받기 전 돈은 " + money + "원 입니다.");
money = super.money;
System.out.println("이순신의 상속받은 후 돈은 " + money + "원 입니다.");
}
}
class human3 {
}
public class Inheritance {
public static void main(String[] args) {
human1 h1 = new human1();
human2 h2 = new human2();
human3 h3 = new human3();
h1.name = "홍길동";
h1.age = 21;
h1.action();
h1.InMoney();
System.out.println();
h2.name = "이순신";
h2.age = 23;
h2.action();
h2.InMoney();
//h3.name = "강감찬";
//h3.age = 32;
//h3.action();
}
}
human이라는 부모클래스로 부터 name과 age를 상속받았기 때문에 human1, human2객체는 별도의 변수 생성 없이 name과 age를 사용하여 이름과 나이를 지정했다.
하지만 human3는 human을 상속하지 않았기 때문에 주석된 코드를 작성 시 컴파일 오류가 발생한다.
또한 InMoney메소드를 통해 객체 변수 money에 부모클래스의 money를 저장하여 출력하였다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java]접근 지정자 (0) | 2021.04.06 |
---|---|
[Java]Getter와 Setter (0) | 2021.04.02 |
[Java]static (0) | 2021.03.30 |
[Java]import (0) | 2021.03.30 |
[Java]패키지 (0) | 2021.03.30 |