Java

[Java]Collection - List계열(ArrayList)

MoZZANG 2022. 3. 17. 19:52

이번 포스팅에서는 Collection상속을 받은 것 중 또 다른 하나인 List계열에 대해서 알아보자.

 

List계열 컬렉션에는 ArrayList클래스와 Vector클래스가 있다.

 

ArrayList클래스부터 알아보자.

 

ArrayList란?
  • List(인터페이스)계열의 컬렉션 클래스이다.
  • 중복저장기능이 있으며 데이터를 저장할 때 순서있게 저장된다.
  • 즉, 배열형태로 메모리가 형성되어 데이터가 저장된다.
  • 데이터를 꺼내올 때는 Iterator() 또는 get(index) 또는 확장 for문을 사용한다.

 

예제를 보면서 이해해보자

 

 

1) List 계열 컬렉션 객체 생성(Raw Type)

▲ 연산자를 중심으로 좌측에는 List컬렉션이 우측에는 List 컬렉션 클래스 중 하나인 ArrayList()를 사용하여 헤테로 지니어스 형태로 객체를 생성했다.

 

 

 

 1-1) 객체 저장 : add()계열

▲ set계열에서도 사용한 add()메소드를 사용하여 객체를 저장할 수 있다. List계열은 앞서말했듯 배열형태로 객체가 관리되어지기 때문에 원하는 인덱스를 지정하지 않으면 0번방부터 순차적으로 객체가 저장된다.

 

만일 원하는 인덱스를 지정해서 객체를 넣는다면 기존에 있던 객체부터 마지막 객체가 저장된 방까지 뒤로 한칸씩 밀리면서 객체가 저장되는 구조를 가지고 있다.

 

또한 인덱스 지정시에는 순차적으로 다음인덱스를 지정하거나 기존에 존재하는 인덱스로 지정해야한다. 만일 현재 3번방까지 객체가 존재한다고 했을 때 인덱스 5번을 지정해서 새로운 객체를 넣을 수는 없다는 것이다.

 

 

 

1-2) 중복저장 허용

▲ Set계열처럼 무작위로 입력되고 무작위로 출력되는 것이아닌 배열형태로 정확한 index가 존재하기 때문에 값이 중복되더라도 서로 다른 index를 가지고 있을 것이므로 중복저장이 허용된다.

 

 

 

 1-3) 출력

▲ 우리가 기본적으로 배열에 저장된 값을 출력하는 방법으로 for문을 쓰듯이 사용해도 된다. 하지만 Collection에서 사용할 수 있는 반복기(Iterator)와 확장for문을 사용하는 것이 일반적이다.

 

반복기와 확장for문은 바로 앞선 포스팅인 Set계열 포스팅에서 다루었기 때문에 참고바란다.

 

▲ 출력결과는 모두 동일하게 나온다.

 

 

1-4] 특정 위치의 인덱스에 저장된 객체를 대체 :
      set(int index,Object obj);
      특정 인덱스 위치에 새로운 객체가 저장이되고 기존 객체는 삭제된다.

▲set()메소드를 이용해서 원하는 위치index와 저장할 객체를 입력해주면 배열에 저장하듯이 할 수 있다.

   위에서 한번 언급한대로 배열 중간에 객체를 넣으면 해당 index뒤로는 한칸씩 밀리게 된다. 

 

▲ 원하는 위치에 객체가 저장되었으며 한칸씩 밀린 것을 볼 수 있다.

 

 

 

1-5)검색

 

▲Set계열과 동일하게 contains()를 이용하여 확인할 수 있으며 존재하면 true, 없으면 false로 반환한다.

 

 

 

 

1-6)삭제

remove()메소드를 사용하여 객체의 인스턴스 주소를 입력해서 삭제하면 boolean값으로 반환하며

    remove()메소드에 index값을 넣어 삭제하면 삭제된 객체의 주소를 반환한다. 현재 list는 타입 파라미터가 없는 Raw Type이기 때문에 반환타입은 Object로 반환된다.

 

또한 배열 중간에 있는 객체를 삭제하면 중간에 객체를 넣을때 늘어나듯이 다시 배열이 자동으로 줄어든다. 중복된 객체가 있을 때 해당 객체를 삭제하려고 하면 index가 빠른 것이 먼저 삭제된다는 점도 알아두자.

 

▲삭제 후 출력결과

 

 

 

 

1-7)객체의 인덱스 찾기:int indexOf(Object)

▲ indexOf()메소드를 이용해서 객체의 위치를 찾을 수도 있다. 만약 해당 객체의 주소가 없으면 -1이 반환된다.

 

 

 

 

 

 

 

2) 타입파라미터 지정 : Student

▲ 이번에는 우리 블로그에서 애용하고 있는 Student클래스를 타입파라미터로 지정해서 제네릭 타입으로 예제를 만들어보자. 이제는 타입을 정해주었기 때문에 Student타입만 list에 담을 수 있다. 이로써 컴파일 시 객체의 타입을 검사해서 해당되지 않는 타입은 담을 수 없다.(Type Safety)

 

 

 

 

 

2-1)컬렉션에 저장할 객체 생성 & 저장 & 출력

▲ list2에 저장할 Student타입의 객체들을 생성하고 add()를 이용하여 list2에 담았다. List계열은 중복저장이 허용된다.

 

 

 

▲ 잘 저장됐는지 확인해보고 중복저장된 객체("나길동")를 주소로 삭제한 후 결과도 알아보자.

 

 

▲ 우리가 입력한 순서대로 잘 저장이 되었다가,  stu2객체주소로 삭제를 하니까 index가 빠른 객체의 데이터가 삭제된 것을 볼 수 있다.

 

▲ 출력은 Raw Tpye과 동일한 방법으로 가능하다.

 

 

 

 

2-2)삭제

▲동일하게 remove()메소드에 index를 지정하여 삭제하면 삭제한 객체의 주소가 반환된다. 

 

▲ 여기서는 반환된 주소에 우리가 맴버변수로 지정해두었던 name을 호출하여 저장된 데이터값이 출력된다.