본문 바로가기

자바 자료구조 & 알고리즘/자바로 배우는 핵심 자료구조와 알고리즘

자바로 배우는 핵심 자료구조와 알고리즘 : 1장 인터페이스

내가 공부하고 있는 것에 비해 많이 이르지만 이 책을 공부해보려고 한다.

http://www.yes24.com/Product/Goods/61198657

 

자바로 배우는 핵심 자료구조와 알고리즘

자료구조와 알고리즘을 활용하여 간단한 웹 검색 엔진 만들기이 책은 컴퓨터과학을 공부하거나 기술 인터뷰를 준비하는 소프트웨어 개발자를 위한 실용적인 책입니다. 자료구조와 알고리즘을

www.yes24.com

1.1. 리스트가 두 종류인 이유

자바의 List 인터페이스에는 ArrayList와 LinkedList 두 가지 리스트의 구현을 제공했다. 그 이유는 무엇이며, 어떤 때에 어느 것을 선택해야할지에 대한 답을 찾을 것이다. 이를 위해서 이들의 동작 방법과 장단점을 배울 것이다.

1.2. 자바 interface 

자바의 interface는 메서드 집합을 의미한다. 이 interface를 구현하는 클래스는 이러한 메서드를 직접 구현하여 제공해야한다. java.lang 패키지에 정의된 Comparable interface의 소스 코드는 다음과 같다. 

public interface Comparable<T> {
  public int compareTo(T o);
}

그리고 이를 구현하고 있는 Integer 클래스의 소스코드는 다음과 같다.

public final class Integer extends Number Implements Comparable<Integer> {
  public int compareTo(Integer anotherInteger) {
    int this.Val = this.value;
    int anotherVal = anotherInteger.value;
    return (this.Val < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
  }
  // 다른 메서드 생략
}

Integer 클래스는 Number 클래스를 확장하고 Comparable<Integer> 인터페이스를 구현한다. 또한 Integer 객체를 인자로 받고 int를 반환하는 compareTo ()메서드를 제공한다. 

클래스가 interface를 구현한다고 선언하면 컴파일러는 interface가 정의한 모든 메서드를 제공하는지 확인한다.

 

1.3. List interface

JCF(Java Collection Framework)는 List 라는 interface를 정의하고 arrayList와 LinkedList라는 두 구현 클래스를 제공한다. interface는 List가 된다는 의미를 정의하며 이 interface를 구현하는 클래스는 add, get, remove등의 메서드를 포함한 메서드 집합을 제공해야한다.

package com.allendowney.thinkdast;

import java.util.ArrayList;
import java.util.List;

public class ListClientExample {
  @SuppressWarnings("rawtypes")
  private List list;

  @SuppressWarnings("rawtypes")
  public ListClientExample() {
    list = new ArrayList();
  }
    
  @SuppressWarnings("rawtypes")
  public List getList() {
    return list;
  }

  public static void main(String[] args) {
    ListClientExample lce = new ListClientExample();
    @SuppressWarnings("rawtypes")
    List list = lce.getList();
    System.out.println(list);
  }
}

위의 코드는 list를 캡슐화하는 기본적인 클래스의 형태이다. List형의 레퍼런스 변수를 갖고 있으며 생성자를 통해 ArrayList 객체를 만들어 list 변수를 초기화한다. 그리고 게터 메서드를 통해 list 객체를 리턴받을 수 있도록 하고 있다. 

 

이런 스타일을 인터페이스 기반 프로그래밍 또는 간단하게 인터페이스 프로그래밍이라고 한다. 이와 같은 방식으로 클래스를 구현하면 ArrayList가 아니라 LinkedList 클래스를 사용하고자 할 때 다른 코드는 놔두고 생성자의 코드만 바꾸면 된다. 물론 변수의 타입을 ArrayList나 LinkedList로 변경할 수도 있지만 이는 과다 지정(oberspecified)로 나중에 인터페이스로 돌아가려면 더 많은 코드를 수정해야할 수도 있다.