Chapter 08 인터페이스

08-1 인터페이스

자바에서 인터페이스(interface)는 객체의 사용 방법을 정의한 타입이다.

인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.

개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.

따라서, 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.

그렇다면 왜? 중간에 인터페이스를 두는 것일까?

→ 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서!

인터페이스는 하나의 객체가 아닌 여러 객체들과 사용이 가능하다.

그렇기 때문에 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다.






인터페이스 선언

  • .java 파일로 작성되고 .class 형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일
  • 소스를 작성할 때 선언하는 방법이 다름
// 인터페이스 선언
[public] interface 인터페이스이름 {}
  • 인터페이스는 상수 필드추상 메소드만을 구성 멤버로 가짐
  • 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 ❌
interface 인터페이스이름 {
	// 상수
	타입 상수이름 =;

	// 추상 메소드
	타입 메소드이름(매개변수, ...);
}

상수 필드 선언 (constant field)

[public static final] 타입 상수이름 =; // 고정된 값이기 때문에 데이터를 바꿀 수 없음!

추상 메소드 선언

[public abstract] 리턴타입 메소드이름(매개변수, ...);





인터페이스 구현

  • 개발 코드 → 인터페이스 → 객체
  • 객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 함
  • 이러한 객체를 인터페이스의 구현(implement) 객체
  • 구현 객체를 생성하는 클래스를 구현 클래스


구현 클래스

  • 보통의 클래스와 동일
  • 인터페이스 타입으로 사용할 수 있기 때문에 선언부에 implements 키워드를 추가하고 이름 명시
  • 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언
public class 구현클래스이름 implements 인터페이스이름 {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언

}
  • 구현 클래스가 작성되면 객체 생성 가능
  • 인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체 대입
인터페이스 변수 = 구현객체;

// 또는
인터페이스 변수;
변수 = 구현객체;



다중 인터페이스 구현 클래스

  • 객체는 다수의 인터페이스 타입으로 사용할 수 있다.
  • 인터페이스 A와 인터페이스 B가 객체의 메소드를 호출하려면 객체는 두 인터페이스를 모두 구현
public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
	// 인터페이스 A에 선언된 추상 메소드의 실체 메소드 선언
	// 인터페이스 B에 선언된 추상 메소드의 실체 메소드 선언
}





08-1 확인문제 3번

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을 실행하면 결과가 잘 나온다!





08-2 확인문제 3번

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();
}

DaoExample 클래스의 main() 메소드에서 dbWork() 메소드를 호출할 때 OracleDao와 MySqlDao 객체를 매개값으로 주고 호출했다. 또한 문제에서 "OracleDao, MySqlDao 구현 클래스"라고 했기 때문에 힌트를 얻을 수 있다.

실행결과를 보게 되면 어떻게 재정의 해야하는지 알 수 있다.

// 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에서 삭제");		
	}
}

좋은 웹페이지 즐겨찾기