Interface
인터페이스 Interface
인터페이스란?

모든 메서드가 추상 메서드로 선언됨 public abstract
모든 변수는 상수로 선언됨 public static final
자바 8 부터 디폴트 메서드(default method)와 정적 메서드(static method) 기능의 제공으로 일부 구현 코드가 있음
인터페이스 정의와 구현

Calc.java
Calculator.java
CompleteCalc.java
CalculatorTest.java

인터페이스 구현과 형 변환
인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있음
Calc calc = new CompleteCalc();
상속에서의 형 변환과 동일한 의미
클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음 ( cf. extends)
형 변환되는 경우 인터페이스에 선언된 메서드만을 사용가능함

인터페이스는 왜 쓰는가?
인터페이스가 하는 일
클래스나 프로그램이 제공하는 기능을 명시적으로 선언
일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세(specification)
클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임
인터페이스를 구현한 다양한 객체를 사용함 - 다형성
예) JDBC 인터페이스
인터페이스를 활용한 다형성 구현 (dao 구현하기)
인터페이스와 다형성
하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있음 ( 다형성)
여러가지 예


인터페이스를 활용한 dao 구현하기
DB에 회원 정보를 넣는 dao(data access object)를 여러 DB 제품이 지원될 수 있게 구현함
환경파일(db.properties) 에서 database의 종류에 대한 정보를 읽고 그 정보에 맞게 dao 인스턴스를 생성하여 실행될 수 있게 함
source hierachy

UserInfo.java (사용자 정보 클래스)
UserInfoDao.java ( dao 에서 제공되어야 할 메서드를 선언한 인터페이스 )
UserInfoMySqlDao.java (UserInfoDao 인터페이스를 구현한 MySql 버전 dao)
UserInfoOracleDao.java (UserInfoDao 인터페이스를 구현한 Oracle 버전 dao)
UserInfoClient.java (UserInfoDao 인터페이스를 활용하는 클라이언트 프로그램)
db.properties 환경파일이 MYSQL 일때
실행결과 
db.properties 환경파일이 ORACLE 일때
실행결과 
인터페이스의 여러가지 요소
상수
모든 변수는 상수로 변환 됨 public static final
추상 메서드
모든 선언된 메서드는 추상 메서드 public abstract
디폴트 메서드 (자바 8이후)
구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
default 키워드 사용
구현 하는 클래스에서 재정의 할 수 있음
인터페이스를 구현한 클래스의 인스턴스가 생성 되어야 사용 가능함
정적 메서드 (자바 8이후)
인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
private 메서드 (자바 9이후)
인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
인터페이스 내부에서만 사용하기 위해 구현하는 메서드
default 메서드나 static 메서드에서 사용함
15. 여러 인터페이스 구현하기, 인터페이스의 상속
여러 인터페이스 구현
자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스는 구현 할 수 있음
디폴트 메서드가 중복 되는 경우는 구현 하는 클래스에서 재정의 하여야 함
여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용 가능 함

Sell.java
Buy.java
Customer.java
CustomerTest.java
디폴트 메서드가 중복 되는 경우
구현 코드를 가지고 인스턴스 생성된 경우만 호출되는 디폴트 메서드의 경우 두 개의 인터페이스에서 중복되면 구현하는 클래스에서 반드시 재정의를 해야 함
Sell.java
Buy.java
Customer.java
CustomerTest.java
인터페이스의 상속
인터페이스 사이에도 상속을 사용할 수 있음
extends 키워드를 사용
인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속 이라고 함

X.java
Y.java
MyInterface.java
MyClass.java
MyClassTest.java
클래스 상속과 인터페이스 구현 함께 쓰기
실무에서 프레임워크나 오픈소스와 함께 연동되는 구현을 하게 되면 클래스 상속과 인터페이스의 구현을 같이 사용하는 경우가 많음

책이 순서대로 대여가 되는 도서관 구현
책을 보관하는 자료 구조가 Shelf에 구현됨 (ArrayList)
Queue 인터페이스를 구현함
Shelf 클래스를 상속 받고 Queue를 구현한다.
Shelf.java
Queue.java
BookShelf.java
BookShelfTest.java

Last updated