자바에서 인터페이스(interface)는 객체의 사용 방법을 정의한 타입이다.
인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.
개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.
따라서, 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.
그렇다면 왜? 중간에 인터페이스를 두는 것일까?
→ 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서!
그렇기 때문에 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다.
// 인터페이스 선언
[public] interface 인터페이스이름 {}
interface 인터페이스이름 {
// 상수
타입 상수이름 = 값;
// 추상 메소드
타입 메소드이름(매개변수, ...);
}
[public static final] 타입 상수이름 = 값; // 고정된 값이기 때문에 데이터를 바꿀 수 없음!
[public abstract] 리턴타입 메소드이름(매개변수, ...);
public class 구현클래스이름 implements 인터페이스이름 {
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
인터페이스 변수 = 구현객체;
// 또는
인터페이스 변수;
변수 = 구현객체;
public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
// 인터페이스 A에 선언된 추상 메소드의 실체 메소드 선언
// 인터페이스 B에 선언된 추상 메소드의 실체 메소드 선언
}
Soundable 인터페이스
public interace Soundable {
String sound();
}
SoundableExample 클래스에서 printSound() 메소드는 Soundable 인터페이스 타입의 매개 변수를 가지고 있습니다. main() 메소드에서 printSound()를 호출할 때 Cat과 Dog 객체를 주고 실행하면 각각 “야옹"과 “멍멍"이 출력되도록 Cat과 Dog 클래스를 작성해보세요.
public class SoundableExample {
private static void printSound(Soundable soundable) {
System.out.println(soundable.sound());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
printSound(new Cat());
printSound(new Dog());
}
}
인터페이스의 메소드에서 리턴값이 String이다.
따라서 Cat과 Dog 클래스 선언부에 implements 키워드를 추가하고, 메소드를 재정의 한다.
// Cat
public class Cat implements Soundable {
@Override
public String sound() {
return "야옹";
}
}
// Dog
public class Dog implements Soundable{
@Override
public String sound() {
return "멍멍";
}
}
SoundableExample을 실행하면 결과가 잘 나온다!
DaoExample 클래스의 main() 메소드에서 dbWork() 메소드를 호출할 때 OracleDao와 MySqlDao 객체를 매개값으로 주고 호출했습니다. dbWork() 메소드는 두 객체를 모두 매개값으로 받기 위해 DataAccessObject 타입의 매개 변수를 가지고 있습니다. 실행 결과를 보고 DataAccessObject 인터페이스와 OracleDao, MySqlDao 구현 클래스를 각각 작성해보세요.
public class DaoExample {
public static void dbWork(DataAccessObject dao) {
dao.select();
dao.insert();
dao.update();
dao.delete();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
dbWork(new OracleDao());
dbWork(new MySqlDao());
}
}
실행결과
Oracle DB에서 검색
Oracle DB에서 삽입
Oracle DB에서 수정
Oracle DB에서 삭제
MySql DB에서 검색
MySql DB에서 삽입
MySql DB에서 수정
MySql DB에서 삭제
DaoExample에서 dbWork() 메소드의 매개변수 타입을 인터페이스로 받고 있기 때문에 인터페이스에서 정의된 메소드를 확인할 수 있다.
따라서 DataAccessObject 인터페이스는 다음과 같이 작성된다.
public interface DataAccessObject {
public void select();
public void insert();
public void update();
public void delete();
}
실행결과를 보게 되면 어떻게 재정의 해야하는지 알 수 있다.
// OracleDao
public class OracleDao implements DataAccessObject {
@Override
public void select() {
System.out.println("Oracle DB에서 검색");
}
@Override
public void insert() {
System.out.println("Oracle DB에서 삽입");
}
@Override
public void update() {
System.out.println("Oracle DB에서 수정");
}
@Override
public void delete() {
System.out.println("Oracle DB에서 삭제");
}
}
// MySqlDao
public class MySqlDao implements DataAccessObject {
@Override
public void select() {
System.out.println("MySql DB에서 검색");
}
@Override
public void insert() {
System.out.println("MySql DB에서 삽입");
}
@Override
public void update() {
System.out.println("MySql DB에서 수정");
}
@Override
public void delete() {
System.out.println("MySql DB에서 삭제");
}
}