배열은 연관된 data를 관리하기 위한 수단이다. 그런데 배열에는 몇가지 불편한 점이 있는데 그 중의 하나가 한번 정해진 배열의 크기는 변경할 수 없다는 점이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
package hoony.tistory.java;
public class ArrayListTest {
public static void main(String[] args) {
String[] str = new String[3]; // 크키가 3인 String 배열을 선언했다.
str[0] = "one";
str[1] = "two";
str[2] = "three";
str[3] = "four"; // 이 부분을 입력하면 오류가 발생한다.
for(int i=0; i<str.length; i++) {
System.out.println(str[i]);
}
}
}
|
cs |
<코드1.1>
<코드1.1>처럼 처음에 선언한 배열의 크기를 벗어나면 오류가 발생한다. 이러한 불편함을 "컬렉션 프레임워크"를 사용하면 줄어든다.
아례의 예를 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
package hoony.tistory.java;
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
String[] str = new String[3];
str[0] = "one";
str[1] = "two";
str[2] = "three";
for(int i=0; i<str.length; i++) {
System.out.println(str[i]);
}
ArrayList al = new ArrayList();
al.add("one");
al.add("two");
al.add("three");
for(int i=0; i<al.size(); i++) {
System.out.println(al.get(i));
}
}
}
|
cs |
<코드1.2>
<코드1.1>처럼 배열은 크기를 한번 지정하면 크기보다 많은 수의 값을 저장할 수 없다는 것을 확인했다. 하지만
<코드1.2>를 보면 ArrayList는 크기를 미리 지정하지 않아도 많은 수의 값을 저장이 가능하다.
배열을 사용할 때 배열의 길이를 구할 때는 .length를 사용했지만 ArrayList에서는 size() 메서드를 호출한다.
또한 특정한 값을 가져올 때 배열은 [인덱스 번호]를 사용했지만 ArrayList는 get(int index) 메서드를 호출한다. get() 메서드의 인자 값
으로 인덱스 번호를 입력하면 인덱스 값에 해당하는 값을 추출할 수 있다.
그런데 ArrayList를 사용할 때 주의해야 할 점이 있다. <코드1.2>의 21~23 라인의 코드를 아래처럼 변경해보겠다.
1
2
3
4
5 |
for(int i=0; i<al.size(); i++) {
String value = al.get(i);
System.out.print(value);
}
|
cs |
<코드1.3>
<코드1.3>을 컴파일하면 오류가 발생한다. 왜냐하면 ArrayList의 add() 메서드는 인자 값으로 어떤 형태의 값이 올지 알 수 없다.
즉, byte, short, int, long, char, stirng 등등 모든 타입이 입력 가능하다는 것이다. 그런데 get() 메서드를 사용하여 값을 추출한 후에
String 타입에 저장하기 때문에 오류가 발생한다.
( add() 메서드는 인자 값으로 모든 데이터의 조상인 Object 타입으로 데이터를 받는다. )
현 상황에서 오류를 해결하기 위한 방법은 아래 코드처럼 2가지 방법이 있다.
1
2
3
4
5
6
7
8
9 |
for(int i=0; i<al.size(); i++) {
String value = (String)al.get(i); // 형변환
System.out.print(value);
}
for(int i=0; i<al.size(); i++) {
String value = al.get(i)+""; // 문자열 더하기
System.out.print(value);
} |
cs |
<코드1.4>
첫 번째 방법은 get() 메서드의 반환 값을 String타입으로 형변환 시켜주는 것이고 두 번째 방법은 get() 메서드의 반환 값과 ""(문자열)을 덧셈 연산을 해주는 것이다.(어떠한 타입 + String 타입 = String 타입이되기 때문이다.)
하지만 위의 방식은 예전의 방식이다. 이제는 아래와 같이 Generic(제너릭)을 사용해야 한다.
1
2
3
4
5
6
7
8
9 |
ArrayList<String> al = new ArrayList<String>();
al.add("one");
al.add("two");
al.add("three");
for(int i=0; i<al.size(); i++){
String value = al.get(i);
System.out.println(value);
}
|
cs |
<코드1.5>
제너릭을 사용하면 ArrayList 내에서 사용할 데이터 타입을 인스턴스를 생성할 때 지정할 수 있기 때문에 데이터를
추출 할 때 굳이 형변환 또는 문자열 덧셈 연산을 하지 않아도 된다.
'언어 > JAVA' 카테고리의 다른 글
[Java] 클래스 / 인스턴스 / 지역변수 쉽게 이해하기 (0) | 2019.11.26 |
---|---|
[Java] 스캐너(Scanner)클래스 사용 방법 (0) | 2019.11.26 |
[JAVA] HashMap 컬렉션 클래스 사용 방법 (0) | 2018.03.28 |
[JAVA] Enumeration, Iterator, ListIterator 인터페이스 사용 방법 (0) | 2018.03.22 |
[JAVA] Vector 클래스 사용 방법 (0) | 2018.03.21 |