
이러한 계층을 표현하기 위해 만들어진 것이 상속
하위 객체는 상위 객체의 특징을 물려받는다.
상위 객체의 메소드 또는 변수를 ‘구현’하는가 그대로 ‘사용’하는가에 따라서 상속의 형태가 갈리게 된다.
1. extends
부모의 선언 / 정의를 모두하며 자식은 메소드 / 변수를 그대로 사용할 수 있음
2. implements(interface 구현)
부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩(재정의)해서 사용해야함
3. abstract
extends와 interface 혼합. Extends하되 몇 개는 추상 메소드로 구현되어 있음
추상 메소드란?
자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드
자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함한 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하기 위함이다.
abstract 반환타입 메소드이름();
extends가 상속의 대표적인 형태이다.
부모의 메소드를 그대로 사용할 수 있으며 오버라이딩할 필요 없이 부모에 구현되어있는 것을 직접 사용 가능하다.
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();
}
}
하나 짚고 가자면
자바는 “다중 상속”을 지원하지 않는다.
다중 상속이란 부모 클래스가 두 개 이상 존재할 수 있다는 것인데, 자바에서는 이를 지원하지 않는다.
자바에서는 다중 상속을 지원하지 않지만, 이를 해결하기 위해 implements(인터페이스)가 등장했다.
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();
}
}
implements의 가장 큰 특징은 부모의 메소드를 반드시 오버라이딩(재정의)해야 한다.
Implements는 다중상속을 대신해준다.
public class Son implements Father, Mother {...}
오버라이딩이란 부모-자식 상속 관계에 있는 클래스에서 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것
오버로딩은 같은 클래스 내에서 이름이 같지만, 매개변수의 개수나 타입이 다른 메소드를 선언하는 것