minOS

자바의 정석 ch7-39 인터페이스의 장점2 본문

TIL/남궁성의 자바의 정석

자바의 정석 ch7-39 인터페이스의 장점2

minOE 2024. 1. 9. 01:36
728x90

ch7-39 인터페이스의 장점

1)개발 시간을 단축할 수 있다.

예시) 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;
    }

    // 다양한 다른 메소드들도 있겠지만 여기에서는 일부만 표현
}​

 

2)변경에 유리한 유연한 설계가 가능하다.

https://onepunchprogram.tistory.com/29 참고

 

 

자바의 정석 ch7-39 인터페이스의 장점1

ch7-39 인터페이스의 장점 - 두 대상(객체)간의 '연결,대화,소통'을 돕는 '중간 역할'을 한다. 기계가 바뀌어도 사용자에게 영향을 미치지 않으므로 변경에 유리하다. - 선언(설계)와 구현을 분리시

onepunchprogram.tistory.com

 

3) 표준화가 가능하다.

예시) Oracle과 MySQL은 JDBC 인터페이스를 구현하여 자체적인 드라이버를 제공한다. 개발자는 JDBC API를 사용하여 이들 드라이버와 통신하고, 데이터베이스와의 상호 작용을 일반적으로 처리할 수 있다. 이는 다양한 데이터베이스를 사용하는 프로젝트에서 코드의 일관성과 유지보수성을 높이는 데 도움이 된다.

 

 

4) 서로 관계없는 클래스들을 관계 맺어줄 수 있다.

예시) Robot, Tank, DropShip 을 수리한다 가정하자

오버로딩
void repair(Tank t){
    // Tank를 수리한다.
        }

void repair(DropShip p){
    //DropShip을 수리한다.
        }​

문제점 : 이런 식으로 코드를 짜면 수리할 클래스의 개수만큼 repair 메서드를 오버로딩 해야한다.


다형성 이용
void repair (GroundUnit gu){
    // 매개변수로 넘겨진 지상유닛(GroundUnit)을 수리한다.
        }

 

문제점 : 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();
        }
    }
}
출력


728x90