- 부모로 부터 자식에게 상속
- 부모클래스(super class)의 멤버들을 자식클래스(child class)에서 자기가 선언한 것 처럼 사용하려 하는것
- 재사용성
- 클래스간의 공통요소(멤버)가 있다면 공통요소를 부모클래스로 작성 후 자식 클래스가 상속(확장) 해서 사용
- java는 단일 상속 만 허용
1. 공통요소를 재활용(추상화)
2. class 간의 관계를 설정
3. 생성자는 제외

상속 사용법

public class 자식클래스명 extends 부모클래스명 {}

public class SuperClass{}

public class ChildClass extends SuperClass{}

- 수직 관계만 관계 설정
- 수평은 관계가 없다

참조변수 super, super()

- 상속 보다는 확장의 개념
- 자식클래스의 객체를 생성 할 때 부모 객체를 생성하고 부모 객체를 확장해서 자신의 객체를 생성

1. super()
	- 자식의 생성자 내에서 사용
	- 부모의 생성자를 호출, 생략 가능
	- 생성자에 첫줄에 위치, this() super()를 같이 쓸 수 없음

2. 참조변수 super
	- 부모객체의 주소를 담고 있는 참조변수
	- 부모의 멤버변수, 멤버메서드 사용

추상클래스와 추상메서드

1. 추상클래스
	- 완성 되지 않은 클래스
	- 객체 생성 X
	- 상속(확장) 해서 완성 시켜서 사용
	- 데이터타입으로 선언은 가능 
	- 일반(구현) 클래스 처럼 멤버변수, 멤버메서드, 생성자, 추상메서드를 가질 수 있음
	- 클래스 내에 한 개 이상의 추상 메서드가 있으면 해당 클래스는 추상 클래스 선언

	접근지정자 abstract 클래스명 {}

2. 추상 메서드
	- 완성 되지 않은 메서드
	- 메서드의 선언부(header) 만 있는 메서드

	접근지정자 abstract 메서드명() ;

오버라이딩(OverRiding)

- 상속 받은 부모의 메서드를 자기 자신에 맞게 내용을 재정의 하는것
- 메서드의 선언부는 동일하게 선언(수정 X)
- 단, 접근지정자는 범위가 같거나 더 넓게 수정 가능

인터페이스 (Interface)

- 추상 클래스와 비슷
- 추상 클래스 보다 더 추상화가 심한 것
- 일종의 추상 클래스
- 상수와 추상메서드를 멤버로 가짐
- 객체 생성 (X)
- 구현(implements) 해서 오버라이딩 
- 메서드 이름의 표준화
- 관계가 없는 클래스간에 관계를 맺어 줄 때 사용
- 인터페이스는 다른 인터페이스를 상속 가능
- 인터페이스 구현은 다중 구현 이 가능

1. 인터페이스 선언
public interface 인터페이스명 extends 상속받을 인터페이스명 {
	//상수
	public static final 데이터타입 변수명
	//추상메서드
  //접근지정자는 무조건 public abstract
	public abstract 리턴타입 메서드명([매개변수 선언]);
	//public이나 abstract은 생략 가능

	public abstract void t1();
	int t2(String name); //public abstract int t2(String name);
	public void t3();    //public abstract void t3();
	abstract void t4();  //public abstract void t4();

	// java 8 이후 추가

	//default
	//default로 선언하면 메서드의 body를 작성 할 수 있다.
  //구현 클래스에서 오버라이딩 하지 않고 바로 사용 가능
	//구현 클래스에서 오버라이딩 해서 사용 가능
	default int t5(int a, int b){
			return a*b;
	}

	//static
	//static으로 선언 하면 메서드의 body를 작성 할 수 있다.
	// 호출은 클래스메서드와 마찬가지로 Interface명.메서드명()으로 사용 가능
	static void t6(){
		System.out.println("static");
	}

}

- 인터페이스의 이름은 클래스와 같이 첫글자는 대문자로

2. 구현 클래스에서 인터페이스 구현
public class 클래스명 implements 인터페이스명1, 인터페이스명2,...{

}

다른 클래스의 멤버를 내가 선언한 멤버처럼 사용하고 싶을 때