상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.
이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.
상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.
이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고도 한다.
그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고도 한다.
클래스 간의 상속은 여러 개의 부모의 정보를 상속하는 다중 상속 방식을 제외하고는 모두 허용하고 있다.
주로 다단계 상속, 계층적 상속 두 가지 방식이다.
부모 클래스를 통해 자식, 손자까지 내려가는 방식을 다단계 상속,
하나의 부모가 여러 개의 자식을 가지는 것을 계층적 상속이라고 한다.
예를 들어 만약, 상속받은 여러 개의 부모 클래스들에서 동일한 명칭의 필드나 메소드가 있으면?
위와 같은 모호함이 발생한다.
//부모 클래스 생성
class 부모{
}
//부모 클래스 상속
class 자식 extends 부모{
}
자바에서 상속은 extends라는 키워드를 통해 할 수 있다.
위와 같이 상속받을 자식 클래스 뒤에 extends 키워드를 사용하고 부모 클래스를 적어주면 된다.
class People{
//필드(Feild)
String name; //이름
int age; //나이
//메소드(Method)
public void printMyself(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
class Student extends People{
//필드(Field)
int my_grade; //내 학년
//생성자(Constrouct)
Student(String name, int age, int my_grade){
super.name = name; //부모 필드
super.age = age; //부모 필드
this.my_grade = my_grade;
}
//메소드(Method)
public void printGrade() {
System.out.println("내 학년 : " + my_grade);
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("송민혁", 26, 4);
student.printMyself(); //부모 메소드 호출
student.printGrade(); //자식 메소드 호출
}
}
super 키워드는 자식 클래스에서 부모 클래스를 가리킬 때 사용하는 키워드이다.
주로 부모 클래스의 필드에 접근, 메소드를 호출할 때 사용한다.
상속을 하더라도 자식 클래스가 부모의 모든 것들을 물려받는 것은 아니다.
필드나 메소드의 접근제어자가 public이거나 protected일 때만 상속이 가능하다.
자바에서 인터페이스는 클래스들이 필수로 구현해야 하는 추상 자료형이다.
쉽게 말하자면 객체의 사용방법을 가이드라인 하는 것이라고 생각하시면 이해가 쉽다.
자바의 인터페이스는 추상 메서드와 상수로만 이루어져 있다. 구현된 코드가 없기 때문에 당연히 인터페이스로 인스턴스도 사용할 수 없다.
다중 상속 가능
인터페이스는 껍데기만 존재하여 클래스 상속 시 발생했던 모호함이 없다. 고로 다중 상속이 가능.
추상 메서드와 상수만 사용 가능
인터페이스에는 구현 소스를 생성할 수 없다. 고로 상수와 추상 메서드만 가질 수 있다.
생성자 사용 불가
인터페이스 객체가 아니므로 생성자를 사용하실 수 없다.
메서드 오버라이딩 필수
자식클래스는 부모 인터페이스의 추상 메서드를 모두 오버라이딩해야 한다.
자바에서 인터페이스를 선언할 때는 interface라는 키워드를 붙여서 만들면 된다.
단 이렇게 interface라는 키워드를 붙여 인터페이스로 만들게 되면 오직 implements라는 키워드를 통해 객체들을 구현하는 용도로만 사용이 가능하다.
또한 인터페이스에는 구체적인 대상을 생성할 수 없고 오로지 상수와 추상 메서드만 사용할 수 있다.
이 메서드는 추상 클래스에서 껍데기만 생성하고 상속하는 자식 클래스에서 오버라이딩하여 사용한다.
출처
https://coding-factory.tistory.com/865
https://coding-factory.tistory.com/867