본문 바로가기
java/개념

인터페이스(interface)

by unhyepnhj 2024. 5. 23.

자바의 인터페이스

- 클래스가 구현해야 할 메소드들이 선언되는 추상형

- 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