Java - ArrayList , ArrayList 메서드

김지원·2022년 8월 2일
0

JAVA 총 정리

목록 보기
7/11
int[] numbers = new int[] {2,3,5};

numbers 배열의 길이는 3인데 7을 하나 추가해서 배열을 {2,3,5,7} 이렇게 만들고 싶을 때는 어떻게 할까?

numbers[3] = 7;
  • 값을 정해주면 될 것 같아서 해보았더니..

결과는 오류가 뜬다.

  • ArrayIndexOutOfBoundsException : 이 배열은 길이가 3 짜리이고 마지막 인덱스는 2인데 범위를 벗어난 값을 적었다는 오류를 날려준다.

  • 배열하나를 더 만들어서 그 자리에 7을 넣어줘야한다. 굉장히 복잡하기 때문에 이렇게 개발을 하면 안된다.

List

ArrayList / Vector / LinkedList

그래서 ArrayList를 사용한다.

ArrayList<E>

: E 타입만 가지는 ArrayList

  • List 자료구조의 일종
  • 일반 배열과 달리 원소에 대한 추가 / 삭제 / 조회 등이 매우 용이하다.
  • 그 외 존재 의의나 기능 등은 일반 배열과 유사하다.
  • 이 때 E는 래퍼런스 타입이어야 함으로 기초타입(int, long 등) 사용이 불가능하다.이에 아래와 같이 대체한다.
int → Integer
long → Long
boolean → Boolean


제네릭(Generic)

: 어떠한 클래스/인터페이스에 대한 동적인 타입을 지원하기 위해 사용한다.

  • 문자열 배열 str을 만들었고 배열안에 int를 집어넣으니 받아들이지 못하고 있다. ArrayList도 배열이기 때문에 또한 똑같다.

받아들여야되는 타입이 따로 있다.

String객체를 받는 ArrayList를 한번 만들어보자.
ArrayList는 대문자로 시작하니 레퍼런스 타입이다. 즉, 객체화 할 때 new키워드 사용한다는 것이다.

ArrayList<String> strList = new ArrayList<>();
  • <> 객체화할때 뒤에 사용하는 제네릭 타입이 같을 때 생략한다는 말이다.
ArrayList<String> strList = new ArrayList<String>();
  • 똑같이 작동한다.

strList ArrayList는 그 원소로써 문자열(String)만 받을 수 있다.

  • 숫자를 담는 ArrayList를 만들 때는 타입을 int가 아닌 Integer을 사용해야한다.

ArrayList 메서드

add(E)

: E 타입의 객체를 추가한다.
( String으로 만들면 String이 아닌 int와 같은 다른 타입은 집어넣지 못한다.)

get(x)

: 정수인 x번째 인덱스를 가지는 원소를 반환한다.
이때 인덱스는 기본 배열의 그것과 같다.

  • 추가를 하고나서 get을 이용해 인덱스 번호로 접근이 가능하다.

set(i, E)

: 정수인 i 번째 인덱스에 있는 값을 전달된 E 객체로 대체한다.
현재 ArrayList가 가지는 원소의 인덱스 범위를 벗어나면 IndexOutOfBoundsException이 발생한다.

  • index 와 String타입의 요소하나를 적어주면 된다.

  • IndexOutOfBoundsException 발생
    strList는 길이가 2인데 strList 원소의 인덱스 범위를 벗어났기 때문에 오류가 발생했다.

indexOf(E)

: ArrayList가 가지고 있는 원소 중 전달된 E객체와 일치하는 "첫번째" 원소의 인덱스 번호를 반환한다. 만약 그러한 것이 없다면 -1을 반환한다.

  • 동일한 것이 여러개라면 그 중에서 가장 앞 순서의 인덱스를 가져다준다.
  • 동일한 것이 없다면 -1 반환한다.

lastIndexOf(E)

: indexOf(E) 와 기능은 유사하나 첫번째가 아닌 "마지막" 원소의 인덱스를 돌려준다.

size()

: ArrayList의 길이를 돌려준다. 일반 배열의 'length' 속성과 같음.

ArrayList에서 length메서드도 사용이 가능하게 만들 수 있는데...

  • 새로운 ArrayList을 상속받는 MyArrayList클래스에 length라는 메서드를 구현해주면 된다.

contains(E)

: ArrayList가 전달된 E 객체를 포함하고 있는지 여부를 반환한다.

  • indexOf의 값이 -1이랑 같은 역할을 한다. 작성할 때의 로직이 다른 것 뿐.
  • 동일하게 사용가능하다.

clear()

: ArrayList가 가진 모든 원소를 제거한다.

remove(i)

: 정수인 i 번째 인덱스를 삭제한다. 단, 뒤에 있는 원소들의 인덱스는 당겨진다.

{"a", "b", "c", "d"} → remove(1) → {"a", "c", "d"}
  0    1    2    3                   0    1    2

  • get(2)했을 때 c가 출력이 됬는데 remove(1)했더니 d가 나오게 된다. 즉, 인덱스가 당겨짐을 의미한다.

remove(E)

: ArrayList가 가지고 있는 원소 중 전달된 E 객체와 일치하는 "첫번째"원소를 제거한다.

remove는 인덱스 별로도 삭제할 수 있고 값 자체로도 삭제할 수 있다.

isEmpty()

: 값이 하나라도 없는가에 대한 여부를 반환한다.

.size() == 0 // 같은 결과를 낸다.

containsAll(ArrayList<E>)

: ArrayList 가 전달된 또 다른 E 타입의 ArrayList가 가진 원소들을 모두 포함하고 있는가에 대한 여부를 반환한다.

{"a","b","c","d"} / {"a,"c"}

  • 이렇게는 사용하지 못한다. collection 을 달라고 한다.

length 처럼 containsAll 메서드를 정의해서 훨씬 더 편리하게 사용할 수 있도록 해보았다.

  • 새로운 클래스 ArrayList를 상속받는 MyArrayList에 containsAll이라는 메서드를 만들어서 안의 내용을 정의해주었다.
  • MyArrayList로 객체화해주고 collection 형태를 쓰지 않고 containsAll을 사용할 수 있게 되었다.

Array ' ... '

MyArrayList 클래스의 ontainsAll 메서드에서 배열인데 [ ]이 아닌 ...을 사용한 이유는 배열대신 ArrayList를 사용하는 것 처럼 배열의 길이를 정해놓지 않기 위해서 사용했다. 무한하게 들어갈 수 있게 된다.

profile
Software Developer : -)

0개의 댓글