[Java] 자바 #30, 컬렉션 프레임워크 - ArrayList
- 프로그래밍 언어/Java
- 2019. 3. 1. 18:37
컬렉션, 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 ... 이런식으로 증가시킨다고 합니다. 이 부분도 구현하는데는 어려움이 없으실 겁니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 자바 #32, Stack, Queue 개념 및 기능 (6) | 2019.03.01 |
---|---|
[Java] 자바 #31, 컬렉션 프레임워크 - HashMap (2) | 2019.03.01 |
[Java] 자바 #29, 예외처리(Exception, try-catch문) 및 예외 종류 예제 및 응용 (1) | 2019.02.27 |
[Java] 자바 #28, Wrapper클래스 예제 및 응용 (0) | 2019.02.25 |
[Java] 자바 #27, 제네릭(Generic) (2) | 2019.02.24 |