[java]제네릭과 컬렉션

최재정·2022년 5월 16일
0

java

목록 보기
1/2

컬렉션

컬렉션은 자료구조와 관련된 도구를 제공해주며 제네릭이라는 기법으로 구현되어 있다. 컬렉션은 배열과 달리 가변적 특성을 가지기 때문에 객체의 개수를 염려할 필요가 없다. 또한 삽입, 삭제, 사이즈 조정 등이 가능하다. 배열에서는 불가능한 기능들을 가지고 있기 때문에 배열의 한계를 극복하기 위해 만들어진 것이라고 보면 된다.

컬랙션의 특징

  • 객체만 담을 수 있다. 따라서 int, char, float과 같은 원시 자료형은 컬렉션의 요소가 될 수 없으며 wrapper 클래스가 들어가야 하지만 최근의 자바 버전에서는 원시 자료형을 입력해도 자동적으로 wrapper 클래스로 변환해서 들어가기 때문에 원시 자료형 형태로 입력해도 크게 문제가 될 것은 없다.박싱/언박싱 참조
  • 제네렉을 기반으로 하여 만들어졌기 때문에 클래스를 정의하거나 객체를 생성시 클래스 이름 옆에 항상 타입 매개변수(,<K>,<V>등)가 붙는다.
  • 함수의 인자가 될 수 있다. 다만 이 경우 제네릭 타입이 정의된 상태이어야 한다.

제네릭

제네릭은 모든 종류의 타입에 오류 없이 적용될 수 있도록 고안된 일반화된 타입 매개면수이다. 제네릭을 표시하기 위해서는 <>가 사용되는데 이것을 제네릭 타입이라고 한다. <>안에는 하나의 대문자를 집어넣어 타입 매개변수를 표시하는데 가장 많이 사용되는 문자는 다음과 같다.

  • E: element의 앞글자로 내부 요소로 쓰인다
  • T : type
  • K : key
  • V : value
    제네릭은 일반화된 타입 매개변수이기 때문에 무엇이든 될 수 있으며 객체 생성시 원하는 타입(ex: String, Integer 등)을 지정해주면 지정한 타입만 다룰 수 있게 해준다. 예를 들어 stack <E> 클래스는 Integer와 같이 <E>자리에 구체적인 타입을 지정하면 클래스 내부에서 그 타입만을 클래스의 요소로 취급한다. 타입을 지정하기 전까지는 클래스 내부의 모든 요소는 E로 일반화되어 있으며 타입 지정 후에는 해당 타입으로 바뀌는 것이다.

컬랙션 클래스

컬랙션의 클래스는 collection이라 불리는 최상위 인터페이스에서 상속받은 서브 인터페이스 Set, List, Queue로부터 용도에 맞게 상속 받은 HashSet, ArrayList, Vector, LinkedList, HashMap, Stack 등의 클래스들을 말한다.

Vector <E> (List로부터 상속)

vector는 가변개수의 배열이 필요할 때 적합하다. vector에 요소를 삽입하면 자동적으로 크기를 조절하는데 삽입의 위치는 앞, 뒤, 중간이 될 수 있으며 이는 클래스 내부에서 자동적으로 지정된다. 맨 끝에 삽입되지 않는 이상 요소가 삽입되면 뒤에 있는 요소들은 한칸 씩 밀려나게 된다.

생성

//생성시 E에 요소로 들어갈 타입을 꼭 지정해주어야한다. 
Vector<integer> v = new Vector<Integer>();

만약 타입을 지정해주지않으면 컴파일 시에 오류가 발생한다. 클래스가 어떤 타입을 요소로 하는지 컴파일러가 알 수 없기 때문이다.
벡터는 자신의 용량을 스스로 조절 할 수 있기 때문에 굳이 용량을 지정해줄 필요는 없지만 만약 그렇게 해야한다면 다음과 같이 작성하면 된다

Vector<integer> v = new Vector<integer>(10);
//초기 용량 10을 갖는 vector 객체 생성

요소 삽입(v객체 생성 이후)

v.add(integer(7)); // 요소 7 삽입
v.add(5); //jdk 1.5 이상부터는 원시자료형도 가능
v.add(null);// null도 삽입 가능

지정한 위치에 요소 삽입

v.add(3,2);//인덱스3에 정수 2 삽입

이 경우 삽입할 인덱스에 있던 요소와 그 뒤에 있는 나머지 요소들은 뒤로 한 칸씩 밀려난다.
벡터 내 요소 알아내기

v.get(1);//인덱스 1에 존재하는 요소 반환

벡터 크기 구하기

v.size();//크기 반환

용량 구하기(크기와 다르다)

v.capacity(); // 해당 벡터가 수용할 수 있는 용량 반환

요소 삭제

v.remove(1); 인덱스1에 위치한 요소 삭제

이 경우 뒤에 있던 요소들이 한 칸씩 앞으로 이동한다. 모든 요소를 삭제하길 원한다면

v.removeAllElement(); //개같이 멸망

ArrayList <E> (List로부터 상속)

arraylist 클래스는 벡터와 거의 유사한 기능을 가지고 있다. 차이점이 있다면 arraylist는 스레드 동기화을 지원하지 않는 반면 vector는 지원된다는 점이다. 이것이 의미하는 것은 다수의 스레드가 arraylist를 사용하는 것이 vector와 다르게 불가능하다는 점이다. 이 점을 제외하고는 대부분의 기능이 vector와 유사하다.
생성

ArrayList<String> a = new ArrayList<Sring>(7\); //String만 다룰 수 있는 arraylist객체 생성

삽입,반환,크기,삭제

a.add(4);//요소 4 삽입. null도 가능
a.add(1,"java"); //인덱스1에 문자열 요소 삽입
a.get(1); //인덱스1에 위치한 요소 반환
a.size();//크기
a.remove(1);//인덱스1의 요소 삭제
a.clear();요소 전체 삭제

Iterator <E>

위의 vector, arraylist와 같은 리스트 형태의 컬렉션에서 요소를 순차적으로 검색할때 유용하게 사용되는 컬렉션 클래스이다. 일반적으로 반복문과 iterator의 메서드를 이용해 요소를 검색한다.
생성

vector<Integer> v = vector<Integer>(); //interger요소를 사용하는 vector객체 생성
Iterator<Integer> I = v.iterator(); //ierator()메서드를 호출하여 ieterator 객체 생성 후  Iterator타입 레퍼런스 변수 I에 할당

I가 v의 요소 타입(integer)을 따라야 한다는 것을 주의하자.
자주 사용되는 메서드

boolean hashNext();// 다음 반복에 사용될 요소가 있으면 true반환
E next(); // 다음 요소 반환. E는 객체 생성하며 타입을 지정할 때 그 타입에 맞게 바뀜
void remove();// 마지막으로 반환된 요소를 제거해준다

HashMap <K,V> (Map으로부터 상속)

hashmap은 키(k)와 값(v) 쌍으로 구성되는 요소를 다루는 컬렉션 클래스이다.
k: 사용할 데이터 타입
v: 그 타입의 값
생성 및 삽입, 반환

HashMap<String,String> h = new HashMap<String,String>();// k,v가 String인 hashmap 객체 생성
h.put("컵","cup")//k와 v에 순서대로 String 삽입
h.get("컵")// "컵"에 해당하는 값 찾기

hashmap내부에는 key table과 value table이 존재한다. put 메서드를 이용해 키와 값을 삽입할때 두 값은 같은 인덱스 상의 table에 각각 입력되기때문에 키만 알면 get 메서드를 이용해 해당 키의 인덱스를 value table에서 찾아 v값을 얻을 수 있다.

  • remove를 이용해 키와 값을 삭제할 수 있다. 인자에 키를 입력하면 된다. 크기를 구하고 싶은 경우 size를 사용하면 된다.

Collections 클래스의 메서드 유틸리티

  • sort(): 요소 정렬
  • reverse(): 반대순으로 요소 정렬
  • max(),min(): 최댓값과 최솟값 반환
  • binarySearch(): 이진 탐색
    위 메서드들의 인자는 컬렉션 객체이며 static으로 선언되어 있기 때문에 따로 선언 없이 사용할 수 있다.
profile
초짜 개발자의 개발일지

0개의 댓글