생활코딩 DataStructure -2
1. ArrayList
1-1 Iteration 반복
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
Iterator it = numbers.iterator();
- numbers는 ArrayList 객체.
- numbers.iterator(); = numbers를 이용하여 직접 순회하는 것이 아니라. numbers 객체가 갖고 있는 iterator() 메서드를 호출 하고 있음.
- Iterator it = numbers.iterator(); = 호출된 iterator() 메서드는 어떠한 값을 리턴할 것인데, 그 값은 It라는 변수에 담길 것이고, Iterator it로 보아, it의 datatype은 Iterator이기 때문에 담길 값도 Iterator datatype임을 알 수 있음. (Iterator datatype은 자바에 있는 인터페이스)
- 즉, Iterator라는 인터페이스를 구현하고 있는 어떠한 객체를 리턴해서 it라는 변수에 담고 있음.
Iterator it = numbers.iterator();
while(it.hasNext()) {
int value = it.next();
}
- hasNext()는 boolean값을 리턴하는 메서드임을 알 수 있음. (while문을 실행하는 조건문에 입력되어 있기 때문에)
- hasNext() : 현재 numbers라고하는 Arraylist가 가져올 수 있는(지정하고있는) 다음 element가 있는지(즉, 판별하는 시점에서 element가 존재 하는지) 확인 있으면 true 없으면 false
- int value = it.next() : 처음 호출 되면 numbers가 갖고 있는 첫번째 data를 value에 담고 또 실행되면 순차적으로 다음 값(hasNext()가 확인한 값)을 value에 담는다.
1-2 for문을 이용한 반복
1) 배열 전용 for문을 이용한 반복
- for문 시행시마다 numbers의 값을 value변수에 하나씩 집어 넣고, numbers의 마지막 값이 value에 들어간 후에 마지막 실행을 하고 종료
for( int value : numbers) {
System.out.println(value);
}
2) 일반적인 for문을 이용한 반복
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
2. Arraylist의 구현
2-1 ArrayList 객체 생성
- ArrayList의 의미 : Array + List, List를 만들때 내부적으로 Array를 사용
1) ArrayList 클래스 생성
- Object datatype의 배열을 생성해서 elementData라고 하는 private접근자를 갖고 있는 instance변수에 할당
- 그리고 그 배열의 크기는 100임. 실제 라이브러리에 포함된 ArrayList보다는 기능이 떨어짐
- Java에서 제공하는 ArrayList는 크기를 늘려주는 형식으로 코딩이 되어 있기 때문에 기능의 걱정을 하지 않아도 됨. (크기가 고정되지 않은 것은 Array의본질이 아니지만, 편의를 위해 해당 기능을 제공)
package list.arraylist.implementation;
public class ArrayList {
private int size = 0; // 배열에 저장되는 값의 수(size)를 check하기 위해 내부적으로 변수 선언
private Object[] elementData = new Object[100]; // 객체 내부적으로 사용할 data
2) Main 객체 생성
- 생성된 ArrayList Class를 인스턴스화 하여 기능을 사용하고 구현하기 위한 Main Class 생성
public class Main {
public static void main(String[] args) {
ArrayList numbers = new ArrayList<>();
//ArrayList.java파일의 클래스를 인스턴스화 함 -> 사용하려고!
2-2 addLast() 구현
- List의 맨뒤에 새로운 값을 추가하는 메서드
- 맨뒤에 값을 넣기 위해서는, 현재 담겨있는 마지막 값의 index + 1 이어야 함 (= size)
1) 예제코드
public boolean addLast(Object element) {
elementData[size] = element;
size++;
return true;
}
2-3 add 구현
1) 예제코드
public boolean add(int index, Object element) {
for (int i = size - 1; i >= index; i--) {
elementData[i + 1] = elementData[i];
}
elementData[index] = element;
size++;
return true;
}
2) add(1, 15)시행시 코드의 흐름
2-4 addFist 구현
1) 예제코드
public boolean addFirst(Object element) {
return add(0, element);
}
2-5 toString 구현
- toString이라고 하는 약속 되어 있는 메서드를 구현하면, sysout으로 출력 했을 때 메서드에 작성한 TEST가 출력 됨.
- 이렇게 출력 되는 이유는 toString이라고 하는 것을 ArrayList 클래스에 직접 구현하면, numbers라는 객체를 문자로 출력해야하는 상황에서
- toString이라고하는 약속되어 있는 이름의 메서드가 호출되기 때문(약속이란?). toString에 코딩한 내용 대로 출력 됨(여기서는 "TEXT"로 구현함 따라서 TEXT가 문자로 출력, toString을 구현하지 않으면 객체가 위치한 주소를 출력함).
public String toString() {
return "TEST";
}
1) 예제코드
- 따라서 toString을 직접 구현하여 원하고자 하는 출력 값을 얻는다. 밑의 메서드는 numbers의 element들을 정해진 형식에 맞추어 출력 할 수 있도록 하는 toString() 구현 코드
public String toString() {
String str = "[";
for (int i = 0; i < size; i++) {
str = str + elementData[i];
if (i < size-1) {
str = str + ",";
}
}
return str + "]";
}
* 이클립스 변수명 한번에 바꾸기
-> 변수 더블클릭 (하이라이트) - > Shift + Alt + R
* Java에서 배열을 선언할 때 크기를 지정했다면, 그 크기안에서 값을 넣는 행동은 자유롭다. (addLast)
* 구현 복습겸 스스로 코딩하기