예시) Java에서 제공하는 List 인터페이스를 구현하는 클래스 중 하나인 ArrayList는 많은 일반적인 리스트 동작을 구현하고 있다.
//인터페이스
import java.util.*;
public interface List<E> extends Collection<E> {
// 요소 추가
boolean add(E e);
// 인덱스 위치에 요소 추가
void add(int index, E element);
// 모든 요소 삭제
void clear();
// 해당 요소가 리스트에 포함되어 있는지 여부 확인
boolean contains(Object o);
// 해당 인덱스의 요소 반환
E get(int index);
// 리스트가 비어 있는지 여부 확인
boolean isEmpty();
// 해당 요소의 인덱스 반환 (첫 번째로 발견되는 인덱스)
int indexOf(Object o);
// 리스트의 크기 반환
int size();
// 해당 요소를 리스트에서 제거
boolean remove(Object o);
// 해당 인덱스의 요소를 제거
E remove(int index);
// 리스트의 모든 요소를 배열로 반환
Object[] toArray();
// 리스트의 모든 요소를 특정 타입의 배열로 반환
<T> T[] toArray(T[] a);
// 리스트 내의 모든 요소를 주어진 컬렉션에 추가
boolean addAll(Collection<? extends E> c);
// 리스트의 특정 위치에 주어진 컬렉션의 모든 요소 추가
boolean addAll(int index, Collection<? extends E> c);
// 리스트에서 주어진 컬렉션과 겹치는 요소만 남기고 나머지는 제거
boolean retainAll(Collection<?> c);
// 리스트에서 주어진 컬렉션에 포함된 요소 모두 제거
boolean removeAll(Collection<?> c);
// 리스트의 일부를 반환
List<E> subList(int fromIndex, int toIndex);
}
//Lis 구현체인 ArrayList
import java.util.AbstractList;
import java.util.List;
public class ArrayList<E> extends AbstractList<E> implements List<E> {
// 다양한 필드 및 메소드가 있겠지만, 여기서는 일부만 간략하게 표현합니다.
private Object[] elementData; // 요소를 저장할 배열
private int size; // 리스트의 크기
// AbstractList의 메소드를 구현
@Override
public E get(int index) {
// 해당 인덱스의 요소 반환
return (E) elementData[index];
}
@Override
public int size() {
// 리스트의 크기 반환
return size;
}
// 다양한 다른 메소드들도 있겠지만 여기에서는 일부만 표현
}
예시) Oracle과 MySQL은 JDBC 인터페이스를 구현하여 자체적인 드라이버를 제공한다. 개발자는 JDBC API를 사용하여 이들 드라이버와 통신하고, 데이터베이스와의 상호 작용을 일반적으로 처리할 수 있다. 이는 다양한 데이터베이스를 사용하는 프로젝트에서 코드의 일관성과 유지보수성을 높이는 데 도움이 된다.
문제점 : repair 대상이 아닌 Marine이 들어올 수 있고, repair 대상인 DropShip은 들어오지 못한다는 문제점이 발생한다.
인터페이스 사용
interface Repairable{}
class Robot extends GroundUnit implements Repairable{
//..
}
class Tank extends GroundUnit implements Repairable{
//..
}
class DropShip extends AirUnit implements Repairable{
//..
}
Robot , Tank , DropShip 클래스가 Repairable 인터페이스를 구현했다 .
void repair(Repairable r){ // Repairable 인터페이스를 구현한 클래스의 객체만 가능
if(r instanceof Unit){
Unit u = (unit)r;
while(u.hitPoint !=u.MAX_HP){
u.hitPoint++;
}
}
}
상속 계층도에서 공통점을 찾기 어려울 때는 특정 클래스를 골라 인터페이스를 구성하는 클래스로 바꿔주면 서로 관계없는 클래스들의 관계를 맺어줄 수 있다.
실습
interface Repairable {
// 수리 메소드
void repair();
}
class Unit implements Repairable {
public static final int MAX_HP = 100;
private int hitPoint;
public Unit() {
this.hitPoint = 30;
}
@Override
public void repair() {
while (hitPoint < MAX_HP) {
hitPoint++;
}
}
public int getHitPoint(){
return hitPoint;
}
}
public class RepairTest {
public static void main(String[] args) {
Unit damagedUnit = new Unit();
System.out.println("수리 전 체력: " + damagedUnit.getHitPoint());
repair(damagedUnit);
System.out.println("수리 후 체력: " + damagedUnit.getHitPoint());
}
static void repair(Repairable r) {
if (r instanceof Unit) {
Unit u = (Unit) r;
u.repair();
}
}
}