[자바] 컬렉션과 제네릭

박준수·2022년 11월 6일
0

자바 기본 개념

목록 보기
4/4

컬렉션 : 요소(element) 객체들의 저장소, 객체들의 컨테이너라고 불림

  • 요소의 개수에 따라 크기 자동 조절
  • 요소의 삽입, 삭제에 다른 요소의 위치 자동 이동
  • 고정 크기의 배열을 다루는 어려움 해소
  • 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이

컬렉션의 특징

  • 컬렉션은 제네릭(generic) 기법으로 구현됨
  • 컬렉션의 요소는 객체만 가능

제네릭 : 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메서드를 일반화시키는 기법

  • 제네릭 스택 : Stack<E>
    • E에 특정 타입으로 구체화
    • 정수만 다루는 스택 Stack<Integer>
    • 문자열만 다루는 스택 Stack<String>

제네릭 타입 매개변수

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

Vector<E>

벡터는 배열을 가변 크기로 다룰 수 있게 하고, 객체의 삽입, 삭제, 이동이 쉽도록 구성한 컬렉션 클래스이다.

백터 생성

Vector<Integer> v = new Vector<Integer>(); 

Vector<E> 클래스의 주요 메서드

벡터의 요소 삽입

add()메소드를 이용하면 벡터의 끝이나 중간에 요소를 삽입할 수 있다. 컬렉션의 요소는 객체 타입만 가능하므로 정수를 Integer 객체로 자동박싱하여 삽입한다.

  • v.add(5);
  • v.add(-1);
  • v.add(null);

벡터에는 null도 삽입할 수 있다.

벡터의 활용

ArrayList<E>

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

  • ArrayList<String> a = new ArrayList<>();

컬렉션의 순차 탐색을 위한 Iterator 인터페이스

  • Vector<E>, ArrayList<E>, LinkedList<E>가 상속받는 인터페이스

HashMap<K,V>

키와 값의 쌍으로 구성되는 요소를 다루는 컬렉션

  • K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정
  • 키와 값이 한 쌍으로 삽입
  • 키는 해시맵에 삽입되는 위치 결정에 사용
  • 값을 검색하기 위해서는 반드시 키 이용
  • 삽입, 삭제, 검색이 매우 빠른 특징

LinekdList<E>

List 인터페이스를 구현한 컬렉션 클래스

  • Vector, ArryaList 클래스와 매우 유사하게 작동
  • 요소 객체들은 양방향으로 연결되어 관리됨
  • 요소 객체는 맨 앞, 맨 뒤에 추가 기능
  • 요소 객체는 인덱스를 이용하여 중간에 삽입 가능
  • 맨 앞이나 맨 뒤에 요소를 추가하거나 삭제할 수 있어 스택이나 큐로 사용

LinkedList<String>의 내부 구성

Collections 클래스 활용

  • 컬렉션에 대한 연산을 수행하고 결과로 컬렉션 리턴
  • 모든 메서드는 static 타입
  • 주요 메서드
    • 컬렉션에 포함된 요소들을 정렬하는 sort()메소드
    • 요소의 순서를 반대로 하는 reverse() 메소드
    • 요소들의 최대, 최솟값을 찾아내는 max(), min()메소드
    • 특정 값을 검색하는 binarySearch()메소드

제네릭 클래스와 인터페이스

  • 클래스나 인터페이스 선언부에 일반화된 타입 추가
  • 제네릭 클래스 레퍼런스 변수 선언

구체화 : 제네릭 클래스에 구체적인 타입을 대입하여 구체적인 객체를 생성하는 과정

MyClass<String> s = new MyClass<Stirng>();	// 제네릭 타입 T를 String으로 구체화
s.set("hello");
System.out.println(s.get());

제네릭에서 배열의 제한

  • 제네릭 클래스 또는 인터페이스의 배열을 허용하지 않음
  • GStack<Integer>[] gs = new GStack<Integer>[10]; => 안됨
  • 제네릭 타입의 배열도 허용되지 않음
  • T[] a = new T[10]; => 안됨
  • 타입 매개변수의 배열에 레퍼런스는 허용
  • public void myArray(T[] a) { ... }

제네릭 메소드 예제

T가 타입 매개변수인 제네릭 메소드

제레릭의 장점

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

0개의 댓글