상자 하나하나는 모두 객체(Object)이고, 자바 용어로는 Class이다.
이러한 계층을 표현하기 위해 만들어진 것이 상속이다.
상속 시, 하위 객체(자식)은 상위 객체(부모)의 특징(메서드, 변수 등)을 물려받게 된다.
이 때, 상위 객체(부모)의 특징(메서드, 변수 등)을 '새롭게 구현'하는 것인지, '그대로 사용'하는 것인지에 따라 상속의 형태가 갈리게 된다.
상속의 대표적인 형태
모든 선언/정의를 부모가 하며, 자식은 오버라이딩 할 필요 없이 부모의 메서드/변수를 그대로 사용할 수 있다.
물론, 필요에 따라 오버라이딩 가능하다.
class Vehicle {
protected int speed = 3;
public int getSpeed(){
return speed;
}
public void setSpeed(int speed){
this.speed = speed;
}
}
class Car extends Vehicle{
public void printspd(){
System.out.println(speed);
}
}
public class ExtendsSample {
public static main (String[] args){
Car A = new Car();
System.out.println(A.getSpeed());
A.printspd();
}
}
위에서 Car 클래스는 Vehicle 클래스의 변수와 메서드를 상속 받았다.
따라서, Car 클래스는 Vehicle 클래스의 speed
, getSpeed()
, setSpeed()
을 사용할 수 있다.
하지만, Java는 "다중 상속"을 지원하지 않기 때문에 부모 클래스가 2개이상 존재 할 수는 없다.
대신에 implements를 사용해 여러 interface를 상속받을 수 있다.
부모는 선언만 하며, 반드시 자식이 정의를 오버라이딩해서 사용해야 한다.
interface TestInterface{
public static int num = 8;
public void fun1();
public void fun2();
}
class InterfaceExam implements TestInterface{
@Override
public void fun1(){
System.out.println(num);
}
@Override
public void fun2() {
}
}
public class InterfaceSample{
public static void main(String args[]){
InterfaceExam exam = new InterfaceExam();
exam.fun1();
}
}
추가적으로, abstract라는 것도 있다.
extends와 interface의 혼합이다.
extends를 사용하지만, 몇 개는 추상 메서드로 구현이 되어있는 형태이다.
extends는 클래스 한 개만 상속 받을 수 있으며, 자식 클래스는 부모 클래스의 기능을 사용할 수 있다.
implements는 여러 개의 interface를 상속 받을 수 있으며, 자식 클래스는 부모의 기능을 무조건 다시 정의해서 사용해야 한다.