참고 도서
Do it 자바 완전정복
추상 메서드는 '메서드의 본체가 완성되지 않은 미완성 메서드' 를 말한다.
abstract 리턴 타입 메서드명(입력매개변수);
abstract void save();
추상 메서드를 1개 이상 포함하고 있는 클래스는 반드시 추상 클래스로 정의 돼야한다.
abstract class Test{
abstract void save();
void read();
// ...
}
추상 클래스는 내부의 미완성 메서드 때문에 객체를 직접 생성할 수 없다.
abstract class A{
abstract void save();
}
class B extends A{
void save(){
System.out.println("save");
}
}
A a = new A(); //X
A a = new B(); //O
추상 클래스의 객체를 생성하는 방법은 자식 클래스의 생성 여부에 따라 2가지로 나뉜다.
abstract class A{
abstract void save();
}
class B extends A{
void save(){
System.out.println("save");
}
}
A a = new A(); //X
A a = new B(); //O
A a = new A() {
void save(){
}
}
인터페이스는 내부의 모든 필드가 public static final로 정의되고, static과 default 이외의
모든 메서드는 public abstract로 정의된 객체지향 프로그래밍 요소다.
interface 인터페이스명{
public static final 자료형 필드명 = 값;
public abstract 리턴 타입 메서드명();
}
interface A{
public static final int a = 2;
public abstract void save();
}
제어자가 확정돼 있으므로 필드와 메서드 앞에 제어자를 생략해도 컴파일러가 자동으로 각각의
제어자를 삽입한다.
인터페이스를 상속할 때는 implements 키워드를 사용한다. 가장 큰 특징은
다중 상속이 가능하다는 것이다.
클래스명 implements 인터페이스명, 인터페이스명 {
}
다중 상속이 가능한 이유는 모든 필드가 public satic final로 정의돼 있어 실제 데이터값은 각각의 인터페이스 내부에 존재해 공간상 겹치지 않기 때문이다.
클래스와 인터페이스를 동시에 상속하려면
클래스명 extends 클래스명 implements 인터페이스명{
//내용
}
이렇게 사용하면 된다.
인터페이스도 추상 메서드를 포함하고 있으므로 객체를 직접 생성할 수 없다.
각각의 방법은 인터페이스를 상속한다는 것을 제외하고 추상 클래스의 객체 생성 방법과 같다.
interface A{
void save();
}
class B implements A{
void save(){
System.out.println("save");
}
}
A a = new A(); //X
A a = new B(); //O
A a = new A() {
public void save(){
}
}