객체지향의 주요 개념중 하나이다. 인터페이스는 추상 클래스의 일종이지만 추상화 클래스보다 추상화 정도가 높다. 추상화 클래스와 달리 인터페이스는 아예 몸통을 가지지 않기 때문이다. 오직 추상 메서드와 상수만을 가질 수 있다고 한다.
ToC
인터페이스 작성규칙
인터페이스는 다음과 같은 형식으로 작성한다.
1 | public interface 인터페이스이름 { |
인터페이스에서 가지는 멤버 필드(변수)는 오직 상수이기 때문에 가변성을 지닌 변수를 생성하고자 한다면, 인터페이스에서 생성하지 않고, 인터페이스를 상속받는(implements
) 객체에서 변수를 생성해서 사용해야 한다.
추상클래스와 마찬가지로 서브 클래스에서 인터페이스를 상속해서 오버라이딩을 통해 인터페이스의 기능을 구현해야한다.
인터페이스 작성 규칙은 다음과 같다.
- 모든 멤버 필드는 상수로만 작성가능하다.
- **모든 메서드는 추상 메서드(public abstract)**로 생성할 수 있으며, 이를 생략할 수 있다.
(단, static 메서드와 default 메서드는 예외)
인터페이스 다중상속
자바는 원래 다중상속(public class a extends A,B{}
)을 지원하지 않지만, 인터페이스를 이용하면 사실상 다중상속을 사용할 수 있다.
예제코드를 통해 알아보자. 다음 예제코드는 LedTV라는 클래스가 TV라는 인터페이스와 Electronics 라는 인터페이스를 다중상속(implements
)받고 있고, 이를 tvExam이라는 클래스를 통해 실행하는 예제이다.
TV.java
1 | package interfaceStudy; |
Electronics.java
1 | package interfaceStudy; |
LedTV.java
1 | package interfaceStudy; |
tvExam.java
1 | package interfaceStudy; |
1 | // 실행결과 |
default 메서드와 static 메서드
default 메서드
인터페이스는 원래 추상 메서드만 가질 수 있었는데, 자바8부터 default
로 생성하면 완전한 메서드 생성이 가능하다.
1 | public interface Meter { |
deafult 메서드 생성시, public 접근제한자는 생략할 수 있다. 이에 대한 예제코드는 아래 인터페이스에서의 static 메서드에서 다뤄보겠다.
static 메서드
인터페이스는 static
메서드도 가질 수 있다. 접근제한자로 public
을 선언해서 인터페이스에서 static 메서드 생성이 가능하다.
단 인터페이스에 생성한 static 메서드는 인스턴스 키워드를 통해 사용할 수 없고, 인터페이스 객체를 직접 호출함으로써 사용이 가능하다. (아래 스크린샷 참조)
Calculator라는 인터페이스가 있고, 이 인터페이스를 상속받는 MyCal이라는 클래스가 있다고 가정하자.
Calculator.java
1 | public interface Calculator { |
MyCal.java
1 | public class MyCal implements Calculator { |
그리고 이를 실행하는 클래스, MyCalExam이 있다.
MyCalExam.java
1 | public class MyCalExam { |
실행하면 다음과 같다.
1 | // 실행 결과 |
추상클래스와 인터페이스의 비교
공통점
- 추상클래스와 인터페이스는 선언만 있고, 구현내용이 없다.
- 상속받은 자식(서브 클래스)만이 객체를 생성할 수 있다.
- 상속받은 자식이 구현을 반드시 강제하도록 하는 것이 목적이다.
- 추상클래스와 인터페이스를 상속할 땐 각각의 객체 타입에 맞춰서 자식의 객체 타입도 맞춰줘야한다.
다른점
인터페이스 (Interface) | 추상클래스 (Abstract Class) |
---|---|
구현 객체의 같은 동작을 보장하기 위함 | 추상클래스를 상속받아 기능을 이용하고, 확장시키기 위함 |
다중 상속 가능 | 다중 상속 불가능 |
추상메서드만 가능 | 일반메서드 + 추상메서드 가능 |
상수 + 추상메서드 형태 | 일반변수(가능) + 일반메서드(가능)+추상메서드 형태 |
생성자와 일반변수를 가질 수 없음 | 생성자와 일반변수 모두 가질 수 있음 |
implments | extends |
메서드 선언만 가능 | 메서드의 부분적인 구현이 가능 |
참고문서