abstract
를 앞에 붙이면 된다.메서드의 선언부만 작성하고 구현부{}블럭이 없다.
설계만 해두고 실제 수행될 내용은 작성하지 않는다.
abstract 추상메서드명(매개변수는 넣을 수 있음);
이게 끝. {}블럭 없다.
추상클래스를 상속받는 클래스는 추상메서드를 모두 오버라이딩을 통해 완성시켜야 한다.
상속받은 모든 추상메서드를 완성하지 못하면 해당 클래스는 abstract를 붙여 추상클래스가 된다.
구현부만 없을 뿐이지 다른 메서드에서 호출은 가능하다.
: 추상메서드의 집합. 구현된 것이 전혀 없는 설계도. 모든 멤버가 public.
일반 메서드와 멤버변수(인스턴스 변수, 클래스 변수)는 가질 수 없고
추상메서드와 상수(final)만 가질 수 있다.
였지만 java1.8부터 defalut메서드와 static(정적)메서드를 인터페이스에서 쓸 수 있다.
인터페이스의 모든 멤버변수는 public static final이며, 생략 가능하다.
인터페이스의 모든 메서드는 public abstract이어야 하며, 생략 가능하다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; // 상수
public abstract 메서드이름(매개변수목록); // 추상 메서드
}
인터페이스를 이용하여 개발코드를 직접 수정하지 않고도 사용하고 있는 객체만 변경할 수있도록
인터페이스의 장점 : 두 객체간 연결을 돕는 중간다리 역할. 선언(설계)와 구현을 분리.
개발시간단축. 표준화. 독립적인 프로그래밍 가능. 서로관계없는 클래스들에게 관계를 맺어줄 수 있음.
느슨한 결합 : 인터페이스를 사용하면 클래스간 관계를 느슨하게 유지할 수 있다.
클래스간 관계가 느슨하면 다른 클래스로 교체할 때, 수정할 코드가 줄어든다.
인터페이스는 인터페이스만 조상으로 둘 수 있다. 클래스처럼 Object가 최고 조상이 아니다.
추상메서드는 상속받으면서 구현부를 작성하기때문에 충돌해도 상관없어 다중상속이 가능하다.
class 클래스이름 implements 인터페이스이름 {...}
클래스에서 implements
키워드를 통해 미완성상태인 인터페이스를 오버라이딩으로 구현한다.
만약 인터페이스를 상속받은 클래스에서 구현을 다 못한다면 미완성인 클래스로 취급하기 때문에 해당 클래스는 abstract를 붙여 추상클래스가 된다. (추상클래스는 구현 부담이 적다.)
즉, 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다.
interface Fightable extends Movable, Attackable {
String getName();
Fightable getFighter(String name); // 반환 타입이 인터페이스인 Fighter를 반환하는 추상 메서드
}
// class Fighter implements Fightable 일때
Fightable f = new Fighter(); // new앞에 (Fightable)은 생략 가능.
java 1.8에서 인터페이스가 추상메서드 외에 static메서드와 default메서드를 사용할 수 있게 되었다. private메서드는 java9버전에 인터페이스에서 사용가능하게 되었다.
default 메서드 : 추상메서드가 아니라 기본 구현을 가지는 메서드. 접근제어자 default아님.
구현하는 클래스에서 재정의를 할 수 있다. 접근제어자는 항상 public이다.
이미 운영중인 프로그램에 새로운 기능을 추가하려고 할 때, 추상메서드로 구현을 하면 구현을 완료한 클래스는 추가된 추상메서드를 강제로 구현해야하는 비효율이 생긴다.
그래서 이미 운영되고 있는 시스템에서 추가요건으로인해 불가피하게 반영을 해야 할 때 디폴트 메서드를 쓰면 효과적이다.
static 메서드 : 클래스 메소드와 동일하게 사용 가능하다. 인터페이스명.메서드명()
private 메서드 : 인터페이스 내에서 사용하기 위해 구현한 메서드로 구현하는 클래스에서 재정의를 할 수 없다.