제네릭과 컬렉션

ChaeHo95·2022년 5월 22일
0

Java

목록 보기
6/10

컬렉션의 개념

컬렉션(collection)은 안드로이드를 비롯한 자바 프로그램을 작성하는 데 빼놓을 수 없는 중요한 도구

배열은 여러 개의 데이터를 다루는 데 편리한 자료 구조이지만, 삽입 삭제가 빈번하고, 데이터의 크기를 예측할 수 없는 응용 프로그램에서는 사용하기 불편하다.

컬렉션은 배열이 가진 고정 크기의 단점을 극복하기 위해 객체들을 쉽게 삽입, 삭제, 검색할 수 있는 가변의 크기의 컨테이너(container)

컬렉션을 위한 자바의 인터페이스와 클래스

  • Vector 배열을 가변 크기로 다둘 수 있게 하고, 객체의 삽입, 삭제, 이동이 쉽도록 구성한 컬렉션 백테는 삽입되는 요소의 개수에 따라 자동으로 크기를 조절하고, 요소의 삽입과 삭제에 따라 자동으로 요소들의 자리 이동

  • ArrayList Vector 클래스와 거의 동일하며, 크게 다른 점은 ArrayList는 스레드 간에 동기화를 지원 하지 않기 때문에 다수의 스레드가 동시에 ArrayList에 요소를 삽입하거나 삭제할 때 ArrayList의 데이터가 훼손될 우려가 있지만 멀티 스레드 동기화를 위한 시간 소모가 없기 때문에, ArrayList는 Vector보다 속도가 빨라, 단일 스레드 응용에는 더 효과적

  • LinkedList List 인터페이스를 구현한 클래스 요소들을 양방향으로 연결하여 관리한다는 점을 제외하고 Vector, ArrayList와 거의 같음
  • Stack 스택을 구현
  • HashSet 집합을 구현

윗 5가지는 모두 Collection를 상속 받고, 단일 클래스의 객체만을 요소로 다루는 공통점이 있음

  • HashMap<K, V> 키(Key)와 값(Value)의 쌍으로 이루어지는 데이터를 저장하고, 키로 쉽게 검색하도록 만든 컬렉션 K는 키로 사용할 데이터 타입을, V는 값으로 사용할 데이터 타입의 타입매개변수 키를 이용하여 동일한 해시 함수를 실행하여 값이 저장된 위치를 알아내어 값을 리턴 해시맵은 해시 함수를 통해 키와 값이 저장되는 위치를 결정하므로, 사용자는 저장된 위치를 알 수 없고, 삽입되는 순서와 들어 있는 위치 또한 관계 없음
    • 해시맵의 장단점 요소의 삽입, 삭제 시간이 매우 빠르다. 요소의 위치를 결정하는 해시 함수가 간단한 코드로 이루어지며 Vector나 ArrayList와 달리 요소의 삽입 삭제 시 다른 요소들의 위치 이동이 필요 없기 때문 요소 검색은 더욱 빠르다 해시맵의 get(key) 메소드가 호출되면 해시 함수가 key가 저장된 위치를 단번에 찾아내므로, Vector나 ArrayList에서처럼 모든 요소들을 하나씩 비교하는 시간 낭비가 없음 인덱스를 이용하여 요소에 접근할 수 없고 오직 키로만 검색해야 함

컬렉션의 특징

  • 제네릭(generice)이라는 기법으로 만들어져 있음 컬렉션 클래스의 이름에는 , , 등이 항상 포함되며, 이들은 ‘타입 매개 변수’라고 하며, 특정 타입만 다루지 않고 여러 종ㅇ류의 타입으로 변신할 수 있도록, 컬렉션을 일반화시키기 위해 를 사용하는 것이며 E를 일반화 시킨 타입 혹은 제네릭 타입(generic type)이라고 부름
  • 컬렉션의 요소는 객체들만 가능 기본 타입의 데이터는 원칙적으로 컬렉션의 요소로 불가능 하지만 기본 타입의 값이 삽입되면 자동 박싱(auto boxing)에 의해 Wrapper 클래스 타입으로 변환되어 객체로 저장

제네릭의 기본 개념

제네릭(generics)은 JDK 1.5 버전부터 도입 되었으며, 모든 종류의 타입을 다룰 수 있도록, 클래스나 메소드를 타입 매개변수(generic type)를 이용하여 선언하는 기법

C++의 템플릿(template)과 동일하며, template는 국어사전에서 ‘형판’이라는 뜻을 가졌으며 다른 말로 ‘본 떠 찍어내기 위해 만들어진 틀’이다.

자바의 제네릭은 클래스 코드를 찍어내듯이 생산할 수 있도록 일반화(generic)시키는 도구

제네릭 타입 매개변수

컬렉션 클래스에서 타입 매개변수로 사용하는 문자는 다른 변수와 혼동을 피하기 위해 일반적으로 하나의 대문자를 사용

  • E Element를 의미하며 컬렉션에서 요소임을 나타냄
  • T type을 의미
  • V Value를 의미
  • K Key를 의미

컬렉션의 순차 검색을 위한 Iterator

Vector, ArrayList, LinkedList, Set과 같이 요소가 순서대로 저장된 컬렉션에서 요소를 순차 검색할 때 Iterator 인터페이스를 사용

Collections 클래스 활용

  • sort() - 컬렉션에 포함된 요소들의 정렬
  • reverse() - 요소를 반대 순으로 정렬
  • max(), min() - 요소들의 최댓값과 최솟값 찾아내기
  • binarySearch() - 이진 검색

제네릭 클래스

기존의 클래스 작성 방법과 유사하지만 클래스 이름 다음에 일반화된 타입(generic type)의 매개변수를 <와> 사이에 추가한다

  • 제네릭 클래스에 대한 레퍼런스 변수 선언 매개변수에 구체적인 타입을 작성
  • 제네릭 객체 생성 - 구체화(specialization) 제네릭 클래스에 구체적인 타입을 대입하여 구체적인 객체을 생성하는 과정을 구체화라고 부르며, 이 과정은 자바 컴파일러에 의해 이루어진다.
  • 타입 매개변수 제네릭 클래스 내에서 제네릭 타입을 가진 객체의 생성의 허용 되지 않음 컴파일러가 제네릭 클래스의 new 제네릭 타입() 라인을 컴파일할 때, 제네릭 타입에 대한 구체적인 타입을 알 수 없어, 호출된 생성자를 결정 할 수 없고, 객체 생성 시 어떤 크기의 메모리를 할당해야 할 지 전혀 알수 없기 때문

제네릭과 배열

제네릭에서는 배열에 대한 제한을 두고 있어, 제네릭 클래스 또는 인터페이스 타입의 배열은 선언 할 수 없음

제네릭 타입의 배열 선언은 허용

제네릭 메소드

클래스의 일부 메소드만 제네릭으로 구현할 수 있음

타입 매개변수는 메소드의 리턴 타입 앞에 선언 된다.

제네릭 메소드를 호출할 때는 컴파일러가 메소드의 인자를 통해 타입을 유추할 수 있어 제네릭 클래스나 인터페이스와는 달리 명시하지 않음

제네릭의 장점

  • 동적으로 타입이 결정되지 않고 컴파일 시에 타입이 결정되므로 보다 안전한 프로그래밍 가능
  • 런타임 타입 충돌 문제 방지
  • 개발 시 타입 캐스팅 절차 불필요
  • ClassCastException 방지

참조 : 명품 JAVA Programming 개정 4판

profile
what you do matters ,but why you it matters much more 당신이 무엇을 하는지는 중요하지만, '왜' 그것을 하는지는 훨씬 더 중요합니다.

0개의 댓글