Collection


지금까지 배운 변수와 배열 클래스의 단점을 살펴보자.


변수

- 하나밖에 처리 못한다.


배열

1. 여러개를 처리할 수 있으나 데이터 타입이 정해진 것만 써야한다. -> 클래스로 해결가능

2. 크기가 정해져 있다. -> 연결리스트 알고리즘으로 해결가능

3. 삽입 삭제가 불가능하다. -> 연결리스트 알고리즘으로 해결가능

   (배열은 데이터를 저장 할 때 좋다.)


클래스

- 다른 데이터 타입으로 묶을 수 있다.

(다른 배열의 단점을 해결하지 못한다.)



배열의 모든 단점을 깔끔하게 해결 할 수는 없을까?


컬렉션 (Collection)

배열의 모든 단점을 해결

- 컬렉션 = 클래스 + 알고리즘


그럼 항상 컬렉션을 쓰면 되지 않을까?


그렇지 않다.


배열을 쓸 수 있다면 배열을 쓰는 것이 가장 빠르다.


java.util. 에 컬렉션이 모여있다.


클래스를 잘 알고 싶으면 부모를 공부해라

컬렉션 클래스를 알고 싶으면 부모인 컬렉션 인터페이스를 공부하라


대표적인 컬렉션 클래스를 살펴보자.


1. set 인터페이스

- 자주 꺼내쓰지 않는 경우


1) 저장용도

2) 중복제거

3) 정렬 순서가 없다.

  - 임의로 데이터가 저장된다.

4) 대표적인 클래스

  - HashSet, LinkedHashSet, TreeSet ...


2. List 인터페이스

- 자주 꺼내써야 하는 경우


1) 출력용도

   - 꺼내서 쓰는 용도

2) 중복저장

3) 정렬 순서 있다.

4) 대표적인 클래스

   - ArrayList, Vector, LinkedList


먼저, Set 을 알아보자.


<TreeSet>

SortedSet - TreeSet

SortedSet 라는 부모클래스를 상속받는 자식클래스이다.

set인터페이스 종류 중에서는 유일하하게 정렬기능이 있다.

저장하기에는 좋지만 꺼내서 쓰기는 어렵다.


<참고>

- 같은 형제클래스라도 주소는 남남이다.

- 상속은 부모자식간에만 된다.


package prjUtil;

import java.util.HashSet;

import java.util.TreeSet;

public class CollectionTest1 {

    public static void main(String[] args) {

        // TODO set계열의 클래스들

        //set은 정렬 순서와 상관없이 마구잡이로 나오기 때문에 출력이 어렵다.

        

        //HashSet 클래스를 쓰면 인스턴스를 만들어 놓으면 메모리가 허용하는 범위까지 크기를 늘린다.

        HashSet set = new HashSet();

        

        //add로 저장한다.

        set.add("carrie");

        set.add("kabbin");

        set.add("kairo");

        set.add("kairo");

        set.add("kariss");

        

        //.size 데이터의 개수를 확인

        //데이터를 꺼내서 사용하기가 어렵다.

        System.out.println("데이터의 개수 : " + set.size()); // 중복은 제외하고 저장

        //현재가 객체가 가르키는 값을 문자열로 출력

        System.out.println(set.toString());

        //자바의 모든객체는.toString이 있기 때문에 생략가능하다.

        System.out.println(set);

        

        

        TreeSet tree = new TreeSet();

        tree.add("juliet");

        tree.add("terry");

        tree.add("kabbin");

        tree.add("terry");

        tree.add("carrie");

        

        System.out.println("데이터 개수 :" + tree.size());

        //알파벳 기준으로 정렬하여 저장

        //저장하기에는 좋지만 꺼내서 쓰기는 어렵다.

        System.out.println(tree);

    }

}


※ 결과값

데이터의 개수 : 4

[kabbin, kairo, carrie, kariss]

[kabbin, kairo, carrie, kariss]

데이터 개수 :4

[carrie, juliet, kabbin, terry]


여기서 데이터를 꺼내오려면 어떻게 해야할까?


package prjUtil;

import java.util.HashSet;

import java.util.Iterator;

import java.util.TreeSet;

public class CollectionTest1 {

    public static void main(String[] args) {

        // TODO set계열의 클래스들

        //set은 정렬 순서와 상관없이 마구잡이로 나오기 때문에 출력이 어렵다.

        

        //HashSet 클래스를 쓰면 인스턴스를 만들어 놓으면 메모리가 허용하는 범위까지 크기를 늘린다.

        HashSet set = new HashSet();

        

        set.add("carrie");

        set.add("kabbin");

        set.add("kairo");

        set.add("kairo");

        set.add("kariss");

        

        //.size 데이터의 개수를 확인

        //데이터를 꺼내서 사용하기가 어렵다.

        System.out.println("데이터의 개수 : " + set.size()); // 중복은 제외하고 저장

        //현재가 객체가 가르키는 값을 문자열로 출력

        System.out.println(set.toString());

        //자바의 모든객체는.toString이 있기 때문에 생략가능하다.

        System.out.println(set);

        

        

        TreeSet tree = new TreeSet();

        tree.add("juliet");

        tree.add("terry");

        tree.add("kabbin");

        tree.add("terry");

        tree.add("carrie");

        

        System.out.println("데이터 개수 :" + tree.size());

        //알파벳 기준으로 정렬하여 저장

        //저장하기에는 좋지만 꺼내서 쓰기는 어렵다.

        System.out.println(tree);

        

        //set에서는 데이터를 어떻게 꺼내올까?

        //set은 한꺼번에 일괄적으로 데이터를 꺼내와야해서 불편하다.

        //그러므로 데이터를 순서대로 꺼내올 수 있도록 열거형으로 만들어 줄을 세운다.

        //.iterator()메소드는 데이터를 줄세우는 메소드이다.

        Iterator it = tree.iterator();

        while(it.hasNext()){

            System.out.println(it.next());

        }

        

        

    }

}


※ 결과값

데이터의 개수 : 4

[kabbin, kairo, carrie, kariss]

[kabbin, kairo, carrie, kariss]

데이터 개수 :4

[carrie, juliet, kabbin, terry]

carrie

juliet

kabbin

terry


여기서 데이터는 주소값에 저장된다.


<Arraylist>


package prjUtil;

import java.util.ArrayList;

public class CollectionTest2 {

    public static void main(String[] args) {

        // TODO List계열의 클래스

        ArrayList list = new ArrayList();

        list.add("carrie");

        list.add("kairo");

        list.add("kabbin");

        list.add("kairo");

        list.add("terry");

        

        //중복된 데이터를 걸러내지 못한다.

        System.out.println("데이터 개수 : " + list.size());

        //입력순서대로 정렬한다.

        System.out.println(list);

        

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

            //.get 인스턴스로 부터 실제 데이터를 꺼내오는 메서드

            //문자면 문자, 숫자면 숫자로 원래있던 데이터 타입을 꺼내옴

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

            

    

        }

        

    }

}


※ 결과값

데이터 개수 : 5

[carrie, kairo, kabbin, kairo, terry]

carrie

kairo

kabbin

kairo

terry


컬렉션에서는 검색기능을 간단하게 처리 할 수 있다.


package prjUtil;

import java.util.ArrayList;

public class CollectionTest2 {

    public static void main(String[] args) {

        // TODO List계열의 클래스

        ArrayList list = new ArrayList();

        

        list.add("carrie");  //.add로 값을 저장한다. 어떤 값이든 저장 할 수 있지만 꺼낼 때를 생각해야한다.

        list.add("kairo");

        list.add("kabbin");

        list.add("kairo");

        list.add("terry");

        

        

        System.out.println("데이터 개수 : " + list.size()); //중복된 데이터를 걸러내지 못한다.

        System.out.println(list);                                //입력순서대로 정렬한다.

        

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

                                                         //.get 인스턴스로 부터 실제 데이터를 꺼내오는 메서드

            System.out.println(list.get(i));        //문자면 문자, 숫자면 숫자로 원래있던 데이터 타입을 꺼내옴

        }

                                                         //검색 할 때 반복문을 안써도 된다.

        if(list.contains("kairo")) {                   //kairo면 "찾았다." 아니면 "못찾았다."

            System.out.println("찾았다.");

            System.out.println(list.indexOf("kairo")+"번째있다."); //.indexOf 찾고자하는 문자열에 위치를 알려준다.

        }else {

            System.out.println("못찾았다.");

        }

        

        list.add(2, 100);                      //배열과 다르게 임의의 위치에 위치지정하고 값을 추가 할 수 있다.

        System.out.println(list);

                                                  //위치지정하고 값을 삭제 할 수 있다.

        list.remove(3);                        //.removeall() 이나 .clear()를 쓰면 모든 값을 지울 수 있다.  

        System.out.println(list);

        

        list.removeAll(list);

        System.out.println(list);

        

    }

}


※ 결과값

데이터 개수 : 5

[carrie, kairo, kabbin, kairo, terry]

carrie

kairo

kabbin

kairo

terry

찾았다.

1번째있다.

[carrie, kairo, 100, kabbin, kairo, terry]

[carrie, kairo, 100, kairo, terry]

[]




3. Map

- 검색에는 최고

- Collection과는 다르게 Map 인터페이스를 을 상속한다.

- 두 개를 묶어서 한 쌍으로 저장한다.


1) 검색용도

2) 두개의 데이터를 한쌍으로 저장 (key, value)

3) HashMap, HashTable...



package prjUtil;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Set;

public class CollectionTest3 {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        

        HashMap map = new HashMap();   //HashMap map을 사용한다.

        map.put("key1", "홍길동");             //put이라는 메서드를 사용해서 값을 입력

        map.put("key2", "임꺽정");

        map.put("key3", "유비");

        map.put("key4", "관우");

        map.put("key5", "장비");

        

        System.out.println("데이터 개수 : " + map.size()); //map의 개수를 알아본다.

        System.out.println(map.get("key"));

                                                       //.iterator()메소드는 데이터를 줄세우는 메소드이다.

        Set set = map.keySet();                 //순차적으로 값이 나올려면 set 계열의 메소드를 써야한다.

        Iterator it = set.iterator();               //set의 iterator() 메소드를 호출하여 줄을 세우고

        while(it.hasNext()) {                       //hasNext 그 다음 것을 가지고 있는지 물어본다.(있는지 없는지 검사)

            String key = (String)it.next();       //it.next() 줄을 세우고 나서 값을 불러온다.

            System.out.println(map.get(key));  //실제 데이터를 가지고 있는 것은 map이기 때문에 map을 쓴다.

                                                        //값을 key에다가 저장시키고 뽑아온다.

                                                        //.next() : 먼저 현재있는 데이터를 가져오고 다음 것을 꺼내온다.

        }

    

    }

}


※ 결과값

데이터 개수 : 5

null

홍길동

임꺽정

장비

유비

관우




'개발 > Java' 카테고리의 다른 글

[java] 예외처리(Exception)  (0) 2017.10.30
[java] 제네릭 Generic  (0) 2017.10.28
[java] java.util 패키지를 알아보자.  (0) 2017.10.27
[java] 인터페이스(InterFace)  (0) 2017.10.26
[java] 패키지 package  (0) 2017.10.25

+ Recent posts