자바의 인터페이스에 대해 학습하세요.
인터페이스 정의하는 방법
인터페이스 구현하는 방법
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
인터페이스 상속
인터페이스의 기본 메소드 (Default Method), 자바 8
인터페이스의 static 메소드, 자바 8
인터페이스의 private 메소드, 자바 9
Java에서 interface란 추상화를 달성하는 방법 중 하나이다.
일종의 추상클래스 라고도 하지만, 인터페이스는 추상클래스처럼 추상메서드를 가지지만 추상클래스보다 추상화의 정도가 높아서 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다.
추상클래스가 미완성 설계도라고 하면 인터페이스는 밑그림만 그려져 있는 기본 설계도 라고 볼 수 있다.
interface 인터페이스이름{
public static final <타입> <이름> = <값>;
public abstact 메서드이름(매개변수목록);
}
아까 말한 거 처럼 인터페이스는 오로지 추상 메서드
, 상수
만을 포함할 수 있다.
예약어로 class 가 아닌 interface 키워드를 사용한다.
그리고 interface에도 클래스와 같이 접근제어자를 사용할 수 있다.(public, default)
모든 멤버변수는 public static final 이어야 하고, 이를 생략할 수 있다
모든 메서드는 public abstract 이어야 하고, 이를 생략할 수 있다, 단 static 메서드와 default 메서드 제외(자바8부터)
생략된 제어자는 컴파일러가 자동적으로 추가해준다.
인터페이스도 추상클래스 처럼 그 자체로는 인스턴스를 생성할 수 없다.
추상클래스가 상속을 통해 추상메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 하는데 그 방법은 추상클래스와 같다.
단, 키워는 extends
가 아닌 구현한다는 의미의 implements
를 사용한다.
class <클래스이름> implements <인터페이스 이름>{
@Overriide
public String 메서드이름(){
return "ok";
}
}
선언 후에는 interface에서 선언한 메서드들을 Override를 통해 정의해야 한다.
다형성에 의해 자손클래스의 인스턴스를 조상타입의 참조변수로 참조하는 것이 가능하다는 사실을 알고 있다.
인터페이스 타입으로 객체를 생성할 수 있으며 해당 객체에 구현 클래스로 인스턴스화 할 수 있다.
인터페이스 타입의 매개변수가 가지는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.
interface Champion {
void ChampName(String champName);
}
class LaneCheck {
public static Champion getLane(String lane) {
if(lane.equals("Bottom")) {
return new Marksman();
} else if(lane.equals("Mid")) {
return new Nuker();
} else {
Champion c = new Jungle();
return c;
}
}
}
class Marksman implements Champion {
public void ChampName(String champName) {
System.out.println(champName + " 바텀이요.");
}
}
class Nuker implements Champion {
public void ChampName(String champName) {
System.out.println(champName + " 미드 선");
}
}
class Jungle implements Champion {
public void ChampName(String champName) {
System.out.println(champName + " 정글감");
}
}
class App {
public static void main(String[] args) {
Champion champion = LaneCheck.getLane("Bottom");
champion.ChampName("미스포츈");
champion = LaneCheck.getLane("Mid");
champion.ChampName("르블랑");
champion = LaneCheck.getLane("Anywhere");
champion.ChampName("마스터 이")
}
}
// 미스포츈 바텀이요
// 르블랑 미드 선
// 마스터이 정글감
위 보기 중 메서드의 리턴타입으로 인터페이스의 타입을 지정한 부분이 있는데,
리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
인터페이스는 인터페이스로부터만 상속을 받을 수 있고 다중상속이 가능하다.
클래스의 상속과 마찬가지로 자손 인터페이스는 조상 인터페이스에 정의된 멤버를 모두 상속받는다.
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Movable, Attackable { }
인터페이스는 클래스와 달리 Object 클래스와 같은 최고 조상이 없다.
원래 Java 8 이전의 Interface의 메서드는 선언만 가능하고 구현할 수 없었다.
하지만 Java8 이후부터 Default 메서드를 이용하면 메서드가 구현부를 가질 수 있다.
interface MyInterface {
void method();
// void newMethod(); 추상 메서드
default void newMethod() { }
}
디폴트 메서드는 앞에 키워드 default를 붙이며, 추상 메서드와 달리 일반 메서드처럼 몸통 { }이 있어야 한다. 접근 제어자는 public이며, 생략이 가능하다.
Java 8부터 인터페이스에 static 메서드 추가가 가능해졌다. 클래스에서 작성하는 방법과 동일하게 작성할 수 있고, 접근 제어자는 항상 public이며 역시 생략이 가능하다.
interface study{
/* static 메소드 */
static String nameStaticCheck(){
return "nameStaticCheck"
}
인터페이스의 메서드는 public이다.
하지만 자바9 부터는 private으로 사용함으로써 외부에 공개하지 않게 하며 코드의 중복을 파하고 interface에 대한 캡슐화를 유지할 수 있게 해준다.
private method : private, abstract, default, static 메서드 호출 가능
private static method : static, private static 메서드만 호출 가능
https://yadon079.github.io/2021/java%20study%20halle/week-08