Java - 인터페이스(Interface)

객체지향의 주요 개념중 하나이다. 인터페이스는 추상 클래스의 일종이지만 추상화 클래스보다 추상화 정도가 높다. 추상화 클래스와 달리 인터페이스는 아예 몸통을 가지지 않기 때문이다. 오직 추상 메서드와 상수만을 가질 수 있다고 한다.

ToC


인터페이스 작성규칙

인터페이스는 다음과 같은 형식으로 작성한다.

1
2
3
4
public interface 인터페이스이름 {
public void 메서드명(파라미터);
// 추상 메서드지만 abstract 키워드를 명시하지 않아도 사용가능
}

인터페이스에서 가지는 멤버 필드(변수)는 오직 상수이기 때문에 가변성을 지닌 변수를 생성하고자 한다면, 인터페이스에서 생성하지 않고, 인터페이스를 상속받는(implements) 객체에서 변수를 생성해서 사용해야 한다.

추상클래스와 마찬가지로 서브 클래스에서 인터페이스를 상속해서 오버라이딩을 통해 인터페이스의 기능을 구현해야한다.

인터페이스 작성 규칙은 다음과 같다.

  • 모든 멤버 필드는 상수로만 작성가능하다.
  • **모든 메서드는 추상 메서드(public abstract)**로 생성할 수 있으며, 이를 생략할 수 있다.
    (단, static 메서드와 default 메서드는 예외)

인터페이스 다중상속

자바는 원래 다중상속(public class a extends A,B{})을 지원하지 않지만, 인터페이스를 이용하면 사실상 다중상속을 사용할 수 있다.

예제코드를 통해 알아보자. 다음 예제코드는 LedTV라는 클래스가 TV라는 인터페이스와 Electronics 라는 인터페이스를 다중상속(implements)받고 있고, 이를 tvExam이라는 클래스를 통해 실행하는 예제이다.

TV.java

1
2
3
4
5
6
7
8
9
10
package interfaceStudy;

public interface TV {
public int MIN_VOLUME = 0;
public int MAX_VOLUME = 100;

public void turnOn(String tv);
public void turnOff(String tv);
public void changeVolume(int volume);
}

Electronics.java

1
2
3
4
5
6
package interfaceStudy;

public interface Electronics {
public void powerOn();
public void powerOff();
}

LedTV.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package interfaceStudy;

public class LedTV implements TV, Electronics {

@Override
public void turnOn(String tv) {
System.out.println(tv+" tv켜다.");
}

@Override
public void turnOff(String tv) {
System.out.println(tv+" tv끄다.");
}

@Override
public void changeVolume(int volume) {
System.out.println("볼륨을 조정하다.");
}

@Override
public void powerOn() {
System.out.println("전자제품 모두 power on");
}

@Override
public void powerOff() {
System.out.println("전자제품 모두 power off");
}

}

tvExam.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package interfaceStudy;

public class tvExam {
public static void main(String[] args) {
TV tv = new LedTV();
Electronics electronics = new LedTV();

tv.turnOn("거실");
tv.turnOff("안방");
tv.changeVolume(10);

electronics.powerOn();
electronics.powerOff();
}
}
1
2
3
4
5
6
7
// 실행결과
거실 tv켜다.
안방 tv끄다.
볼륨을 조정하다.
채널을 조정하다.
전자제품 모두 power on
전자제품 모두 power off

default 메서드와 static 메서드

default 메서드

인터페이스는 원래 추상 메서드만 가질 수 있었는데, 자바8부터 default 로 생성하면 완전한 메서드 생성이 가능하다.

1
2
3
4
5
6
7
8
public interface Meter {
public void start();
public int stop(int distance);

public default void afterMidnight(){
System.out.println("인터페이스는 이렇게 default 메서드 생성이 가능합니다.");
}
}

deafult 메서드 생성시, public 접근제한자는 생략할 수 있다. 이에 대한 예제코드는 아래 인터페이스에서의 static 메서드에서 다뤄보겠다.


static 메서드

인터페이스는 static 메서드도 가질 수 있다. 접근제한자로 public을 선언해서 인터페이스에서 static 메서드 생성이 가능하다.

인터페이스에 생성한 static 메서드는 인스턴스 키워드를 통해 사용할 수 없고, 인터페이스 객체를 직접 호출함으로써 사용이 가능하다. (아래 스크린샷 참조)

Calculator라는 인터페이스가 있고, 이 인터페이스를 상속받는 MyCal이라는 클래스가 있다고 가정하자.

Calculator.java

1
2
3
4
5
6
7
8
9
10
11
12
public interface Calculator {
public int plus(int a, int b);
public int multiple(int a, int b);

default int exec(int a, int b){
return a+b;
}

public static int exec2(int a, int b){
return a*b;
}
}

MyCal.java

1
2
3
4
5
6
7
8
9
10
11
public class MyCal implements Calculator {
@Override
public int plus(int a, int b){
return a+b;
}

@Override
public int multiple(int a, int b){
return a*b;
}
}

그리고 이를 실행하는 클래스, MyCalExam이 있다.

MyCalExam.java

1
2
3
4
5
6
7
8
9
10
11
public class MyCalExam {
public static void main(String[] args){
MyCal cal = new MyCal();

System.out.println(cal.plus(3,5));
System.out.println(cal.multiple(4,5));

System.out.prinltn(cal.exec(4,9));
System.out.println(Calculator.exec2(3, 8));
}
}

실행하면 다음과 같다.

1
2
3
4
5
// 실행 결과
8
20
13
24


추상클래스와 인터페이스의 비교

공통점

  • 추상클래스와 인터페이스는 선언만 있고, 구현내용이 없다.
  • 상속받은 자식(서브 클래스)만이 객체를 생성할 수 있다.
  • 상속받은 자식이 구현을 반드시 강제하도록 하는 것이 목적이다.
  • 추상클래스와 인터페이스를 상속할 땐 각각의 객체 타입에 맞춰서 자식의 객체 타입도 맞춰줘야한다.

다른점

인터페이스 (Interface) 추상클래스 (Abstract Class)
구현 객체의 같은 동작을 보장하기 위함 추상클래스를 상속받아 기능을 이용하고, 확장시키기 위함
다중 상속 가능 다중 상속 불가능
추상메서드만 가능 일반메서드 + 추상메서드 가능
상수 + 추상메서드 형태 일반변수(가능) + 일반메서드(가능)+추상메서드 형태
생성자와 일반변수를 가질 수 없음 생성자와 일반변수 모두 가질 수 있음
implments extends
메서드 선언만 가능 메서드의 부분적인 구현이 가능

참고문서