본문 바로가기

Java/이론

[Java] 컬렉션(Collection)

배열을 만들때는 사이즈가 고정되어 있어서

사이즈를 모르면 배열을 만들지 못합니다.

사이즈는 변경 불가능하기 때문에

컬렉션(Collection)이라는 것을 사용합니다.

컬렉션은 자바에서 자료 구조를 표현한 클래스들을 지칭하는 용어입니다.

여기서 자료구조(data structure)란 자료를 저장하기 위한 구조입니다.

 

컬렉션은 크게 3가지로 나뉩니다.

 

List 계열 : 사이즈를 바꿀 있음(가변사이즈 O)

요소마다 순서가 있는 자료구조로 중복된 요소를 가질 있음

 

Set 계열(잘 안쓰임) : 가변사이즈 O / 중복데이터를 자동으로 삭제

순서가 랜덤

 

Map 계열: 가변사이즈O / Key, Value가 한 쌍

Key를 불렀을 때 Value가 호출

순서에 대한 개념이 없음

 

먼저 List계열인 ArrayList를 살펴보겠습니다.

요소를 인덱스로 사용하는 것이 배열과 유사합니다.

배열은 사이즈가 고정이라 데이터의 수가 배열의 크기보다 많아지면

저장이 불가능하지만,

ArrayList는 저장되는 데이터의 수에 따라서 크기가 자동적으로 변경됩니다.

요소가 가득차게 되면 ArrayList의 크기를 동적으로 변경하고

  반대도 마찬가지입니다.

자료형을 섞어서 데이터를 넣는 것이 가능합니다.

 

ArrayList test = new ArrayList();

test.add("하하하");

test.add("호호호");

test.add(1225);

 

다음과 같이 ArrayList객체를 선언해서 사용할 수 있는데

자료형이 섞어서 들어올 수 있습니다.

ArrayList

 

그런데 자료형이 섞어서 들어오면

객체가 무슨 형인지 알 수 없기 때문에 불편한데요.

따라서 자료형을 고정하기 위한 generic이란 기능이 있습니다.

generic은 객체를 생성할 때 <> 기호를 사용합니다.

 

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

 

이때 generic의 요소는 Wrapper 클래스가 들어오게 됩니다. (String, Integer, Double 등등..)

 

ArrayList는 get 메소드를 사용해서 해당 인덱스의 값을 가져올 수 있고,

size()메소드를 사용해서 요소 갯수를 가져올 수 있습니다.

 

for(int i = 0; i < al.size(); i ++) {

System.out.println(al.get(i));

}

 

그러면 이렇게 모든 리스트의 요소를 출력할 수 있겠네요.

 

test.add("하하하");

test.add("호호호");

test.add(1225);

 

그리고 add메소드를 사용해서

요소를 추가할 수 있습니다.

 

test.add(2,3333);

 

첫번 째 파라미터를 인덱스 번호를 넣어주면

해당 인덱스의 값을 추가할 수 있습니다.

 

test.set(2, 0);

 

set을 사용하면 첫번째 파라미터의 인덱스에 해당하는 값을

변경할 수 있습니다.

 

test.remove(2);

 

remove를 사용하면 파라미터의 인덱스에 해당하는

요소를 제거할 수 있습니다.

 

 

 

정렬 기능도 살펴보겠습니다.

Comperator란 객체를 사용해서

정렬하고 싶은 자료형을 넣어주고

compare함수를 내림차순 또는 오름차순으로

오버라이드합니다.

그 다음 sort메소드를 사용하면 됩니다.

 

Comparator<String> c = new Comparator<String>() {

@Override

public int compare(String o1, String o2) {

// TODO Auto-generated method stub

return o1.compareTo(o2); // 오름차순

return 02.compareTo(01); // 내림차순

}

 

};

al.sort(c);

 

다음으로 Set계열은 같은 내용이 여러번 들어오면 하나만 남깁니다.

HashSet, TreeSet등이 있는데

실전에서 잘 사용하지는 않습니다.

그래서 넘어가도록 하겠습니다.

 

Map계열은 Python에선 dict로 사용하고

Object-C에서는 NSDictionary로 사용합니다.

가변사이즈이며

<Key, Value>가 한 쌍으로 다니기 때문에

각 값들을 지정해 줘야 합니다.

Map은 순서에 대한 개념은 없습니다.

HashMap, HashTable 등이 있는데

HashMap에 대해서 알아보겠습니다.

 

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

hm.put("아메리카노", 4000);

hm.put("녹테마레", 5000);

hm.put("레몬에이드", 6000);

System.out.println(hm.get("녹차라떼"));

 

HashMap을 하나 만들고

키와 Value값을 집어 넣습니다.

이때 get메소드를 쓰면 

해딩 인덱스 값을 불러오는 것이 아닌

키에 해당하는 Value 값을 가져옵니다.

 

hm.put("아메리카노", 4000);

hm.put("녹테마레", 5000);

hm.put("레몬에이드", 6000);

hm.put("녹테마레", 7000);

 

만약 키값이 중복이면 

나중에 들어온 Value값이

해당 키의 값으로 변경되게 됩니다.

 

for (String s : hm.keySet()) {

System.out.println(s);

}

 

키의 값을 출력하고 싶으면 

keySet이라는 메소드를 사용합니다.

get메소드를 사용하면 Value값이 나오게 됩니다.

 

이번 시간에는 컬렉션에 대해서 알아봤는데요.

가변사이즈의 배열을 만들어서 

사용할 수 있는 것이

배열의 단점을 보완한 큰 메리트인 것 같습니다.

 

'Java > 이론' 카테고리의 다른 글

[Java] DB연동 후 Insert하기  (0) 2025.01.07
[Java] Database 연동  (1) 2025.01.07
[Java] HTTP - JSON  (0) 2024.12.19
[Java] String 기능 - 분리  (0) 2024.12.17
[Java] String 기능  (0) 2024.12.17