250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- http 메시지 컨버터
- 오버라이딩
- 서블릿
- 의존관계
- 참조변수
- 코딩테스트
- 프록시
- 코드트리조별과제
- 김영한
- DI
- 테스트코드
- JSON
- HttpServletResponse
- 다형성
- 스프링컨테이너
- 오블완
- 스프링
- html form
- @configuration
- java
- ocp
- 추상클래스
- fielderror
- 코드트리
- 티스토리챌린지
- 인터페이스
- equals()
- objecterror
- 싱글톤
- 백준
Archives
- Today
- Total
minOS
자바의 정석 ch7-39 인터페이스의 장점2 본문
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 참고
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
'TIL > 남궁성의 자바의 정석' 카테고리의 다른 글
자바의 정석 ch7-42~44 내부클래스의 종류, 특징, 선언 (2) | 2024.02.11 |
---|---|
자바의 정석 ch7-40 디폴트 메서드와 static 메서드 (0) | 2024.01.12 |
자바의 정석 ch7-39 인터페이스의 장점1 (0) | 2024.01.08 |
자바의 정석 ch7-38인터페이스와 다형성 (4) | 2024.01.04 |
자바의 정석 ch7-35~37 인터페이스의 선언, 상속, 구현 (0) | 2024.01.02 |