상속(inheritance)
- 두 클래스간의 관계를 의미하며 상속을 주는 클래스(super, 상위 클래스)가 상속을 받는 클래스(sub, 하위 클래스)에 멤버들을 자유롭게 사용할 수 있게 해줍니다.
- 하위 클래스에서 상위 클래스의 멤버를 사용할 대 인스턴스를 생성하지 않고 사용이 가능합니다.
- 단, 자바에서의 상속에서는 단순히 코드의 재활용성에 초점을 두면 안됩니다.
- 자바에서의 상속은 단일 상속(한 클래스에서만 상속받음)만을 지원합니다.
- 상속의 목적은 삭속관계의 클래스들을 공통적인 규약으로 묶기 위해 상속을 합니다.
- 자바의 모든 클래스는 상속 관게에 속해 있습니다.
모든 클래스는 자동으로 java.lang.Object 클래스를 상속받고 있습니다.
- 문법
class 하위클래스명 extends 상위클래스명{
// extends 키워드를 통해 상위 클래스를 상속받게 됩니다.(하나의 클래스만 상속가능)
하위클래스 생성자(){
super();
// 하위 클래스 생성자의 첫 줄에서 무조건 상위 클래스의 생성자를 호출해야합니다.
// 하위 클래스 생성자가 생략되었으면 자동으로 상위 클래스의 default 생성자가 호출됩니다
- private으로 선언된 상위 클래스의 멤버는 상속은 되지만 하위 클래스에서 접근을 할 수는 없으며, 접근하기 위해서는 메소드를 통해 접근해야 합니다.
- 상속의 단계가 몇 단계이든 상관없이 상위 클래스의 멤버에 접근 할 수 있습니다.
- 클래스멤버(static)도 상속이 되어 하위클래스에서도 공유할 수 있습니다.
.
.
예제1
class Man
{
private String name;
public Man(String name){ this.name = name; }
public void tellYourName(){
System.out.println("My name is " + name);
}
}
class BusinessMan extends Man // extends Man : Man크르래스를 상속 받음(private을 제외한 모든 멤버 사용가능)
{
private String company, position;
public BusinessMan(String name, String company, String position){
super(name);
// 상위 클래스의 생성자 호출이며, 반드시 하위 클래스 생성자의 처 줄에 존재해야함.
// 생략하면 자동으로 상위클래스의 default 생성자를 호출하며, 다른 생성자가 있으면 default 생성자가 없으므로 생략 불가.
this.company = company;
this.position = position;
}
public void tellYourInfo(){
System.out.println("My company is " + company);
System.out.println("My position is " + position);
tellYourName();
// 상속받앗으므로 사위 클래스의 멤보를 자유롭게 사용
}
}
class BasicInheritance
{
public static void main(String[] args)
{
BusinessMan man1 = new BusinessMan("Kim", "Hybrid 3D ELD", "Staff Eng.");
BusinessMan man2 = new BusinessMan("Lee", "Hybrid 3D ELD", "Assist Eng.");
System.out.println("1st man info............");
man1.tellYourName(); // 상위 클래스의 메소드도 자유롭게 사용가능
man1.tellYourInfo();
System.out.println("2nd man info............");
man2.tellYourName();
man2.tellYourInfo();
}
}
.
.
예제2
class Car{
int gasolineGauge;
public Car(int gasolineGauge){ this.gasolineGauge = gasolineGauge; }
}
class HybridCar extends Car{
int electricGauge;
public HybridCar(int gasolineGauge, int electricGauge){
super(gasolineGauge);
this.electricGauge = electricGauge;
}
}
class WaterCar extends HybridCar{
int waterGauge;
public WaterCar(int gasolineGauge, int electricGauge, int waterGauge){
super(gasolineGauge, electricGauge);
this.waterGauge = waterGauge;
}
public void showCurrentGauge(){
System.out.println("잔여 가솔린 : " + gasolineGauge);
// 두 단계를 거치는 상속도 자유롭게 멤버들을 사용할 수 있음
System.out.println("잔여 전기량 : " + electricGauge);
System.out.println("잔여 워터량 : " + waterGauge);
}
}
class InheriConstructor {
public static void main(String[] args) {
WaterCar wc1 = new WaterCar(5, 7, 9);
wc1.showCurrentGauge();
WaterCar wc2 = new WaterCar(4, 3, 6);
wc2.showCurrentGauge();
}
}
728x90
반응형
'Java > 본격 Java 상속' 카테고리의 다른 글
[Java] 오버라이딩(overriding) (0) | 2020.06.30 |
---|---|
[Java] 상속 has-a관계 (0) | 2020.06.29 |
[Java] 상속 is-a관계 (0) | 2020.06.29 |
[Java] static 상속 (0) | 2020.06.29 |
[Java] 상속 실습 (0) | 2020.06.29 |