순차 리스트


순차 리스트

  • 데이터가 메모리에 연속적으로 저장됨 (ex. 배열 등)
  • 장점
    1) 인덱스로 데이터에 접근할 수 있으므로 속도가 빠름
  • 단점
    1) 배열의 길이가 사전에 정의되어야 함
    2) 중간 데이터 삭제 시 해당 인덱스 이후의 값들은 한 칸씩 이동이 발생

설명

  • 삽입
    - 보통 배열의 마지막에 데이터가 삽입되며, 삽입 시 배열의 크기도 고려해야 함
    - 배열의 중간에 데이터를 삽입하기 위해서는 배열의 길이가 충분한지 확인해야 하며, 삽입된 위치 뒤에 존재하는 모든 데이터들이 한 칸씩 뒤로 이동해야 하므로 중간에 데이터 삽입 시 비효율적
    - 시간 복잡도 : O(n)

  • 삭제
    - 배열의 중간에 위치한 데이터를 삭제할 경우 해당 위치의 뒤 데이터들은 한 칸씩 앞으로 이동해야 하므로 배열의 크기가 크고 삭제가 빈번할수록 비효율적
    - 시간복잡도 : O(n)

  • 조회(검색)
    - 배열에 존재하는 데이터에 대한 인덱스 값들이 고정되어 있기 때문에 조회가 간편함
    - 시간복잡도 : O(n) [찾으려는 값이 없을 경우]

  • 접근
    - 배열의 인덱스로 데이터에 바로 접근할 수 있음
    - 시간복잡도 : O(1)

추상 자료형 (ADT)

자료형 반환값 내용
initialize() void 리스트 초기화
insert(Object data) boolean 리스트에 데이터 저장
first() Object 첫 번째 데이터를 가리키도록 하며 값을 반환
next() Object 현재 참조하고 있는 데이터의 다음 데이터를 가리키도록 하며 값을 반환
remove() Object 현재 참조하고 있는 데이터를 지움
count() int 리스트에 저장된 데이터의 개수를 반환

구현

 

  • 디렉토리 구조
  • 인터페이스 구현
    다형성을 위해 List관련 메소드를 인터페이스로 구현
    package List;
    
    // 다형성을 위해 List를 인터페이스로 생성
    public interface List {
        // 리스트 초기화
        void initialize();
        // 리스트에 데이터 삽입 (어떤 값이 올 지 모르므로 Object를 인자로 받음)
        boolean insert(Object data);
        // 첫 번째 데이터를 가리키도록 하며 값을 반환
        Object first();
        // 현재 참조하고 있는 데이터의 다음 데이터를 가리키도록 하며 값을 반환
        Object next();
        // 현재 참조하고 있는 데이터를 지움
        Object remove();
        // 리스트에 저장된 데이터의 개수를 반환
        int count();
    }
  • 순차 리스트 구현
    실제 리스트 코드 작성
    package List.ArrayList;
    import List.List;
    
    public class ArrayList implements List {
        // 리스트 최대 개수를 10으로 지정
        final int MAX_LIST_COUNT = 10;
        Object[] list = new Object[MAX_LIST_COUNT];
        // 현재 위치 저장 변수 (아무것도 참조하고 있지 않으므로 -1)
        int curPosition = -1;
        // 리스트에 저장된 데이터 개수
        int countOfData = 0;
    
        @Override
        public void initialize() {
            curPosition = -1;
            countOfData = 0;
            for(int i=0; i<MAX_LIST_COUNT; i++){
                list[i] = null;
            }
        }
    
        @Override
        public boolean insert(Object data) {
            if (data == null){
                System.out.println("null 값을 추가할 수 없습니다.");
                return false;
            }
    
            if (countOfData >= 100){
                System.out.println("더이상 데이터를 추가할 수 없습니다.");
                return false;
            }
    
            // 리스트에 데이터 저장
            list[countOfData++] = data;
            return true;
        }
    
        @Override
        public Object first() {
            if (countOfData == 0){
                System.out.println("데이터가 없습니다.");
                return null;
            }
    
            // 첫 번째를 가리키도록 설정
            curPosition = 0;
            // 첫 번째 데이터 반환
            return list[curPosition];
        }
    
        @Override
        public Object next() {
            if (curPosition >= countOfData - 1){
                System.out.println("데이터가 없습니다.");
                return null;
            }
    
            curPosition++;
            return list[curPosition];
        }
    
        @Override
        public Object remove() {
            if (countOfData == 0){
                System.out.println("데이터가 없습니다.");
                return null;
            }
    
            // 현재 참조된 데이터를 제거하기 위해 변수에 할당
            Object rData = list[curPosition];
            // 한 칸씩 당기기 위한 반복문
            for(int i=curPosition; i<countOfData - 1; i++){
                list[i] = list[i+1];
            }
    
            // 데이터가 제거됐으므로 개수와 위치를 하나씩 감소
            countOfData--;
            curPosition--;
            return rData;
        }
    
        @Override
        public int count() {
            return countOfData;
        }
    }

  • 메인 구현
    데이터 삽입, 삭제 및 조회 기능 테스트
    package List.ArrayList;
    
    public class Main {
        public static void main(String[] args) {
            ArrayList list = new ArrayList();
    
            // 리스트 초기화
            list.initialize();
    
            // 리스트 데이터 추가
            list.insert(1); list.insert(2);
            list.insert(3); list.insert(4);
            list.insert(5); list.insert(6);
    
            // 첫 번째 인덱스를 가리키도록 설정
            Object data = list.first();
            System.out.println(data);
            // data가 null이 아닐때까지 반복
            while((data = list.next()) != null){
                System.out.println(data);
            }
    
            // data 삭제
            Object rData = null;
            data = list.first();
            if ((int)data == 4){
                rData = list.remove();
                System.out.println(rData + " 데이터가 삭제되었습니다.");
                rData = null;
            }
            while((data = list.next()) != null){
                if ((int)data == 4){
                    rData = list.remove();
                    System.out.println(rData + " 데이터가 삭제되었습니다.");
                    rData = null;
                }
            }
    
            // 삭제 후 재출력
            data = list.first();
            System.out.println(data);
            // data가 null이 아닐때까지 반복
            while((data = list.next()) != null){
                System.out.println(data);
            }
        }
    }

 

'0x00. 자료구조' 카테고리의 다른 글

양방향 연결 리스트 (이중 연결 리스트)  (0) 2021.10.14
단순 연결 리스트  (0) 2021.10.11
재귀(Recursion)란?  (1) 2021.05.08
공간복잡도(Space Complexity)란?  (0) 2021.05.05
시간복잡도(Time Complexity)란?  (0) 2021.04.30

+ Recent posts