[Java] 자바 #30, 컬렉션 프레임워크 - ArrayList

컬렉션, Collection

 - 배열의 업그레이드 버전

 - 길이 가변(늘이거나 줄이는게 가능)

 - 배열을 사용 목적에 따라 사용법이나 구조를 특화시켜서 제공함.(=자료구조)


기존의 순수 배열방식


배열 생성.

 - 타입명시(int)

 - 길이 명시([3])

int[] nums1 = new int[3];

초기화 or 요소접근 -> 인덱스 사용

nums1[0]=100;

nums1[1]=200;

nums1[2]=300;

배열의 길이 or 탐색

for( int i =0; i<nums1.length; i++) {

System.out.println(nums1[i]);

}

ArrayList 클래스

 - 사용빈도 높음

 - 순수배열과 구조가 가장 유사함.

 - 인덱스를 통해서 요소를 관리.

ArrayList 생성

- 타입 없음 : Object[]

- 길이 없음 : 길이가변.

ArrayList nums2 = new ArrayList();

초기화

nums2.add(1000);

nums2.add(2000);

nums2.add(3000);

nums2.add(4000);


요소접근 및 탐색

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

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

}


제네릭을 적용한 ArrayList


- raw type : 옛날꺼... 향후에 공지없이 사라질 수 있다. ( 다음 자바버전에서... 사라진다...)

ArrayList list1 = new ArrayList();

list1.add(1000);

System.out.println((int)list1.get(0)*2); //오브젝트 형이라서 연산이 안된다.

- 제네릭 적용한 ArrayList

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

list2.add(1000);

list2.add(20);

System.out.println(list2.get(0)+list2.get(1)); //연산이 가능.


ArrayList 클래스의 기능들


0. 객체 생성

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


1. 요소 추가하기

 - void add( T element )

 - 배열의 맨 끝에 추가하기 (append)

list.add("홍길동");

list.add("아무개");

list.add("하하하");

list.add("허호호");

list.add("히히히");


2. 요소의 개수

 - int size()

System.out.println("ArrayList의 크기 : "+list.size());


3. 요소에 접근

 - T get(int index)

System.out.println(list.get(0)); // list[0] : 인덱서(indexer)

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

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

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

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

System.out.println(list.get(list.size()-1)); // ArrayList 의 마지막 요소에 접근.

System.out.println();

4. 요소를 수정

 - 순수배열 수정 : list[0] = 수정값

list.add("후후후"); // 무조건추가하기

list.set(0,"이명박");

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

5. 요소를 삭제

- 순수배열 :  list[0] = null?? // 삭제 X -> 수정에 가깝다 

- 삭제된 요소부터 나머지 방까지는 1칸씩 좌로 쉬프트(index가 -1씩 감소함)

System.out.println(list.size());

list.remove(0);

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

System.out.println(list.size());

6. 요소 탐색

 - 루프탐색

 1)

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

System.out.print(list.get(i)+" ");

}

 2)

for(String name : list) {

System.out.print(name+ " ");

}

System.out.println();

7. 중간에 요소 추가

 - 삽입, insert

 - void add(삽입인덱스, 값);

list.add(1, "추가");

for(String name : list) {

System.out.print(name+ " ");

}

*****주의

 - 요소 삭제(5)와 요소 추가(7)는 다른 요소의 index를 변경시킨다.

8. 초기화

 - 모든 방 삭제.

list.clear();

System.out.println("list.clear() 후 list.size() : "+list.size());

9. 배열이 비었는지??

System.out.println(list.size()==0);

System.out.println(list.isEmpty());

list.indexOf("홍길동");

list.lastIndexOf("홍길동");

list.contains("홍길동");


임의로 구현한 ArrayList 클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
class MyArrayList {
    private int index;
    private String[] list;
    
    //생성자
    public MyArrayList() {
        this.index = -1;
        this.list = new String[100];// 임의로 100칸짜리 만들기
    }
    
    //삭제 메소드
    public void remove(int index) {
        // 파라미터 index부터 시작해서 this 인덱스까지.
        for (int i = index; i < this.index; i++) {
            list[i] = list[i + 1];
        }
        this.index--;
    }
    
    //수정 메소드
    public void set(int index, String value) {
        this.list[index] = value;
    }
    
    //list의 크기 
    public int size() {
        return this.index + 1;
    }
    
    //삽입 메소드(남은 list에 삽입)
    public void add(String value) {
        index++;
        // 배열에 value를 추가.
        // index방에 추가.
        this.list[index] = value;
    }
    
    //삽입 메소드(해당 파라미터 index에 삽입)
    public void add(int index, String value) {
        // index 방에 value를 추가.
        this.index++// 먼저 방의 인덱스를 하나 늘려주고.
        // 뒤쪽 값부터 차례대로 한칸씩 이동시킨다.
        for (int i = this.index; i >= index; i--) {
            list[i + 1= list[i];
        } // 이동 완료.
        list[index] = value;
    }
    
    //list배열의 index요소를 반환.
    public String get(int index) {
 
        return this.list[index];
    }
    
    //왼쪽에서부터 value값을 찾아서 인덱스를 반환
    public int indexOf(String value) {
        // list 배열의 index까지만
        for (int i = 0; i <=this.index; i++) {
            if (list[i].equals(value)) {
                return i;
            }
        }
        return -1;
    }
 
    //오른쪽에서부터 value값을 찾아서 인덱스를 반환
    public int lastIndexOf(String value) {
        // list 배열의 index까지만
        for (int i = this.index; i <=0; i--) {
            if (list[i].equals(value)) {
                return i;
            }
        }
        return -1;
    }
    
    //초기화
    public void clear() {
        this.index=-1;
        for(int i =0; i<list.length;i ++) {
            list[i]=null;
        }
    }
}
cs


부가설명 

위의 제가 임의로 구현한 ArrayList 클래스는 배열길이가 임의로 100으로 퉁쳤는데, 원래 ArrayList 클래스는 길이가 4짜리의 배열을 생성하고, 해당 배열의 길이보다 큰 append가 들어오게 되면 배열의 길이를 2배로 늘려서 8 16 32 64 ... 이런식으로 증가시킨다고 합니다. 이 부분도 구현하는데는 어려움이 없으실 겁니다. 

댓글

Designed by JB FACTORY