3-1. ArrayList 구현

김현우·2024년 5월 14일
0

자료구조

목록 보기
9/12
post-thumbnail

구현

직접 구현을 한번 해보자
자바에서 제공하는 ArrayList처럼 가변하지는 못하지만

배열로 만들어서 기본적인 기능들은 구현한다.

add,remove등만 일단 구현을 목표로 한다.

이때 arrayList 처럼 사용자는 객체를 생성후
add remove등을 통해서 관리한다.

또한 원하는 자료형을 사용가능하게 해준다.

사전 정리

기본적인 기능들은 다음과 같다.

1. add
2. remove
3. indexOf (원하는 데이터 선택시 해당 데이터의 주소 반환)
4. get (인덱스 입력시 해당 인덱스의 데이터 리턴)
5. sizeOf (현재 저장된 데이터 수 반환)
6. Iterator

Iterator

반복문과 함께 리스트를 반복작업 하기 위해 사용하는 "객체"이다.

주요 기능은 3가지로

Iterator.hasNext(); - 다음값이 들어있는지 확인후 boolean 리턴
Iterator.next(); - 다음 값 가져오기
Iterator.remove(); - next로 가져온 데이터 리스트 내에서 삭제

여기에 추가로
Iterator.hasPrev(); - 이전값이 들어있는지 확인후 boolean 리턴
Iterator.prev(); - 이전 값 가져오기 
Iterator.add(); - next()로 가져온 데이터 이후에 하나 추가
자세한 공부는 추후 더 하고 지금은 구현만 생각하기

CODE

package ArrayList;

import java.util.ListIterator;

public class ArrayList {
    private Object []obj=new Object[100];//처음 실행시 Object 배열 생성
    private int nowIdx=0;//현재 어디까지 저장되어있는지 나타내는 변수생성
    
   public boolean addLast(Object data)
   {
        obj[nowIdx]=data;
        nowIdx++;
        return true;
   }

   public boolean add(int idx,Object data){
        if (idx>nowIdx){
           System.out.println("잘못된 주소를 입력하셨습니다.");
           return false;//만약 현재까지 저장된 개수보다 큰 주소에 더하고 싶다하면 오류발생
        }

        for(int i=nowIdx;i>idx;i--)
            obj[i]=obj[i-1];

        obj[idx]=data;
        //미는 작업 필요함 이건 처음에 대입할때도 필요하니 매소드로 따로 구현

        nowIdx++;
        return true;
   }

   public boolean addFirst(Object data){
        return add(0,data);
   }

  

   @Override
   public String toString(){
     String str="[";

     for(int i=0;i<nowIdx;i++)
     {
          str+=obj[i];//자동으로 obj[i].toString() 호출됌
          str+=',';
     }
     return str+"]";
   }


   //remove 관련 매소드 생성
   public Object remove(int idx){
     if(nowIdx==0)
     {
          System.out.println("현재 저장된 데이터가 없습니다!");
          return null;
     }

     if(!(idx>=0&&idx<nowIdx))
     {    
          System.out.println("현재 존재하지 않는 인덱스를 제거하려 하셨어요!");

          return null;//현재 있는 값이 아니면 오류 발생
     }

     Object tmp=obj[idx];

     for(int i=idx;i<nowIdx-1;i++)
          obj[i]=obj[i+1];

     nowIdx--;
     obj[nowIdx]=null;
     return tmp;
   }

   //데이터로 찾기
   public Object remove(Object data){
     for(int i=0;i<nowIdx;i++)
          if(obj[i]==data)
               return remove(i);
               //찾는 값이 있다면 호출 remove(i) 
     
     return false;//실패시 false 되돌려줌 
   }

   public Object removeFisrt(){
     return remove(0);//첫번째 값 삭제 
   }

   public Object removeLast(){
     return remove(nowIdx-1);//마지막 데이터 삭제
   }

   //주소로 찾기
   public Object get(int idx){
     if(!(idx>=0&&idx<nowIdx))
     {
          System.out.println("현재 찾으시는 인덱스에 저장된 데이터는 존재하지 않습니다.");
          return null;
     }

     return obj[idx];
   }

   //data로 찾기
   public int indexOf(Object data){
     for(int i=0;i<nowIdx;i++)
          if(obj[i].equals(data))//==을 써도 문제는 현재 안생기지만 언젠가는 생길수 있기에 equals사용함
               return i;
     
     System.out.printf("현재 %s는 저장되어 있지 않습니다",data.toString());
     return -1;
   }

   public int sizeOf(){return nowIdx;}//현재 저장된 data의 개수 리턴

   public ListIterator ListIterator(){
     return new ListIterator();
   }

   private class ListIterator{
     private int IterIdx=0;
     public boolean hasNext(){
          // if(obj[idx+1]==null)
          //      return false;

          return sizeOf()>IterIdx;
     }

     public Object Next(){
          return obj[IterIdx++];
     }

     public boolean hasPrev(){
          return IterIdx>0;
     }

     public Object Prev(){
          return obj[--IterIdx];
     }

     public boolean add(Object data){
          return ArrayList.this.add(IterIdx, data);
          //외부 클래스의 add를 사용할 것이기 때문에 ArrayList.this 라고 명시
     }
     public boolean remove(){
          return ArrayList.this.remove(--IterIdx);
     }
   }
}
profile
학생

0개의 댓글