본문 바로가기

Java/본격 Java 상속

[Java] 상속 기초

상속(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