상속(Inheritance)는 상위클래스가 하위클래스의 개념을 확장, 세분화하는 의미이다
위에 그림을 보면 동물이라는 부모클래스가 존재한다
이 부모클래스에서 자식클래스 포유류와 조류를 만들어 개념을 확장, 구체화를 시켰고
여기서 포유류클래스는 고래, 박쥐, 조류클래스는 참새, 닭 클래스를 만들어서
한번 더 개념을 확장, 구체화를 시켰다
즉 상속은 이름만 상속(inheritance)지 사실은 확장(extedns)이 맞다
그리고 그에 맞게 자바에서 상속을 선언할때 extends를 이용한다
간단하게 “하위클래스는 상위클래스이다”와
“하위클래스는 상위클래스의 한 분류이다”를 만족해야한다
ex) 조류는 동물이다, 고래는 포유류이다, 고래는 동물이다
class 부모 클래스명 {
}
class 자식 클래스명 extends 부모 클래스명 {
}
상속은 부모클래스의 개념을 자식클래스가 확장하는 것이기때문에
부모클래스의 변수와 메서드들을 사용할 수 있다
class 동물 {
String myClass;
동물() {
myClass = "동물";
}
public void showMe() {
System.out.println(myClass);
}
}
class 조류 extends 동물 {
조류() {
myClass = "조류";
}
}
class 참새 extends 조류 {
참새() {
myClass = "참새";
}
}
public class AnimalTest {
public static void main(String[] args) {
동물 animal = new 동물();
조류 bird = new 조류();
참새 sparrow = new 참새();
animal.showMe; //동물
bird.showMe; //조류
sparrow.showMe; //참새
}
}
상위클래스인 동물클래스의 변수인 myClass와 메서드 showMe를 재사용했기때문에
하위클래스 조류, 참새클래스에서 해당 변수와 메서드가 사용가능했다,
또한 상속은 상위클래스의 확장의 개념이기때문에
객체를 선언할때 자료형을 상위클래스로 넣어도 같은 값이 나오게 된다
public class AnimalTest {
public static void main(String[] args) {
동물 animal = new 동물();
동물 bird = new 조류();
동물 sparrow = new 참새();
animal.showMe; //동물
bird.showMe; //조류
sparrow.showMe; //참새
//그리고 해당 객체들을 하나의 배열에 넣을수도 있다
동물[] animals = new 동물[3];
동물[0] = new 동물();
동물[1] = new 조류();
동물[2] = new 참새();
for(동물 a : animals) {
animals.showMe;
}
//동물 조류 참새
}
}
상속에서 생성자를 호출할때 무조건 상위클래스의 생성자를 호출해야한다
하지만 우리가 하위클래스의 생성자를 만들때 상위 클래스의 생성자를 호출한 적이 없는데
코드가 정상적으로 돌아간다. 이유는 바로 super();가 생성자 안에 기본으로 들어가있기 때문이다
class Shape {
protected int shapeX;
public Shape() {
shapeX = 100;
}
public void showShape() {
System.out.println(shapeX);
}
}
class Rect extends Shape {
protected int rectX, shapeX;
public Rect() {
super();
rectX = 200;
shapeX = 300;
}
public void showRect() {
System.out.println(rectX + ", " + super.shapeX + ", " + this.shapeX);
}
}
public class SuperThis {
public static void main(String[] args) {
Rect rect = new Rect();
rect.showShape();
rect.showRect();
}
}
//결과 : rectX super.shapeX this.shapeX
// 200 100 300
위의 코드에서 Rect생성자 안에 super()를 선언해주었다. 사실 선언을 안해도 기본으로 들어가있다
이 super()는 상위 클래스의 생성자를 가져오기때문에 상위 크래스가 호출이되게된다
또한 Rect클래스레서 Shape클래스의 데이터를 사용하고 확장시킬 수 있다
위의 코드에서 Rect클래스 shapeX의 값을 재할당시켰다
이렇게되면 Shape클래스의 Rect클래스 변수의 값이 중복되는데
여기서 this와 super를 이용해 변수를 가리킬수있다
System.out.println(rectX + ", " + super.shapeX + ", " + this.shapeX);
super.shapeX는 상위클래스 Shape를 가리키고 this.shapeX는 하위클래스 Rect을 가리키므로
결과는 100, 300 각각 다르게 나온다