반응형

 

 

배열은 연관된 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 내에서 사용할 데이터 타입을 인스턴스를 생성할 때 지정할 수 있기 때문에 데이터를

추출 할 때 굳이 형변환 또는 문자열 덧셈 연산을 하지 않아도 된다.

 

반응형

+ Recent posts