Java | ArrayList 구현하기 <Integer>

BOZZANG·2022년 4월 21일
0
post-thumbnail

🎇 ArrayList

ArrayListCollection FrameworkList 인터페이스에 해당된다. 그래서 저장 순서가 유지되고 중복을 허용한다는 특징이 있다.
여러 개의 데이터를 쉽고 효율적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스 중 하나이다.

Collection framework가 뭐야? 

자바에서 컬렉션 프레임워크란 
다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다., 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 
클래스로 구현해 놓은 것이다. 

이러한 Collection framework는 자바의 interface(인터페이스)를 사용하여 구현된다. 

Collection framework의 주요 인터페이스
1. List 인터페이스
2. Set 인터페이스
3. Map 인터페이스 
그래서 뭐.. 그게 뭔데? 일단 List 인터페이스에 대해서만 알아보자..

1. List 컬렉션 클래스 
List 인터페이스를 구현한 모든 List 컬렉션 클래스는 다음와 같은 특징이 있다.

	- 요소의 저장 순서 유지
	- 같은 요소의 중복 저장 허용 

대표적인 List 컬렉션 클래스에 속하는 클래스 

	1. ArrayList<E>
	2. LinkedList<E>
	3. Vector<E>
	4. Stack<E>
그러면 이제 ArrayList<E>에 대해서 알아보면 되겠군.. 쿡쿡

ArrayList<E> 클래스 
ArrayList 클래스는 가장 많이 사용되는 컬렉션 클래스 중 하나이다. 
내부적으로 배열을 이용하여 요소를 저장한다. 이와 같이 배열을 사용하기 때문에,
index를 사용하여 배열 요소에 빠르게 접근할 수 있다.

하지만 배열은 크기를 변경할 수 없는 인스턴스이므로, 
크기를 늘리기 위해서 새로운 배열을 생성하고 기존 요소들을 옮기는 복잡한 과정을 거쳐야 한다. 
물론 이 과정은 자동으로 수행되지만, 요소의 추가 및 삭제 작업 시간이 매우 길어지는 단점을 가진다. 

[ArrayList 메소드 예제] 

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

// add() 저장 
arrList.add(30);

// get() 출력
arrList.get(1); 

// set() 변경
arrList.set(0,10);

// size() 총 개수 
arrList.size();

앞에서 공부한 것과 똑같은 거였군! 단지 새로운 용어들일 뿐이었어... 후후.....

출처 TCPSCHOOL


자 이제 구현을 위한 준비를 해보자!
위를 보면 List 인터페이스는

순서가 있는 데이터의 집합 동적인 capacity를 가짐 배열의 확장
데이터의 중복을 허용하는 인터페이스

라는 것을 알 수 있었다.

나는 왕왕초보이기 때문에 가장 간단하고 기본적인 최소한의 것만 구현을 해보도록 하겠다.

우선 Integer 타입의 데이터만을 가정하고 진행한다.


⚔ 구현

Methods
	- String get(int index) : index에 저장된 데이터 리턴
    - int search(int data) : 해당 data의 index값 리턴
    - void add(int data) : 마지막에 data 저장
    - void add(int index, int data) : index번째에 data 저장
    - String remove(int index) : index에 저장된 데이터 삭제, 데이터 리턴
    - int remove(int data) : 주어진 데이터 삭제, index 리턴
    - int sizeOf() : 데이터가 저장된 size 리턴
    - int arrSize() : 현재 max size 리턴
    - String toString() : string output 리턴
public class MyArrayList1 {
	int initialCapacity = 10; // 초기 용량
    int[] elementData; 
    int size; // 더해진 데이터의 size
    int currentCapacity; // 현재 용량 
    
    public MyArrayList1() {
    	elementData = new int[initialCapacity];
        size = 0;
        currentCapacity = initialCapacity;
    } 
   public String get(int index) { //index에 저장된 데이터 리턴
   	String getData = " ";
       return getData + elementData[index];
   }
   public int search(int data) {  //해당 data의 index값 리턴
   	for(int i = 0; i < size; i++) {
       	if(data == elementData[i])
           	return i;
          }
       // 탐색 후 일치하는 data를 찾지 못했을 때
       return -1;
   }
    public void add(int data) { //마지막에 data 저장
    
    	if(size == currentCapacity) {    
        	int[] newArray = new int[currentCapacity * 2];
            // 더해진 data의 size가 현재 용량과 같다면, (용량이 꽉 찼다면)
            // 2배 크기의 새로운 array 생성해준다.
            
            for(int i = 0; i < size; i++)
            	newArray[i] = elementData[i];    
             elementData = newArray;   // 그리고 기존 data를 복사해준다. 
             					      // 마지막으로 새로운 data를 추가해준다. 
             currentCapacity = currentCapacity * 2; // 물론 용량도 2배 만들어준다. 	
        } else {
        	elementData[size] = data;
            size++; 
        	}       
    }
    
    public void add(int index, int data) {  //index번째에 data 저장
    
    // 지정 위치에 값을 넣기 위해서 맨 마지막 요소부터, 
    // 뒤로 하나씩 해당 지정 인덱스까지 값을 이동시켜야 한다. 
    
		for(int i = size-1; i >= index; i--) {
        	elementData[i+1] = elementData[i];
         }
         
        elementData[index] = data;
        // element의 이동이 끝난 후 dldmentData에 element를 추가한다.
        
        size++;
        // element를 추가했기 때문에 size 값을 1 증가시킨다.
        return true;
   }	

이 부분은 이해가 잘 되지 않으니 설명을 보자
출처 opentutorials

그림에 표시된 숫자의 순서대로 엘리먼트를 왼쪽에서 오른쪽으로 옮겨야 한다.
이 때 시작과 끝을 잘 파악해서 반복조건을 만들어 보자

	* 시작 : 반복작업이 시작되는 인덱스, size-1로 구할 수 있다. 
    * 끝 : 반복잡업이 끝나는 엘리먼트의 인덱스는 메소드 add의 첫 번째 인자의 값을 사용한다.
    * 반복작업 : 감소연산 i--

이 작업을 통해서 엘리먼트를 한 칸씩 뒤로 이동시킬 수 있다. 빈자리에 엘리먼트를 삽입한다. 엘리먼트의 이동이 끝나면 elementData에 element를 추가하고, size의 값을 1 증가시키면 된다.

	public String remove(int index) {  //index에 저장된 데이터 삭제, 데이터 리턴
    
    	int removed = elementData[index] // 삭제될 데이터 removed에 저장
    
    // list는 중간에 빈 공간을 허용하지 않는다.
    // 그래서 빈공간을 메우기 위해 요소가 한 칸씩 앞으로 이동한다.
    // list에서 없애려고 하는 index에 있는 값을, 해당 index 뒤의 값으로
    // 덮어씌우면서 제거하고자 하는 값을 없앤다.
    
    	for(int i = index + 1; i <= size-1; i++){
    		elementData[i-1] = elementData[i];
   		 }
    
    	size--; //한 요소가 없어졌기 때문에 size 감소
        elementData[size] = -1; //맨 마지막 index는 아직 남아 있으므로 -1 저장
        
        String removedData = " ";
        return removeData + removed;
    }
	public int sizeOf() { // 데이터가 저장된 size 리턴
    	return size;
    }
	public int arrSize() { // 현재 max size 리턴
    	return currentCapacity;
    }
	public String toString() {  // string output 리턴
    	String ret = " ";
        for(int i = 0; i < size; i++)
        	ret = ret + elementData[i] + ", ";
         return ret;
    }

⚔ Test Main

public class MyALMain {

	public static void main(String[] args) {
		MyArrayList1 me = new MyArrayList1();

		for (int i = 0; i < 20; i++) {
			me.add((int) (100 * Math.random()));
		}

		System.out.println("- Create random array : " + me.toString());

		// index 4의 데이터 가져오기
		System.out.println("- index[4] data : " + me.get(4));

		// data 25의 index 값
		System.out.println("- index value of data 25 : " + me.search(25));

		// 0번째 index에 55 넣기
		me.add(0, 55);
		System.out.println("- Put 55 in the 0th index : " + me);

		// 1번째 index값 data 삭제하기
		System.out.println(me.remove(1));
		System.out.println("- 1 deleted array : " + me);

		// 추가된 데이터의 size
		System.out.println("- size of data added : " + me.sizeOf());

		// max size
		System.out.println("- max size : " + me.arrSize());

		System.out.println("- me : " + me.toString());
	}

}
- Create random array : 97, 91, 57, 95, 82, 78, 18, 52, 49, 73, 28, 94, 22, 29, 7, 98, 86, 38, 79, 
- index[4] data :  82
- index value of data 25 : -1
- Put 55 in the 0th index : 55, 97, 91, 57, 95, 82, 78, 18, 52, 49, 73, 28, 94, 22, 29, 7, 98, 86, 38, 79, 
 97
- 1 deleted array : 55, 91, 57, 95, 82, 78, 18, 52, 49, 73, 28, 94, 22, 29, 7, 98, 86, 38, 79, 
- size of data added : 19
- max size : 20
- me : 55, 91, 57, 95, 82, 78, 18, 52, 49, 73, 28, 94, 22, 29, 7, 98, 86, 38, 79, 

참고 opentutorials

0개의 댓글