자바의 인터페이스
- 클래스가 구현해야 할 메소드들이 선언되는 추상형
- 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(){ //defalut 메소드, public 생략 가능
System.out.println("** Phone **");
}; //default 메소드
}
//전화기의 규격을 묘사하는 PhoneInterface 인터페이스 선언 예시
- java 7까지 인터페이스는 상수와 추상 메소드로만 구성
- java 8부터 상수와 추상메소드, defalut 메소드 포함
- java 9부터 private 메소드, static 메소드 포함
- 인터페이스에는 필드 선언 불가
인터페이스 구성(java 10)
- 상수와 추상 메소드
- default 메소드
- private 메소드
- static 메소드
상수
- public만 허용
- public static final 생략 가능
추상 메소드
- public abstract 생략 가능
default 메소드
- 인터페이스에 코드가 작성된 메소드
- 인터페이스를 구현하는 클래스에 자동 상속
- public 접근 지정만 허용(생략 가능)
private 메소드
- 인터페이스 내에 메소드 코드가 작성되어야 함
- 인터페이스 내에 있는 다른 메소드에 의해서만 호출 가능
static 메소드
- public, private 모두 지정 가능
- 접근 지정자 생략 시 public
자바 인터페이스 특징
인터페이스 객체 생성 불가
- 인터페이스에 구현되지 않은 추상 메소드를 가질 수 있기 때문에 객체 생성 불가
new PhoneInterface(); //PhoneInterface 타입의 객체 생성 불가
인터페이스 타입의 레퍼런스 변수는 선언 가능
PhoneInterface galaxy; //galaxy는 인터페이스에 대한 레퍼런스 변수
인터페이스 구현
- 인터페이스를 상속받는 클래스는 인터페이스의 모든 추상 메소드를 반드시 구현
인터페이스는 다른 인터페이스를 상속 가능
- 인터페이스의 다중 상속 가능
class Cls implements PhoneInterface, TvInterface, ... {...}
인터페이스 구현
- implements키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한 클래스 작성
class SamsungPhone implements PhoneInterface{ //인터페이스 구현
//PhoneInterface의 모든 추상 메소드 구현
public void sendCall(){ System.out.println("*bell rings*"); }
public void receiveCall(){ System.out.println("전화가 왔습니다."); }
//메소드 추가 작성
public void flash(){ System.out.println("*wakes screen*"); }
}
//PhoneInterface를 구현한 SamsungPhone 클래스를 작성한 예시
- SamsungPhone 클래스에 PhoneInterface 인터페이스의 모든 추상 메소드를 구현
- flash() 메소드 추가 작성
- PhoneInterface에 이미 구현되어 있는 default 메소드 printLogo()는 그대로 상속
인터페이스 상속
- 클래스는 인터페이스를 상속받을 수 없음
- 인터페이스끼리만 상속 가능
- 인터페이스 다중 상속 가능
- 상속을 통해 기존 인터페이스에 새로운 규격을 추가한 새로운 인터페이스 생성
- extends 키워드 사용
//PhoneInterface 인터페이스를 상속받아 MobilePhoneInterface 인터페이스 작성
interface MobilePhoneInterface extends PhoneInterface{
void sendSMS(); //추상메소드
void receiveSMS(); //추상메소드
}
- MobilePhoneInterface 인터페이스는 TIMEOUT, sendCall(), receiveCall(), printLogo(), sendSMS(), receiveSMS() 총 6개의 멤버 가짐
interface MP3Interface{
void play(); //추상 메소드
void stop(); //추상 메소드
}
interface MusicPhoneInterface extends MobilePhoneInterface, MP3Interface{ //다중 상속
void playMP3RingTone(); //추상 메소드
}
- 다중 상속 가능
인터페이스의 목적: 다형성 실현
- 인터페이스는 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언
- 클래스의 다형성을 실현하는 도구
다중 인터페이스 구현
- 클래스는 하나 이상의 인터페이스 구현 가능
- 이 경우 콤마(,)로 각 인터페이스를 구분
- 각 인터페이스에 선언된 모든 추상 메소드를 구현
//AIInterface와 MobilePhoneInterface를 모두 구현한 AIPhone 클래스 작성
interface AIInterface{
void recognizeSpeech(); //음성인식
void synthesizeSpeech(); //음성합성
}
class AIPhone implements MobilePhoenInterface, AIInterface{ //인터페이스 구현
//MobilePhoneInterface의 모든 메소드 구현
public void sendCall(){...}
public void receiveCall(){...}
public void sendSMS(){...}
public void receiveSMS(){...}
//AIInterface의 모든 메소드 구현
public void recognizeSpeech(){...}
public void synthesizeSpeech(){...}
//추가 메소드 작성 가능
public int touch(){...}
}
추상 클래스와 인터페이스 비교
유사점
- 객체 생성 불가
- 상속을 위한 슈퍼 클래스로만 사용
- 클래스의 다형성을 실현
차이점
예제 5-8 PhoneInterface 인터페이스를 구현하고 flash() 메소드를 추가한 SamsungPhone 클래스 작성
예제 5-9 인터페이스 구현과 동시에 슈퍼 클래스 상속
- 핸드폰 규격을 묘사한 PhoneInterface 인터페이스
- PhoneInterface 를 상속하여 SMS 송/수신을 묘사한 MobilePhoneInterface 인터페이스
- MP3 규격을 묘사한 MP3Interface 인터페이스
- 덧셈 계산을 수행하는 PDA 클래스
- MobilePhoneInterface, MP3Interface, PDA를 상속받는 SmartPhone 클래스 작성
- SmartPhone 클래스에 추가로 schedule() 메소드 작성
interface PhoneInterface{
final int TIMEOUT=10000;
void sendCall();
void receiveCall();
default void printLogo() {
System.out.println("**phone**");
}
}
interface MobilePhoneInterface extends PhoneInterface{
void sendSMS();
void receiveSMS();
}
interface MP3Interface{
public void play();
public void stop();
}
class PDA{
public void calculate(int x, int y) {
System.out.printf("%d + %d = %d\n", x, y, x+y);
}
}
class SmartPhone extends PDA implements MobilePhoneInterface, MP3Interface{
@Override
public void sendCall() {System.out.println("bell rings");}
@Override
public void receiveCall() {System.out.println("전화왔어요...");}
@Override
public void sendSMS() {System.out.println("문자 메시지 전송");}
@Override
public void receiveSMS() {System.out.println("문자 메시지 확인");}
@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 sp=new SmartPhone();
sp.printLogo();
sp.sendCall();
sp.play();
sp.calculate(3, 5);
sp.schedule();
}
}
'java > 개념' 카테고리의 다른 글
import와 클래스 경로 (0) | 2024.05.23 |
---|---|
패키지(package) (0) | 2024.05.23 |
추상 클래스 (0) | 2024.05.23 |
메소드 오버라이딩(+동적 바인딩) (0) | 2024.05.22 |
업캐스팅과 다운캐스팅(+instanceof 연산자) (0) | 2024.05.22 |