목적
자바의 인터페이스에 대해 학습하세요.
학습할 것
- 인터페이스 정의하는 방법
- 인터페이스 구현하는 방법
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
- 인터페이스 상속
- 인터페이스의 기본 메소드 (Default Method), 자바 8
- 인터페이스의 static 메소드, 자바 8
- 인터페이스의 private 메소드, 자바 9
인터페이스란
인터페이스는 일종의 추상 클래스로 추상클래스보다 추상화 정도가 높아 일반 메서드 또는 멤버변수 (몸통)을 가질 수 없다 오직 추상메서드와 상수만 멤버로 가질 수 있다. 비유하자면 밑그림만 그려져있는 기본 설계도 라 할수있다.
1. 인터페이스 정의하는 방법
interface 인터페이스 이름{
public static final 타입상수이름 = 값;
public abstract 메서드이름(매개변수 목록);
}
인터페이스는 클래스랑 달리 제약사항이 있다.
- 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며 생략할 수 있다. (static 메서드와 default 메서드 예외)
- 위의 static 메서드와 default 메서드는 JDK 1.8에서 지원한다.
2. 인터페이스 구현하는 방법
인터페이스는 그 자체로 생성할 수 없고, 자신의 몸통을 만들어줘야 한다.
public interface Player{
public void move(int x, int y);
public void shoot(int x, int y);
}
class NBAPlayer implements Player{
public void move(int x, int y){
System.out.println("x, y 좌표로 이동");
}
public void shoot(int x, int y){
System.out.println("x, y 방향으로 슛!");
}
}
인터페이스의 메서드 중 일부만 구현하고 싶다면 abstract 붙여서 추상클래스로 선언해야 한다.
abstract class RunningPlayer implements Player{
public void move(int x, int y);
}
3. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
문제의 뜻을 잘 이해하지 못했는데 일단 내가 해석한 것은 main에서 인터페이스 같은경우 어떻게 선언하는 것인지 같아 적어본다.
public static void main(String[] args){
Player Lebron = new NBAPlayer();
lebron.move();
lebron.shoot();
}
x, y 좌표로 이동
x, y 방향으로 슛!
NBAPlayer()라는 클래스는 Player라는 인터페이스를 참조하고 있으므로 인터페이스 변수 선언에 참조된 클래스를 생성하여 사용할 수 있다.(?)
4. 인터페이스 상속
인터페이스는 인터페이스로부터만 상속받을 수 있으며 클래스와는 달리 다중상속, 여러개의 인터페이스로부터 상속받는 것은 불가능하다.
interface Moving{
void move(int x, int y);
}
interface Shooting{
void shoot(int x, int y);
}
interface Player extends Moving, Shooting{}
클래스의 상속과 마찬가지로 자손 인터페이스는 조상인터페이스에 정의된 멤버를 모두 상속받아 Player 인터페이스는move와 shoot을 다 가진 인터페이스가 된다.
5. 인터페이스의 기본 메소드(Default Method) 자바 8
조상클래스에 메서드 추가는 쉽지만 인터페이스는 어렵다. 인터페이스에 메서드 추가는 그 인터페이스를 참조하는 모든 클래스들이 새로 추가된 메서드를 구현해야 하기 때문이다. 그래서 디폴트 메서드가 나왔으며 이는 추상 메서드의 기본적 구현을 제공하는 메서드로 참조중인 클래스를 변경하지 않아도 된다.
interface MyInterface{
void method();
default void newMethod();
}
대신 이때 기존 메서드와 디폴트 메서드가 이름이 중복되어 충돌할 수도 있다.
- 여러 인터페이스의 디폴트 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
- 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
라는 규칙이 있는데 간단히 필요한 쪽의 메서드와 같은 내용으로 오버라이딩 해버리면 된다.
6. 인터페이스의 static 메소드, 자바8
static 메소드 같은 경우는 인스턴스와 관계가 없는 독립적 메서드로 인터페이스에 추가하면 된다.
그리고 인터페이스의 static메서드 역시 접근 제어자가 항상 public이며 생략할 수 있다.
7. 인터페이스의 private 메소드, 자바 9
java 8에서는 default, static method는 기본으로 public 만 가능했고 java 9 버전부턴 private 메서드를 지원한다.
이는 인터페이스가 내부적으로 처리하는 문제를 외부에서 사용하지 못하게 만들어준다.
결과적으로 인터페이스에 캡슐화시켜준다 할 수 있다.
Reference
남궁성. Java의 정석