상속(Inheritance) 에 관한 사용방법임.
00_1. 상속을 하기전에 이번에는 Typing하지말고
'마우스오른쪽버튼' -> 'Sources -> 'Generate Getters and Setters...' 를 눌러서 만들어보자.
'toString()'메소드도 마우스를 이용해서 만들어보자.
00_2. 객체를 만들고 객체를 출력시키면 toSrting()메소드가 작동하여 출력된다.
01_1. 상속을 할때에는 접근권한을 'protected'로 변수들을 보호해줘서 상속받는 클래스에서 사용가능하게
만들어줌. 또한, 상속받는 클래스에서는 'extends' 를 붙여 클래스를 상속받는다.
01_2. 출력을 해보면 'sc'객체를 만들어서 'I am SportsCar'가 출력되려고하는데 상속받은 것이있어서
부모클래스의 'I am Car' 가 먼저 출력되는 것을 확인할 수 있다.
02_1. data 값을 지정해주고 변수/ this.변수/ super.변수/ 값들을 비교해보자.
02_2. 'print()'함수내에 있는 data값이 '200.34'이므로 그대로 출력이된다.
this.data 는 그 함수내에 있는-this- data값이므로 이것역시 '200.34' 가 출력된다.
super.data 는 부모클래스의 있는 data 값이므로 '100' 이 출력된다.
03_1. 생성자에 파라미터값을 지정하고 출력을 하면 기본생성자로 출력이 됨을 볼 수 있다.
부모클래스를 불러오지 않았기 때문에 'default' 인 생성자로 호출되는 것이기 때문이다.
03_2. 출력물 어디에도 'I am a SportsCar with sth'을 찾아볼 수 없다.
※. 코드
class Car {
protected String color; // 상속받는 애들도 볼 수 있게 접근권한을 protected로 준다.
protected int speed;
protected String name;
int data = 100; // 변수의 override를 테스트하기 위한 Package변수.
public Car()
{
/* this.color = "UnknownColor";
this.name = "Unknown";
this.speed = (int) (Math.random() * 100); */
this("Unknown", "UnknownColor"); // 밑에 코드에 Unknown UnknownColor를 넣으면 똑같아 지기때문에 이렇게 사용해도 된다.
// this() 메소드는 코드의 맨 처음에 와야만 한다.
System.out.println("I am Car");
}
public Car(String name, String color) { // 생성자
this.color = color;
this.name = name;
this.speed = (int) (Math.random() * 100);
}
/* Getters and Setters */
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void print()
{
System.out.println("car.print() 마음에 안드는 코드");
}
@Override
public String toString() {
return "Car [color=" + color + ", speed=" + speed + ", name=" + name + "]";
}
}// Car Class
class SportsCar extends Car {
private boolean turbo = false;
//int data = 200; // for variable override temporary.
double data = 200.34; // 변수는 데이터타입이 달라도 이름만 같으면 overriding 된다.
public SportsCar()
{
//super(); // super(); 메소드 역시 코드의 맨 위에 위치해 있어야 한다.
super("BMW", "YELLOW"); // Car(String , String ); 를 의미.
System.out.println("I am SportsCar");
}
public SportsCar(String name, String color)
{
// super(name, color);
// ㄴ 부모(super)를 지정하지 않으면 무조건 default constructor를 호출한다.
System.out.println("I am SportsCar with sth");
}
@Override
public void print() {
super.print(); // 메모리에 가지고 있음을 확인 할 수 있다.
System.out.println("sportscar print() 재정의");
System.out.println("data = "+ data); // 200 예상
System.out.println("this.data = "+ this.data); // 200 예상
System.out.println("super.data = "+ super.data); //100 예상
}
public boolean isTurbo() {
return turbo;
}
public void setTurbo(boolean turbo) {
this.turbo = turbo;
}
@Override
public String toString() {
return "SportsCar [turbo=" + turbo + ", color=" + color + ", speed=" + speed + ", name=" + name + "]";
}
}// SportsCar Class
public class Test {
public static void main(String[] args) {
Car taxi = new Car("taxi", "RED");
Car bus = new Car("bus", "BLUE");
System.out.println(taxi);
System.out.println(bus);
SportsCar sc = new SportsCar();
System.out.println(sc);
sc.print();
}// main
}// Main Class