파생(derive)
- 파생이란 기존 자원을 상속inheritence한 새로운 클래스를 만드는 것이다.
- 파생시에는 부모 클래스의 필드나 메소드를 추가하거나 덮어쓸 수 있다.
- 파생하려면 'extends 부모클래스명' 을 클래스 이름 뒤에 명시하여야 한다.
- super()은 부모 클래스의 생성자를 호출한다.
- 자식 클래스의 생성자에서 super()을 명시적으로 선언하지 않으면 부모 클래스의 '인수를 받지 않은 생성자'가 자동 생성된다.
다음의 자동차 클래스 Car에 총 주행거리를 나타내는 필드와 그 값을 확인하는 메서드를 추가해서 ExCar 클래스를 작성하자. Car 클래스에서 파생시킬 것.
- ExCar 메서드에서 totalMileage (총 주행거리) 필드 추가
- 총 주행거리 getter, putSpec 메서드에 totalMileage 필드 반영 수정
- move 메서드에서 이동거리만큼 totalMileage 필드에 반영
- Day 클래스는 이전 포스트 "Java13 클래스 생성자 다중 생성" 참고
Car 클래스
class Car{
private String name;
private int width; //폭
private int height; //높이
private int length; //길이
private double x; // x좌표
private double y; //y좌표
private double fuel; //남은 연료
private Day purchaseDay;
Car(String name, String number, int width, int length, int height, double tankage, double fuel, double mileage, Day purchaseDay){
this.name = name;
this.width = width;
this.height = height;
this.length = length;
this.x = 0; this.y = 0;
this.fuel = fuel;
x = y = 0.0;
this.purchaseDay = new Day(purchaseDay);
} // Car 생성자
public double getX() {return this.x;}
public double getY() { return this.y;}
public double getFuel() {return this.fuel;}
public Day getPurchaseDay() {
return new Day(this.purchaseDay);
}
public void putSpec() {
System.out.println("이름: "+ name);
System.out.println("전폭: "+ width+"mm");
System.out.println("전고: "+ height+"mm");
System.out.println("전장: "+ length+"mm");
}
public void getSpec() {
System.out.println("자동차명: "+ this.name);
System.out.println("자동차넓이: "+ this.width);
System.out.println("자동차높이: "+ this.height);
System.out.println("자동차길이: "+ this.length);
} //getSpec
public boolean moveCar(double x, double y) {
this.x += x; this.y += y;
double distance = Math.sqrt(x*x + y*y);
if( distance > fuel) return false;
else{
fuel -= distance;
x += x;
y += y;
return true; // 이동 완료
}
} //moveCar
} //Car 본체
ExCar 클래스
public class ExCar extends Car{
private double totalMileage; // 총 주행거리
// --- 생성자 --- //
public ExCar ( String name, int width, int height, int length, double fuel, Day purchaseDay) {
super(name, width, height, length, fuel, purchaseDay);
totalMileage = 0.0;
}
public double getTotalMileage() { // 총 주행거리 확인
return totalMileage;
}
public void putSpec() { // 사양 표시
super.putSpec();
System.out.printf("총 주행 거리: %.2fkm\n", totalMileage);
}
// Move
public boolean moveCar(double x, double y) {
double distance = Math.sqrt(x*x + y*y);
if (!super.moveCar(x, y))
return false;
else {
totalMileage += distance;
return true;
} // else
} //moveCar
} // ExCar
실행 클래스
public static void main(String[] args) {
ExCar myCar = new ExCar("Genesiss", 1845, 1500, 5300, 90.0, new Day());
System.out.printf("현재 위치: (%.2f, %.2f)\n", myCar.getX(), myCar.getY());
System.out.printf("남은 연료: %.2f l\n", myCar.getFuel());
System.out.printf("구입일: %s\n", myCar.getPurchaseDay().getString());
}
결과
현재 위치: (0.00, 0.00)
남은 연료: 90.00 l
구입일: 2020.4.29