인터페이스란 객체간 상호 작용을 위한 일종의 규약이다.
인터페이스는 상수와 추상 메서드를 멤버로 가질 수 있다. 추상 메서드와 일반 멤버를 모두 가질 수 있는 추상 클래스보다 더 기본적인 구조라고 한다. 인터페이스는 키워드로 interface
를 사용하며 제어자로 상수 앞에는 public final static
을 메서드 앞에는 public abstract
를 붙인다.
interface 인터페이스이름{
public static final 데이터타입 변수명 = 값;
public abstract 반환타임 메서드이름(매개변수);
}
제어자를 생략하더라도 에러가 발생하지 않는다. 컴파일러에서 자동으로 제어자를 추가하기 때문이다.
인터페이스는 상속한다는 말 대신에 구현한다는 말을 사용한다. 자식 클래스는 키워드 implements
를 사용해서 인터페이스를 구현한다. 인터페이스를 구현한 자식 클래스는 오버라이딩을 통해 인터페이스 내부의 추상 메서드를 구체적으로 구현해야 한다.
interface A{
int a = 4; // 제어자 생략가능
void methodA(); // 제어자 생략가능
void methodB();
}
class B implements A{
public void methodA{
/*구체적인 구현, 오버라이딩*/
}
public void methodB{
/*구체적인 구현, 오버라이딩*/
}
}
오버라이딩을 할 때는 부모의 접근제어자보다 더 넓거나 같은 범위의 제어자를 사용해야 한다. 그러므로 public
제어자를 붙이고 오버라이딩 해야 한다.
하나의 클래스가 상속을 받으면서 구현을 동시에 할 수도 있다.
class B extends C implements A{
/*
C의 멤버
A의 멤버
*/
}
인터페이스 간 상속이 가능하다. 클래스는 다중상속이 불가했지만 인터페이스는 다중 상속이 가능하다.
interface A{
void methodA();
}
interface B{
void methodB();
}
interface C extends A,B{
}
A프로그래머와 B프로그래머가 하나의 프로젝트를 진행했을 때, A 프로그래머와 B프로그래머가 서로의 클래스가 완성되지 않았어도, 구현해야 할 기능들을 미리 협의하고 반환타입을 정해 놓으면 서로의 작업의 정도와는 무관하게 진행한다. 바로 이런 약속과 같은 것이 인터페이스이다.
interface Providable{
void leisureSports();
void sightseeing();
void food();
}
class KoreaTour implements Providable{
@Override
public void leisureSports() {
System.out.println("한강에서 수상스키 투어");
}
@Override
public void sightseeing() {
System.out.println("경복궁 관람 투어");
}
@Override
public void food() {
System.out.println("전주 비빔밥 투");
}
}
class TourGuide{
private Providable tour = new KoreaTour();
public void leisureSports() {
tour.leisureSports();
}
public void sightseeing() {
tour.sightseeing();
}
public void food() {
tour.food();
}
}
public class Interface1 {
public static void main(String[] args) {
TourGuide guide = new TourGuide();
guide.leisureSports();
guide.sightseeing();
guide.food();
}
}
특정한 인터페이스를 구현한 인스턴스의 해당 인터페이스 타입의 참조변수로 참조가 가능하다.
인터페이스명 참조변수이름 = new 클래스명();
interface Camera{
void Photo();
}
interface Call{
void calling();
}
interface Memo{
void write();
}
interface Clock{
void clock();
}
class MyCellPhone implements Camera,Call,Memo,Clock{
@Override
public void clock() {
}
@Override
public void write() {
}
@Override
public void calling() {
}
@Override
public void Photo() {
}
}
class PhoneUser{
void call(Call c) {
System.out.println("전화를 걸었습니다.");
}
}
public class Interface1 {
public static void main(String[] args) {
MyCellPhone phone1 = new MyCellPhone();
Camera phone2 = new MyCellPhone();
Call phone3 = new MyCellPhone();
Memo phone4 = new MyCellPhone();
Clock phone5 = new MyCellPhone();
PhoneUser user1 = new PhoneUser();
user1.call(phone3);
user1.call(phone1);
}
}