켄트백의 구현패턴-컬렉션(1)

컬렉션

컬렉션의 개념은 여러가지 메타포를 혼합한 것이다. 과거 컬렉션과 유사한 행위는 자료구조 자체에 링크를 넣는 방식으로 구현

컬렉션은 프로그래밍에 있어 가장 근본적인 변형인 몇 개의 데이터를 사용하느냐를 표현한다는 점에서 중요하다.
로직의 변경은 조건문이나 다형성 메시지를 통해 표현할수 있다. 하지만 데이터 갯수의 변형은 컬렉션에 데이터를 집어 넣는것으로 표현한다.

컴터분야에 흔히 하는 이야기로 사람들이 관심을 갖는 숫자는 0, 1, 많이로 표현된다.

  • 0 : 필드를 사용하지않는 것
  • 1 : 필드를 사용하는것
  • 많이 : 컬렉션을 사용하는것

컬렉션은 프로그래밍 언어와 라이브러리의 중간쯤에 위치한다.

메타포

컬렉션에 녹아있는 메타포

  • 여러 값을 가진 변수 - 컬렉션의 변수는 여러 객체를 한번에 가리키는 역활을 한다.
  • 객체 - 자바에서는 컬렉션을 별도의 객체로 취급한다 그래서 동등성 비교도 가능하며 인자로도 전달가능, 여러 컬렉션의 값을 얻을수도 있다.
  • 수학적 집합 - 수학에서 집합이 여러 원소의 모임인 것과 마찬가지로 컬렉션은 객체의 모임이다. 집합의 크기(size)를 구하고 소속성 테스트(contains)도 가능하다.(부분적으로 적용)

컬렉션은 인자로 전달 가능한 객체로 구현되므로 변수 값이 아닌 변수 자체를 인자로 전달하는 참조호울의 효과를 얻을수 있다.
참조 호출은 예상치 못한 결과를 가져올 수 있기 때문에 수십년간 프로그래밍 언어에서는 참조 호출을 기본적으로 지원하지 않아 왔다.

이슈

원칙적으로 프로그램을 작성할 때는 가급적 정확하게 작성해야 한다.

컬렉션이 표현하는 개념

  • 크기 - 배열은 생성시 고정된다. 하지만 컬렉션은 중간에 크기를 수정할수 있다.
  • 순서 - 원소간에 순서에 의미가 있는지 여부
  • 원소의 독자성 - 일부 연산에는 원소가 속해있는지만 중요하지만 어떤 연산에는 원소가 몇번째에 있는지가 중요할때도 있다.
  • 성능에 대한 프로그래머의 의도를 전달해준다. - 선형 탐색이 충분히 빠르면 collection을 사용해도 충분하다 컬렉션이 커지면 set나 map을 사용해야 한다.

인터페이스

배열

배열은 가장 단순한 컬렉션 인터페이스다.
단순한 연산의 경우 배열은 다른 컬렉션에 비해 시간, 공간 모든 면에서 효율적이다.
하지만 대부분의 경우 유연성 문제 떄문에 배열보다는 다른 컬렉션 사용하는 편이 좋다.
일부에서 성능이 중요한 경우라면 배열을 사용하는 것도 좋다.

Iterable

어떤 변수를 Iterable로 선언하는 것은 그변수가 여러 개 값을 갖고 있음을 뜻할뿐이다.
java 5의 loop의 근간을 이룬다.

Collection

Collection은 Iterable을 상속하며 원소 추가, 삭제, 검색, 크기 측정 등의 메소드를 추가로 지원한다.
구현 클래스는 몇가지 옵션을 갖게 된다. 선언을 가급적 일반적인 인터페이스로 남겨두면 코드를 크게 바꾸지 않고서도 나중에 구현 클래스를 쉽게 바꿀수있다.

컬렉션은 수학에서의 집합과 유사하다. 하지만 합집합,교집합,차집합과 같은 연산의 결과로 컬렉션 자체를 바꾸는 대신 새로 할당된 컬렉션을 반환한다.

List

List는 Collection을 기반으로 해서 원소 간에 정해진 순서를 부여한 것

Set

Set은 중복 원소를 허용하지 않는 컬렉션이다. 집합과 개념은 비슷하지만 원소를 추가하면 컬렉션 자체가 바뀐다는점에서 집합과 틀리다.

set은 순서가 없다.

SortedSet

순서는 유지되지만 중복 원소가 없는 컬렉션이다.

Map

Map은 List 처럼 키를 사용해서 원소를 저장하지만, List가 정수만을 키로 사용할수 있는 반면 Map은 임의의 객체를 키로 사용할수 있다.

Map은 내부적으로 키에 대한 컬렉션과 데이터에 대한 컬렉션 2개를 유지한다.

  • 외재상태 - 어떤 객체에 대한 정보를 객체 외부의 저장 키를 객체로 데이터를 상태로한 Map을 사용하면 된다.
  • 변수상태 - 같은 클래스에 속한 각 인스턴스마다 다른 종류의 데이터 필드를 갖는 것을 의미한다.

참조