ArrayList란 무엇일까?

ArrayList에서 선언된 가장 중요한 함수를 통해 

개념을 이해해볼 것이다.



List - ArrayList

    - null 값을 저장할 수 있다.

    - 값을 중복 저장할 수 없다.

    - 값을 넣는 순서대로 저장한다.

      그래서 값을 꺼낼 때도 넣은 순서대로 꺼낼 수 있다.

    - 값을 꺼낼 때 숫자 인덱스를 사용하여 꺼낸다.



1)

ArraList 1. Object[] 배열 생성 코드를 작성한다.


public class ArrayList_ex1 {

 
  // Object 배열을 생성할 때, 기본적으로 생성해줘야 하는 사이즈(DEFAULT_SIZE)를 지정해준다.
  public static final int DEFAULT_SIZE = 10;
  // Object 배열에 값을 넣어줄 때, 추가로 생성해주고 싶은 사이즈(GROW_SIZE)를 지정해준다.
  public static final int GROW_SIZE = 3;
 
  Object[] list;
 
  // ArrayList_ex1 인스턴스를 생성하자마자, 호출되는 생성자 함수에서
  // 자동적으로 Object 배열의 빈 값을 10개 생성해주도록 한다.
  public ArrayList_ex1() {
   list = new Object[10];
  } 

}



2)

ArrayList 2. new ArrayList_ex1(숫자); 작성시 호출되는 

Object[] 배열 생성자 코드를 작성한다.


 // 기본 사이즈나 추가 사이즈보다 작은 수가 넘어오면 기본 사이즈로 배열을 생성한다.
public ArrayList_ex1(int capacity) {
 if (capacity < DEFAULT_SIZE || capacity < GROW_SIZE) {
   list = new Object[DEFAULT_SIZE];
 } else { // 그 외에는 입력받은 숫자대로 배열을 생성한다.
   list = new Object[capacity];
 }
}




3)

ArrayList 3. 배열의 길이를 증가시키는 increaseList() 

메서드 코드를 작성한다.


// 배열의 길이를 증가시키는 메서드. 내부 메서드이기 때문에 private을 사용한다
private void increaseList() {
  // 생성된 배열의 길이에 GROW_SIZE를 더 한 만큼 배열을 추가로 생성한다.
  Object[] newList = new Object[list.length + GROW_SIZE];
 
  // 반복문을 통해, 새롭게 생성되었던 newList 배열의 각 인덱스 값에 list 배열 값들을 저장한다.
  for (int i = 0; i < list.length; i++) {
   newList[i] = list[i];
  }
 
  // list 변수에 newList 배열의 주소를 할당해주면 된다.
  list = newList;

}




4)

ArrayList 4. 배열에 값을 넣어주는 add() 메서드를 추가한다.


// 배열에 값을 넣어주는 메서드
public void add(Object obj) {
  // add 메서드가 호출될 때마다 length 값을 하나씩 증가시키면서 obj 값을 list 배열에 삽입한다.
  list[length++] = obj;
 
  // length와 배열의 길이가 일치하면 배열의 길이를 증가시킨다.
  if (length == list.length) {
    increaseList();
  }

}




5)

ArrayList 5. 배열에 저장된 값을 꺼내는 get() 메서드를 추가한다.


// 배열에 저장된 값을 꺼내는 get() 메서드를 추가한다.
public Object get(int index) {
 
  // index 값이 배열의 길이보다 많거나 0보다 작다면 에러처리를 해준다.
  if (index < 0 || index >= length) {
    throw new RuntimeException("배열 인덱스의 범위를 벗어났습니다.");
  }
 
  // 그외에는 list 배열에서 해당 인덱스에 저장된 값을 리턴한다
  return list[index];

}




6)

ArrayList 6. 배열에서 특정 인덱스를 제거하는 remove() 메서드를 추가한다.


// 배열에서 특정 인덱스를 제거하는 remove() 메서드를 추가한다.
public void remove(int index) {
 
  //index 값이 배열의 길이보다 많거나 0보다 작다면 에러처리를 해준다.
  if (index < 0 || index >= length) {
    throw new RuntimeException("배열 인덱스의 범위를 벗어났습니다.");
  }
 
  // 입력받은 index 값부터 list 배열에 있는 값들을 하나씩 당겨서 저장한다.
  // (덮어씌어 지면서 기존 값이 지워지는 것)
  for (int i = index; i < list.length - 1; i ++) {
    list[i] = list[i+1];
  }
 
  // 배열의 길이를 하나 줄인다.
  length--;

}






7)

ArrayList 7. 배열에서 특정 인덱스에 값을 저장하는 set() 메서드를 추가한다.


// 배열에서 특정 인덱스에 값을 저장하는 set() 메서드를 추가한다.
public void set(int index, Object obj) {
 
  //index 값이 배열의 길이보다 많거나 0보다 작다면 에러처리를 해준다.
  if (index < 0 || index >= length) {
    throw new RuntimeException("배열 인덱스의 범위를 벗어났습니다.");
  }
 
  // list[index]에 값을 저장시킨다.
  list[index] = obj;

}





main() 메서드 예제


import java.sql.Date;
public class Test_ArrayList{
  public static void main(String[] args) {
   ArrayList_ex1 dateList = new ArrayList_ex1();
   
    dateList.add(Date.valueOf("2017-3-1"));
    dateList.add(Date.valueOf("2017-5-3"));
    dateList.add(Date.valueOf("2017-5-5"));
    dateList.add(Date.valueOf("2017-5-9"));
    dateList.add(Date.valueOf("2017-6-6"));
    for (int i = 0; i < dateList.length(); i++) {
      System.out.println(dateList.get(i));
    }
    System.out.println("-------------------------");   
   
    dateList.remove(3);
    dateList.set(1, Date.valueOf("2017-5-4"));
   
    for (int i = 0; i < dateList.length(); i++) {
      System.out.println(dateList.get(i));
    }
       
  }

}


- 실행 결과 : 

2017-03-01

2017-05-03

2017-05-05

2017-05-09

2017-06-06

-------------------------

2017-03-01

2017-05-04

2017-05-05

2017-06-06




블로그 이미지

필로그래머

,

[Java] 자바 컬렉션 클래스 - List, Set, Map의 개념 정리


컬렉션 클래스

- 여러 개의 주소를 보관할 때 사용하는 클래스이다.

- 사용 목적 :

  배열의 문제는 인스턴스를 배열 크기 만큼만 저장할 수 있다는 것이다.

  더 추가로 저장하고 싶다면, 새 배열을 만들어야 한다.

  관리하기 너무 번거롭다.


자바에서 제공하는 컬렉션 클래스의 종류

 1) List 계열 

    - null 값을 저장할 수 있다.

    - 값을 중복 저장할 수 없다.

    - 값을 넣는 순서대로 저장한다.

      그래서 값을 꺼낼 때도 넣은 순서대로 꺼낼 수 있다.

    - 값을 꺼낼 때 숫자 인덱스를 사용하여 꺼낸다.

    - 예) ArrayList, LinkedList


2) set계열

    - HashSet

    - null 값을 저장할 수 있다.

    - 값을 중복 저장할 수 없다.

       이유 -> 집합이기 때문

    - 값을 넣을 때 인스턴스의 해시값을 기준으로 저장하기 때문에

      순서대로 저장되지 않는다.

      그래서 값을 꺼낼 때도 순서대로 꺼낼 수 없다.

    - 값을 꺼낼 때 숫자 인덱스로 꺼낼 수 없다.

    - 예) HashSet


3) Map 계열

    - 값을 저장할 때 key 개체의 해시 값(hash value)을 사용하여 저장한다.

    - 값을 꺼낼 때도 key 객체의 해시 값을 사용하여 꺼낸다.

    - 값을 중복 저장할 수 없다.

    - 순서대로 저장하고 순서대로 꺼낼 수 없다.

    - 보통 문자열 라벨을 사용하여 값을 저장하고 꺼낼 때 주로 사용한다.

    - 예)

       HashMap :

       - key나 value로 null을 허용한다.

       - 동기화를 지원하지 않는다.

          => 여러 스레드가 동시에 접근하여 값을 변경하는 것을 막지 않는다.

          => 데이터의 입출력 속도가 빠르다.

          => 대신 여러 스레드가 동시에 값을 바꿀 수 있기 때문에 

               멀티 스레드 상황에서 사용할 때 주의해야 한다.


       Hashtable : 

       - key나 value로 null을 허용하지 않는다.

       - 동기화를 지원한다.

          => 여러 스레드가 동시에 접근하더라도 그 중 한개의 스레드만이 접근할 수 있다.

          => 데이터의 입출력 속도가 느리다.

          => 대신 여러 스레드가 동시에 값을 바꿀 수 없기 때문에

               멀티 스레드 상황에서 안전하게 사용할 수 있다.



아래 참조


2017/05/17 - [java] - [Java] 컬렉션 클래스 - ArrayList를 직접 만들어서 내부 구조를 이해해보자

2017/05/16 - [java] - [Java] 컬렉션 클래스 - HashSet

2017/05/16 - [java] - [Java] 컬렉션 - [Map] HashMap(java.util.HashMap)




블로그 이미지

필로그래머

,