인터페이스란?
일종의 추상클래스이나 추상클래스보다 추상화 정도가 높아서 오직 추상메서드와 상수만을 멤버로 가질 수 있음. (일반 메서드나 멤버변수 등 어떠한 요소도 허용되지 않음)
interface 인터페이스이름{
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
→ 모든 멤버변수는 public static final 이어야하며 생략 가능.
→모든 메서드는 public abstract 이어야하며 생략 가능.
(단, JDK1.8부터 static 메서드와 디폴트 메서드는 예외)
cf. 인터페이스의 이름
: 주로 able로 끝나는 경우가 많음
= 어떠한 기능 또는 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해. 또한 해당 인터페이스를 구현한 클래스는 ~를 할 수 있는 능력을 갖추었다는 의미.
인터페이스 자체로는 인스턴스 생성 불가.
추상클래스와 마찬가지로 정의된 추상메서드의 몸통을 만들어주는 클래스 작성.
extends가 아닌 implements 사용(구현한다는 의미)
class 클래스이름 implements 인터페이스이름{}
class Fighter implements Fightable{
public void move(int x, int y){ .....}
public void attack(Unit u) {.....}
}
→ 인터페이스 메서드 중 일부만 구현한다면 abstract 붙여서 추상클래스로 선언.
→ 상속과 구현 동시에 가능
e.g. class Fighter extends Unit implements Fightable{}
⇒ 인터페이스를 이용한 다형성
인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조 가능.
인터페이스 타입으로 형변환도 가능
Fightable f = (Fightable) new Fighter();
// fightable 타입의 참조변수로는 인터페이스 fightable에 정의된 멤버들만 호출 가능.
→ 인터페이스 타입의 매개변수는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공.
class Fighter extends Unit implements Fightable {
public void move(int x, int y)
public void attack(Fightable f)
}
//attack 메서드 호출 시 매개변수로 fightable 인터페이스를 구현한 클래스의 인스턴스를 넘겨주어야함
//fightable을 구현한 fighter 클래스가 있을때 attack메서드의 매개변수로 fighter인스턴스 넘김
= attack(new Fighter())
Fightable method()
{
Fighter f = new Fighter();
return f;
}
// 메서드의 리턴타입으로 인터페이스의 타입 지정 가능.
// 리턴타입이 인터페이스 = 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스 반환
인터페이스는 인터페이스로부터만 상속 가능.
→ 클래스와 달리 다중 상속 가능. Object클래스처럼 최고 조상 없음.
interface Movable{
void move(int x, int y);
}
interface Attackable{
void attack(Unit u);
}
interface Fightable extends Movable, Attackable{}
디폴트 메서드란?
추상 메서드의 기본적인 구현을 제공하는 메서드로, 추상 메서드가 아니기 때문에 디폴트 메서드가 추가되어도 해당 인터페이스를 구현한 클래스 변경하지 않아도 됨.
→JDK1.8부터 인터페이스에 디폴트메서드와 static 메서드 추가 가능.
→ 추상메서드와 달리 일반 메서드처럼 몸통이 있어야함.
→ public 접근제어자
interface MyInterface{
void method();
public void newMethod(){}
}
** 새로 추가된 디폴트 메서드와 기존 메서드의 이름 중복 충돌 해결 규칙
여러 인터페이스의 디폴트 메서드간 충돌
→ 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩
디폴트 메서드와 조상 클래스의 메서드 간의 충돌
→ 조상 클래스의 메서드가 상속되고 디폴트 메서드는 무시.
인스턴스 생성하지 않고 사용가능한 메서드
https://www.notion.so/4b0cf3f6ff7549adb2951e27519fc0e6
특정 기능을 처리하는 내부 메서드의 경우 다른 인터페이스 혹은 클래스가 해당 메서드에 엑세스 하지 않도록 하기 위해 사용. (캡슐화 개념)
<private 메서드 구현 규칙>