static final이 아닌 필드를 가질 수 있고 public / protected / private 모두 사용 가능
여러 개의 추상 클래스를 상속 받을 수 없음(클래스 간 다중 상속x)
클래스 간, 인터페이스 간 상속은 extends 키워드 사용
추상 클래스의 장점
공통 부분을 구현 / 설계함으로 개발, 유지보수 용이
자식 클래스에게 추상 메서드를 반드시 구현하도록 강요함으로 표준화 정도를 높임
// Abstract Class/Method ex)
abstract class Animal { // abstract class로 추상 클래스 선언
int position;
// abstract method => 선언부만 작성
// 접근제한자와 abstract의 순서는 상관x
public abstract void speak();
void run() { // 일반 메서드 작성 가능
position++;
}
}
public class Cat extends Animal { // 추상 클래스를 상속
public void speak() { // 추상 메서드 구현
System.out.println("야옹");
}
}
인터페이스(Interface)
인터페이스(interface): 추상 클래스와 비슷하게 다른 클래스 작성을 돕는 목적
추상 클래스보다 추상화 정도가 높아 일반 메서드 / 변수 등을 가질 수 없음
구현된 것이 아무것도 없는기본 설계도
interface로 선언, static final 변수와 추상 메서드의 집합
모든 메서드는 public abstract로 선언해야한다.
모든 멤버 변수는 public static final로 선언해야한다.
둘 다 컴파일 시 자동 생성되므로 생략 가능
인터페이스는 다중 상속을 지원, implements
선 extends 후 implements
디폴트 메서드(Default Method)
인터페이스에 있는 구현 메서드, default로 선언+ 구현부 존재
java 8 이후디폴트 메서드의 등장으로 추상 메서드만 존재할 수 있던 인터페이스에 구현 메서드도 존재
객체지향 5대 원칙 중 하나인 개방 폐쇄 원칙(OCP)으로 인해 생겨남
인터페이스에 추상 메서드를 추가시 모든 구현체에 구현을 해줘야하는 문제점을 디폴트 메서드를 사용해 추가 변경을 막아줌 => OCP에서 확장에 개방되어 있고, 변경에 닫혀있는 코드를 설계할 수 있게 됨
// Interface ex)
public interface Person {
// public static final 생략 가능
public static final int eyes = 2;
// public abstract 생략 가능
public abstract void talk();
// default 메서드
default void defaultMethod() {
...
}
}
public class Heebum implements Person { // 인터페이스 상속
public void talk() { // 추상 메서드 구현
...
}
}