Study/DataStructure

생활코딩 DataStructure -2

GrapeMilk 2020. 2. 13. 19:07

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)

* 구현 복습겸 스스로 코딩하기