ArrayList 와 Generic

살찐성인·2022년 7월 8일
0

Java

목록 보기
1/4

ArrayList란?

서로 연관된 데이터를 관리하는 방법으로 가장 대표적인 방법은 배열이다. 하지만 배열은 한번 크기를 정하고 나면 다시 변경할 수 없는 큰 단점이 있다. 이 단점을 극복하기 위해 JAVA에서는 Collections Framework 의 기능 중 하나인 ArrayList를 지원하고 있다. ArrayList는 가장 대표적인 Collections Framework이다. 배열과는 다르게 따로 크기를 지정할 필요가 없으며 가장 많이 사용되는 컬렉션이라고 볼 수 있다.

선언하는 방식은 아래와 같다.

ArrayList a1 = new ArrayList();

ArrayList는 메소드 이므로 위와 같이 선언하면 된다. 그리고 ArrayList 타이핑 후 ctrl + shift로 임포트 하여 사용하도록 하자.

이 ArrayList에 데이터를 추가하려면,

a1.add("one");
a1.add("two");

위와 같은 식으로 넣을 수 있으며,
for문을 사용하여 출력하고 싶을 때는 아래와 같이 쓸 수 있다.

for ( int I = 0; a1.size(); I++) {
System.out.println (a1.get(i));
}

일반적인 배열의 크기는 length를 사용하나 ArrayList의 크기는 size();를 사용한다.

ArrayList a1 = new ArrayList();
a1.add("one");
a1.add("two");
for ( int I = 0; a1.size(); I++) {
String value = a1.get(i);
System.out.println (a1.get(i) );
}

위 코드를 예로 보자. 언뜻 보기엔 정상적인 코드 같지만 String value = a1.get(i); 부분에 에러가 발생하게 된다. 그 이유는 ArrayList의 특징 때문이다. 기본적으로 ArrayList는 어떤 데이터 형태도 담을 수 있다. ArrayList는 모든 데이터 타입의 조상인 Object형이기 때문이다.

a1.add("one");

ArrayList의 add라는 메소드는 어떤 데이터타입도 수용할 수 있는 형태의 메소드이다. add라는 메소드의 인자(“one") 가 Object여야 한다. 아까도 언급했다시피 Object는 모든 데이터타입의 조상이기 때문이다. 모든 데이터 타입을 수용하려면 이 인자의 매개변수의 데이터타입이 Object형이어야 하기 때문이다. "one"이라고 하는 String 데이터타입은 ArrayList 내부에 저장될 때 Object 데이터타입으로 저장되어 있다. 따라서 get이라는 메소드를 통해서 첫 번째 인자로 전달된 index에 해당되는 값이 0인 값인 "one"이 Object 데이터 타입으로 저장되어 있기 때문에 ”one" 은 현재 Object 타입인 것으로 생각할 수 있다.

다시 말해, String value = a1.get(i); 는 Object 타입의 데이터를 value라는 변수에 담으려고 하고 있는데, value라는 변수의 데이터타입을 String으로 지정해 버린 것이다. Object를 String이라는 데이터타입에 변수인 value에 저장하려고 하고 있기 때문에 에러가 발생한 것이다.

그렇다면 이 오류를 해결하기 위해선 어떻게 해야 할까?
답은 아주 간단하다. get을 통해서 리턴되는 값을 String 데이터 타입으로 형변환을 하면 아래와 같이 value 안에 담을 수 있게 된다.

String value = (String)a1.get(i); 

따라서 위의 예시처럼 ArrayList를 사용할 때에는 add로 추가했던 그 데이터 값을 가져올 때 그 값을 원래인 데이터 타입으로 형변환을 해줘야 한다.

Generic의 필요성

하지만 이런 데이터가 한 두 개가 아니라 수백개, 수천개라면?
이런 문제를 해결하기 위해 컬렉션 프레임워크에 제네릭(Generic)이라는 것을 채택하게 되었다.

예시를 보면 다음과 같다.

ArrayList<String> a1 = new ArrayList<String>();

위와 같이 ArrayList 옆에 이라는 것을 양쪽으로 입력한다. 이렇게 되면 a1이라고 하는 ArrayList의 추가되는 값이 String 데이터타입을 제네릭을 통해 지정이 된 것이다. 그렇기 때문에 get을 통해 가져온 값을

String value = (String)a1.get(i); 

이런 식으로 형변환을 강제로 해줄 필요가 없다. 왜냐하면 이 제네릭을 통해서 입력되는 데이터의 타입이 String 이라는 사실을 명시했기 떄문에 내부적으로 get으로 가져오는 데이터 타입은 String으로 인식하기 때문이다.

참조
생활코딩 유튜브
KH정보교육원

0개의 댓글