자바의 컬렉션

mDev_97·2022년 1월 7일
1

Java

목록 보기
14/28

컬렉션 (Collection)

• 요소(element) 객체들의 저장소
• 요소들의 개수에 따라 크기를 자동으로 조절 (가변 크기)
• 요소 삽입, 삭제에 따른 요소의 위치를 자동으로 이동시킨다.
제네릭(generics) 기법으로 구현된다.
• 컬렉션의 요소는 객체만 가능 (기본 타입은 사용 불가)

※ 제네릭
• 여러 종류의 타입을 사용할 수 있도록 클래스나 메소드를 일반화시키는 기법
• 일반화된 타입 매개 변수로 클래스나 메소드를 작성

Vector < E >

• java.util.Vector에 존재
• E 대신에 요소로 사용할 특정 타입으로 구체화
• 배열의 길이 제한 극복
자동으로 길이 조절
삽입 가능한 것 : 객체, null, Wrapper 객체로 기본 타입 삽입 가능
• 객체 삭제 후 자동 자리 이동

// 아래와 같이 선언
Vector<Integer> v = new Vector<Integer>();

boolean add(E element) // 벡터 맨 뒤에 element 추가
void add(int index, E element) // 벡터의 index에 element 삽입
int capacity() // 벡터의 용량 리턴
int size() // 벡터의 요소의 개수 리턴
void clear() // 벡터의 모든 요소 삭제
boolean contains(Object o) // 벡터가 o를 포함하는지를 리턴
E element(int index) // index 위치의 요소를 리턴
E get(int index) // index 위치의 요소를 리턴
boolean isEmpty() // 벡터가 비어있는지를 리턴
E remove(int index) // index 위치의 요소를 삭제
boolean remove(Object o) // o 객체의 첫 번째 요소를 삭제
void removeAllElements() // 벡터의 모든 요소를 삭제
int indexOf(Object o) //  o 객체의 첫 번째 요소의 인덱스 리턴

컬렉션의 자동 박싱/언박싱

Vector<Integer> v = new Vector<Integer>();
v.add(5); // Integer.valueOf(5) 자동 박싱
int i = v.get(0); // Integer 타입이 int 타입으로 자동 언박싱

Vector<int> v = new Vector<int>(); // 오류
// 제네릭의 타입 매개 변수를 기본 타입으로 구체화할 수 없다.
// Wrapper 객체 이용

벡터의 예

import java.util.Vector;

public class VectorExample {

    public staticx void printVector(Vector<Integer> v) {
        for(int i=0; i<v.size(); i++) {
            int n = v.get(i);
            System.out.println(n);
        }
    }

    public static void main(String[] args) {
        Vector<Integer> v = new Vector<Interger>();
        // Integer 타입 벡터 구체화
        
        v.add(10); // 정수 10 삽입
        v.add(2); // 정수 2 삽입
        
        v.add(1,, 4); // index 1에 정수 4 삽입
        
        System.out.println("벡터의 요수 개수 : " + v.size());
        System.out.println("벡터의 용량 : "  + v.capacity());
        
        // 벡터 모든 요소 출력하기
        for(int i=0; i<v.size(); i++) {
            int n = v.get(i); // 인덱스 i의 요소를 리턴
            System.out.println(n);
        }
    }
}

• 실행 결과

벡터의 요소 개수 : 3
벡터의 용량 : 10
10
4
2
컬렉션 매개변수 메소드 사용
10
4
2



ArrayList < E >

• java.util.ArrayList
가변 크기의 배열을 구현한 클래스
삽입 가능한 것 : 객체, null, Wrapper 객체로 기본 타입 사입
• 벡터와 다르게 스레드 동기화 기능이 없다.

ArrayList<Integer> al = new ArrayList<Integer>();

boolean add(E element) // 맨 뒤에 element 추가
void add(int index, E element) // index에 element 삽입
void clear() // 모든 요소 삭제
boolean contains(Object o) // 객체 o가 포함되어 있는지를 리턴
E elementAt(int index) // index 위치의 element 리턴
E get(int index) // index 위치의 element 리턴
int indexOf(Object o) // 객체 o의 첫 번째 index 리턴
boolean isEmpty() // ArrayList가 비어있는지를 리턴
E remove(int index) // index 위치의 element 삭제
boolean remove(Object o) // 객체 0의 첫 번째 element를 삭제
int size() // 요소의 개수를 리턴

ArrayList< E > 예제

import java.util.*;

// 정수를 입력받아 ArrayList에 저장하기
public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList<Integer> al = new ArrayList<Integer>();
        
        Scanner sc = new Scanner(System.in);
        for(int i=0; i<5; i++) {
            System.out.print("추가할 정수를 입력하세요 : ");
            int n = sc.nextInt();
            al.add(n);
        }
        
        // ArrayList의 모든 element를 출력
        for(int i=0; i<al.size(); i++) {
            int n = al.get(i);
            System.out.print(i + " ");
        }
        System.out.println();
        
        // ArrayList의 요소 중 가장 큰 정수 알아내기
        int maxElement = al.get(0);
        for(int i=1; i<al.size(); i++) {
            if(maxElement < al.get(i)) {
                max = al.get(i);
            }
        }
        System.out.println("가장 큰 정수는 " + maxElement + "이다.");
        sc.close();
    }
}

• 실행 결과

추가할 정수를 입력하세요 : 10
추가할 정수를 입력하세요 : 2
추가할 정수를 입력하세요 : 31
추가할 정수를 입력하세요 : 20
추가할 정수를 입력하세요 : 5
10 2 31 20 5
가장 큰 정수는 31이다.



Iterator < E > 인터페이스

• 리스트 구조인 컬렉션에서 element를 순차적으로 검색하기 위해 사용
• 순차적으로 검색하는 메소드를 포함한다.

Vector<Integer> v = new Vector<Integer>();
Iterator<Integer> it = v.iterator();
// Iterator 객체를 반환
// 인덱스 없이 순차적으로 검색이 가능하다.

while(it.hasNext()) {
    int n = it.next();
    ....
}

boolean hasNext() // 다음 element가 있지는를 리턴
E next() // 다음 element 리턴
void remove() // 마지막에 리턴된 element를 삭제

Iterator 사용 예제

import java.util.*;

public IteratorExample {
    public static void main(String[] args) {
        Vector<Integer> v = new Vector<Integer>();
        v.add(2);
        v.add(3);
        v.add(1, 10);
        
        // for 문을 이용한 벡터 요소 출력
        System.out.println("for 문을 이용한 벡터 요소 출력");
        for(int i=0; i<v.size(); i++) {
            int n = v.get(i);
            System.out.print(n + " ");
        }
        System.out.println();
        
        // Iterator를 이용한 벡터 요소 출력
        System.out.println("Iterator를 이용한 벡터 요소 출력");
        Iterator<Integer> it = v.iterator();
        while(it.hasNext()) {
            int n = it.next();
            System.out.print(n + " ");
        }
    }
}

• 실행 결과

for 문을 이용한 벡터 요소 출력
2 10 3
Iterator를 이용한 벡터 요소 출력
2 10 3



HashMap <K, V>

• java.util.HashMap
• 키(Key)와 값(Value)의 쌍으로 구성되는 요소(element)를 다루는 컬렉션
K : 키 요소의 타입
V : 값 요소의 타입
• 키와 값이 한 쌍으로 삽입된다.
• 키는 삽입되는 위치 결정에 사용된다.
• 값을 결정할 경우에는 반드시 키를 사용하여야 한다.
• 삽입, 삭제, 검색이 빠르다.

HashMap<String, Integer> hm = new HashMap<String, Integer>();

void clear() // 모든 element 삭제
boolean containsKey(Object key) // 해당 key를 가지고 있는지를 리턴
boolean containsValue(Object value) // 해당 value를 가지고 있는지를 리턴
V get(Object key) // 해당 key가 지정하는 value 값을 리턴, 반드시 키를 통해서 검색
boolean isEmpty() // 비어있는지를 리턴
Set<K> keySet() // 해시맨의 모든 키를 Set<K>로 리턴
V put(K key, V Value) // key와 value 쌍을 해시맵에 삽입
V remove(Object key) // 해당 key와 대응되는 value를 함께 삭제
int size()  // element의 개수를 리턴

HashMap<K, V> 예제

import java.util.*;

// 과일 가격표 예제
public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        
        hm.put("사과", 3000);
        hm.put("배", 2000);
        hm.put("메론", 5000);
        hm.put("딸기", 4000);
        
        Scanner sc = new Scanner(System.in);
        while(true) {
            System.out.print("가격을 알고 싶은 과일을 입력하세요 : ");
            String fruit = sc.next();
            if(fruit.equals("end")) {
                System.out.println("검색을 종료합니다.");
                break;
            }
            Integer price = hm.get(fruit);
            // 없으면 null을 리턴
            if(price == null) {
                System.out.println(fruit + "는 없는 과일입니다.");
            } else {
                System.out.println(fruit + "는 " + price + "원입니다.");
            }
        }
        sc.close();
    }
}

• 실행 결과

가격을 알고 싶은 과일을 입력하세요 : 사과
사과는 3000원입니다.
가격을 알고 싶은 과일을 입력하세요 : 배
배는 2000원입니다.
가격을 알고 싶은 과일을 입력하세요 : end
검색을 종료합니다.

HashMap과 Iterator 사용 예제

import java.util.*;

// 과일 가격과 Iterator 사용
public class HashMapAndIteratorExample {
    public static void main(String[] args) {
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        
        hm.put("사과", 3000);
        hm.put("배", 2000);
        hm.put("메론", 5000);
        hm.put("딸기", 4000);
        
        Set<String> keySet = hm.keySet();
        // hm의 키 컬렉션 리턴
        
        Iterator<String> it = keySet.iterator();
        // keySet 컬렉션에 순서대로 접근할 수 있도록 iterator 리턴
        
        while(it.hasNext()) {
            String fruit = it.next();
            int price = hm.get(fruit);
            System.out.println(fruit + "의 가격은 " + price + "원입니다.");
        }
    }
}

• 실행 결과

배의 가격은 2000원입니다.
사과의 가격은 3000원입니다.
메론의 가격은 5000원입니다.
딸기의 가격은 4000원입니다.

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글

관련 채용 정보