인터페이스
자바의 인터페이스
인터페이스는 interface 키워드를 사용하여 클래스를 선언하듯이 선언하는 것을 말합니다.
interface PhoneInterface { // 인터페이스 선언
public static final int TIMEOUT = 10000; // 상수 필드, public static final 생략 기능
public abstract void sendCall(); // 추상 메소드. public abstract 생략 가능
public abstract void receiveCall(); // 추상 메소드. public abstract 생략 가능
public default void printLogo() { // default 메소드. public 생략 가능
System.out.println("** Phone **");
}; // 디폴트 메소드
}
인터페이스 구성
인터페이스는 다음 5종류의 멤버로서 구성되며, 필드(멤버 변수)를 만들 수 없습니다.
- 상수와 추상 메소드 (Java 7까지)
- default 메소드 (Java 8부터)
- private 메소드 (Java 9부터)
- static 메소드 (Java 9부터)
추상 메소드는 public abstract로 정해져 있으며, 생략될 수 있고, 다른 접근 지정으로 지정될 수 없습니다. default, private, static 메소드들은 모두 인터페이스 내에 코드가 작성되어 있어여 합니다. default 메소드의 접근 지정은 public으로 고정되어 있습니다. private 메소드는 인터페이스 내에서만 호출이 가능합니다. static 메소드의 경우 접근 지정이 생략되면 public이며, private으로 지정될 수 있습니다.
인터페이스는 객체를 생성할 수 없습니다.
인터페이스에 구현되지 않은 추상 메소드를 가질 수 있기 때문에 객체를 생성할 수 없습니다. 다음 문장은 오류입니다.
new PhoneInterface(); // 오류. 인터페이스 PhoneInterface 객체 생성 불가
인터페이스 타입의 레퍼런스 변수는 선언 가능합니다.
PhoneInterface galaxy; // galaxy는 인터페이스에 대한 레퍼런스 변수
인터페이스끼리 상속됩니다.
인터페이스는 다른 인터페이스를 상속할 수 있습니다.
인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현하여야 합니다.
인터페이스는 상속을 받을 서브 클래스에게 구현할 메소드들의 원형을 모두 알려주어, 쿨래스가 스스로의 목적에 맞게 메소드를 구현하도록 하는 것이 목적입니다.
인터페이스 구현
implements 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한 클래스를 작성하는 것을 말합니다.
class SamsungPhone implements PhoneInterface { // 인터페이스 구현
//PhoneInterface의 모든 추상 메소드 구현
public void sendCall() {
System.out.println("띠리리리링");
}
public void receiveCall() {
System.out.println("전화가 왔습니다.");
}
// 메소드 추가 작성
public void flash() {
System.out.println("전화기에 불이 커졌습니다.");
}
}
인터페이스 구현
interface PhoneInterface { // 인터페이스 선언
final int TIMEOUT = 10000; // 상수 필드
void sendCall(); // 추상 메소드
void receiveCall(); // 추상 메소드
default void printLogo() { // default 메소드
System.out.println("** Phone **");
}; // 디폴트 메소드
}
class SamsungPhone implements PhoneInterface { // 인터페이스 구현
//PhoneInterface의 모든 추상 메소드 구현
public void sendCall() {
System.out.println("띠리리리링");
}
public void receiveCall() {
System.out.println("전화가 왔습니다.");
}
// 메소드 추가 작성
public void flash() {
System.out.println("전화기에 불이 커졌습니다.");
}
}
public class InterfaceEx {
public static void main(String[] args) {
SamsungPhone phone = new SamsungPhone();
phone.printLogo();
phone.sendCall();
phone.receiveCall();
phone.flash();
}
}
실행 결과
** Phone **
띠리리리링
전화가 왔습니다.
전화기에 불이 커졌습니다.
인터페이스 상속
클래스는 인터페이스를 상속받을 수 없고, 인터페이스끼리만 상속이 가능합니다. 상속을 통해 기존 인터페이스에 새로운 규격을 추가한 새로운 인터페이스를 만들 수 있으며, 인터페이스의 상속은 extends 키워드를 사용합니다.
interface MobilePhoneInterface extends PhoneInterface { // 인터페이스 상속
void sendSMS(); // 추상 메소드
void receiveSMS(); // 추상 메소드
}
이렇게 함으로써, MoilePhoneInterface 인터페이스는 TIMEOUT, sendCall(), receiveCall(), printLogo(), sendSMS(), receiveSNS()의 총 6개의 멤버를 가지게 됩니다. 자바는 인터페이스의 다중 상속을 허용하는데, 다음 MP3Interface 인터페이스가 있을 때,
interface MP3Interface {
void play(); // 추상 메소드
void stop(); // 추상 메소드
}
다음과 같이 다중 상속하여 인터페이스를 작성할 수 있습니다.
interface MusicPhoneInterface extends MobilePhoneInterface, MP3Interface { // 다중 상속
void playMP3RingTone(); // 추상 메소드
}
인터페이스의 목적
인터페이스는 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언이며, 클래스의 다형성을 실현하는 도구입니다.

다중 인터페이스 구현
클래스는 하나 이상의 인터페이스를 구현할 수 있습니다. 이 경우 콤마로 각 인터페이스를 구분하여 나열하며, 각 인터페이스에 선언된 된 모든 추상 메소드를 구현해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
interface AIInterface {
void recognizeSpeech(); // 음성 인식
void synthesizeSpeech(); // 음성 합성
}
class AIPhone implements MobilePhoneInterface, AIInterface { // 인터페이스 구현
// MobilePhoneInterface의 모든 메소드를 구현합니다.
public void sendCall() { ... }
public void receiveCall() { ... }
public void sendSMS() { ... }
public void receiveSMS() { ... }
// AIInterface의 모든 메소드를 구현한다.
public void recognizeSpeech() { ... } //음성 인식
public void synthesizeSpeech() { ... } // 음성 합성
// 추가적으로 다른 메소드를 작성할 수 있다.
public int touch() { ... }
}
클래스 상속과 함께 인터페이스 구현
클래스를 상속 받으면서 동시에 인터페이스를 구현할 수 있습니다. 다중 상속, 다중 인터페이스 구현은 유용하나 자칫 너무 남용하면 클래스, 인스페이스 간의 관계가 너무 복잡해져 프로그램 전체 구조를 파악하기 어려울 수 있으므로 주의하는 것이 좋습니다.
interface PhoneInterface { // 인터페이스 선언
final int TIMEOUT = 10000; // 상수 필드
void sendCall(); // 추상 메소드
void receiveCall(); // 추상 메소드
default void printLogo() { // default 메소드
System.out.println("** Phone **");
}; // 디폴트 메소드
}
interface MobilePhoneInterface extends PhoneInterface { // 인터페이스 상속
void sendSMS(); // 추상 메소드
void receiveSMS(); // 추상 메소드
}
interface MP3Interface { // 인터페이스 선언
void play(); // 추상 메소드
void stop(); // 추상 메소드
}
class PDA { // 클래스 작성
public int calculate(int x, int y) {
return x + y;
}
}
// SmartPhone 클래스는 PDA를 상속받고,
// MobilePhoneInterface와 MP3Interface 인터페이스에 선언된 추상 메소드를 모두 구현한다.
class Smartphone extends PDA implements MobilePhoneInterface, MP3Interface { // 인터페이스 구현
//MobilePhoneInterface의 추상 메소드 구현
@Override
public void sendCall() {
System.out.println("띠리리리링");
}
@Override
public void receiveCall() {
System.out.println("전화가 왔습니다.");
}
@Override
public void sendSMS() {
System.out.println("문자갑니다.");
}
@Override
public void receiveSMS() {
System.out.println("문자왔어요.");
}
// MP3Interface의 추상 메소드 구현
@Override
public void play() {
System.out.println("음악 연주합니다.");
}
@Override
public void stop() {
System.out.println("음악 중단합니다.");
}
// 추가로 작성한 메소드
public void schedule() {
System.out.println("일정 관리합니다.");
}
}
public class InterfaceEx {
public static void main(String[] args) {
Smartphone phone = new Smartphone();
phone.printLogo();
phone.sendCall();
phone.play();
System.out.println("3과 5를 더하면 " + phone.calculate(3, 5));
phone.schedule();
}
}
실행 결과
** Phone **
띠리리리링
음악 연주합니다.
3과 5를 더하면 8
일정 관리합니다.
인터페이스 추상 클래스 비교
인터페이스와 추상 클래스는 다음 절에서 유사합니다.
- 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용됩니다.
- 클래스의 다형성을 실현하기 위한 목적입니다.
| 비고 | 목적 | 구성 |
| 추상 클래스 | 추상 클래스는 서브 클래스에서 필요로 하는 대부분의 기능을 구현하여 두고 서브 클래스가 상속받아 활용할 수 있도록 하되, 서브 클래스에서 구현할 수 밖에 없는 기능만을 추상 메소드로 선언하여, 서브 클래스에서 구현하도록 하는 목적(다형성) | 추상 메소드와 일반 메소드 모두 포함 상수, 변수 필드 모두 포함 |
| 인터페이스 | 인터페이스는 객체의 기능을 모두 공개한 표준화 문서와 같은 것으로, 개발자에게 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 목적(다형성) | 변수 필드(멤버 변수)는 포함하지 않음 상수, 추상 메소드, 일반 메소드, default 메소드, static 메소드 모두 포함 protected 접근 지정 선언 불가 다중 상속 지원 |
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
| Java Programming 3 (1) | 2025.02.19 |
|---|---|
| 패키지(Package) (0) | 2025.02.19 |
| 추상 클래스 (0) | 2025.02.13 |
| 메소드 오버라이딩 (0) | 2025.02.10 |
| 업캐스팅과 instanceof 연산자 (0) | 2025.02.09 |