[JAVA] ArrayList

2021. 9. 16. 00:36Web/JAVA

728x90

ArrayList란?

배열의 기능을 구현한 JAVA JDK에서 제공해주는 클래스로

배열을 직접 생성해서 쓰게 될 때 생기는 불편한 점을 보완해 기능 제공을 해 주는 클래스입니다.

 


JAVA에서의 배열 사용법

 

자료형[] 배열이름 = new 자료형[갯수];

int[] arr = new int[10];

 

자료형 배열이름[] = new 자료형[갯수];

int arr[] = new int[10];

 


배열 초기화

배열을 선언함과 동시에 초기화 할 수 있고 초기화 시에는 배열의 갯수를 명시하지 않습니다.

1
2
3
        int[] numbers = new int[] {1, 2, 3}; // 사용 가능
        int[] numbers = new int[3] {1, 2, 3}; // 오류, 갯수를 명시하지 않아야 합니다.
        int[] numbers = {1, 2, 3}; // 사용 가능
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package array;
 
public class ArrayTest {
 
    public static void main(String[] args) {
 
        int[] numbers = new int[] {123}; // 1, 2, 3으로 배열 초기화
 
        for(int i = 0; i < numbers.length; i++) {
            System.out.println(numbers[i]); // 1, 2, 3 출력
        }                
        
        int[] number2 = new int[3]; // 초기화 하지 않고 길이만 선언
        
        for(int i = 0; i < number2.length; i++) {
            System.out.println(number2[i]);  // 0, 0, 0 출력
        }
    }
 
}
 
cs

 

※ 배열 사용시 주의할 점

[0], [1], [2] 에만 값이 들어간 상태에서 배열 전체의 값을 for문으로 곱하는 경우

값이 들어가지 않은 [4], [5] 에 할당된 0이 곱해져 결과값이 0으로 나오게 됩니다.

이때 유효값만 곱하길 원한다면 새로 변수를 만들어 하나씩 늘어나게 하고

for문에서 범위를 새로 만든 변수 크기 만큼으로 정해 [4], [5]가 곱해지지 않도록 해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package array;
 
public class ArrayTest2 {
 
    public static void main(String[] args) {
 
        double[] num = new double[5]; // 길이는 5이지만 0, 1, 2만 값이 들어간 상태
        int size = 0// 유효한 갯수를 변수로 만들어 사용
        
        num[0= 10.0; size++;
        num[1= 20.0; size++;
        num[2= 30.0; size++;
        
        double total = 1;
 
        for(int i = 0; i < size; i++) { // size 대신 length로 하면 전체 배열의 길이가 0이기 때문에 0이 나옴
            System.out.println(num[i]);
            total *= num[i]; // size를 정해놓지 않고 전부 곱하게 되면 num[4], [5] 값이 0으로 할당되어 곱한 값이 0이 됨
        }
        System.out.println("total = " + total);
    }
 
}
 
cs

 


문자 배열 출력

A부터 Z까지 문자 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package array;
 
public class ArrayTest3 {
 
    public static void main(String[] args) {
 
        char[] alphabets = new char[26];
        char ch = 'A';
        
        for(int i = 0; i < alphabets.length; i++, ch++) {
            alphabets[i] = ch;
        }
        
        for(int i = 0; i < alphabets.length; i++, ch++) {
            System.out.println(alphabets[i]);
        }
    }
 
}
 
cs

 


객체 배열 출력

객체 배열이 생성되면 주소 자리가 형성됩니다.

하지만 자리만 형성되어 인스턴스 값이 없다면 기본적으로 null 값이 들어가 있게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
package array;
 
public class BookArray {
 
    public static void main(String[] args) {
 
        Book[] library = new Book[5]; // Book이 5개 생성되는 것이 아닌 Book이 들어간 주소 자리가 5개 생성됨
        
        for(int i = 0; i < library.length; i++) {
            System.out.println(library[i]); // 따라서 null 5개가 출력
        }        
    }
}
cs

 

따라서 객체 배열에 인스턴스 값을 넣어줘야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package array;
 
public class BookArray {
 
    public static void main(String[] args) {
 
        Book[] library = new Book[5]; // Book이 5개 생성되는 것이 아닌 Book이 들어간 주소 자리가 5개 생성됨
        
        library[0= new Book("어린왕자""생택쥐페리"); // 인스턴스 값
        library[1= new Book("토지""박경리");
        library[2= new Book("칼의 노래""김훈");
        library[3= new Book("생각을 바꾸는 생각들""비카스 샤");
        library[4= new Book("꿈의 해석""프로이트");
 
        for(int i = 0; i < library.length; i++) {
           library[i].showBookInfo(); // 인스턴스 값 모두 출력
        }
        
        for(int i = 0; i < library.length; i++) {
            System.out.println(library[i]); // 인스턴스 값 주소 모두 출력
        }        
    }
}
cs

 


배열 복사하기

기존 배열과 같은 배열을 만들거나 배열이 찬 경우 더 큰 배열을 만들고 기존 배열을 복사할 수 있습니다.

java에서의 사용법은 System.arraycopy를 사용하면 됩니다.

 

System.arraycopy(src, srcPos, dest, destPos, length);

src : 복사할 배열

 

srcPos : 복사할 배열의 첫 번째 위치

 

dest : 붙여넣을 대상 배열

 

destPos : 붙여넣을 첫 번째 위치

 

length : 복사할 요소 갯수

 

※ 배열 복사 예제

아래 예제에서는 array1의 0번 인덱스부터 3번 인덱스까지 복사해

array2에 1번 인덱스부터 붙여넣은 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package array;
 
public class ArrayCopy {
 
    public static void main(String[] args) {
        int[] array1 = {12345};
        int[] array2 = {1020304050};
        
        System.arraycopy(array1, 0, array2, 13);
        for(int i = 0; i < array2.length; i++) {
            System.out.println(array2[i]); // 10, 1, 2, 3, 50 출력
        }
    } 
}
// array1 : 복사할 배열
// 0 : 복사할 첫 번째 위치
// array2 : 복사할 대상 배열
// 1 : 붙여넣을 첫 번째 위치
// 3 : 복사할 요소 갯수
cs

 

객체 배열 복사

얕은 복사

배열 요소의 '주소'만 복사되므로 배열 요소가 변경되면 복사된 배열 값도 변경됨

 

※ 얕은 복사 예제

예제에서는 bookArray1의 요소만 수정했지만 bookArray2도 같이 변경된 걸 볼 수 있습니다.

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
27
28
29
30
31
32
33
34
35
36
37
38
package array;
 
public class ObjectCopy {
 
    public static void main(String[] args) {
 
        Book[] bookArray1 = new Book[3];
        Book[] bookArray2 = new Book[3];
        
        bookArray1[0= new Book("칼의 노래1""김훈");
        bookArray1[1= new Book("칼의 노래2""김훈");
        bookArray1[2= new Book("칼의 노래3""김훈");
        
        System.out.println("=====bookrArray1을 bookArray2로 복사=====");
        
        System.arraycopy(bookArray1, 0, bookArray2, 03);
        
        for(int i = 0; i < bookArray2.length; i++) {
                bookArray2[i].showBookInfo(); // "칼의 노래1, 김훈", "칼의 노래2, 김훈", "칼의 노래3, 김훈"
        }
        
        bookArray1[0].setBookName("어린왕자");
        bookArray1[0].setAuthor("생택쥐페리");
        
        System.out.println("=====bookrArray1의 결과값=====");
        
        for(int i = 0; i < bookArray1.length; i++) {
            bookArray1[i].showBookInfo(); // bookArray1의 0번 인덱스의 제목과 저자가 수정됨
        }
        
        System.out.println("=====bookArray2의 결과값=====");
        
        for(int i = 0; i < bookArray1.length; i++) {
            bookArray2[i].showBookInfo(); // 위에서 변경하지 않은 bookArray2의 0번 인덱스도 같이 수정됨
        }
    }
}
 
cs

 

깊은 복사

복사한 배열의 인스턴스 값을 따로 관리해야 한다면 새로운 인스턴스를 생성해 배열에 넣어줘야 합니다.

 

※ 깊은 복사 예제

얕은 복사와 달리 bookArray2에 default instance를 추가했고

arraycopy 메서드를 사용하지 않고 bookArray1의 값을 각각 가져와

인스턴스 값들을 따로 관리하도록 했습니다.

따라서 결과값을 출력해보면 얕은 복사와 달리 bookArray1에만 수정된 값이 들어가게 됩니다.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package array;
 
public class ObjectCopy {
 
    public static void main(String[] args) {
 
        Book[] bookArray1 = new Book[3];
        Book[] bookArray2 = new Book[3];
        
        bookArray1[0= new Book("칼의 노래1""김훈"); // bookArray1은 인스턴스에 대입해 놓은 상태
        bookArray1[1= new Book("칼의 노래2""김훈");
        bookArray1[2= new Book("칼의 노래3""김훈");
        
        bookArray2[0= new Book(); // bookArray2는 맴버변수가 채워지지 않은 상태 
        bookArray2[1= new Book();
        bookArray2[2= new Book();
        
        // System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
        
        for(int i = 0; i < bookArray1.length; i++) {
                bookArray2[i].setAuthor(bookArray1[i].getAuthor()); // arraycopy를 사용하지 않고 각각 값들을 가져옴
                bookArray2[i].setBookName(bookArray1[i].getBookName()); // arraycopy를 사용하지 않고 각각 값들을 가져옴
        }
        
        bookArray1[0].setBookName("어린왕자");
        bookArray1[0].setAuthor("생택쥐페리");
        
        System.out.println("=====bookrArray1의 결과값=====");
        
        for(int i = 0; i < bookArray1.length; i++) {
            bookArray1[i].showBookInfo(); // bookArray1의 0번 인덱스의 제목과 저자가 수정됨
        }
        
        System.out.println("=====bookArray2의 결과값=====");
        
        for(int i = 0; i < bookArray1.length; i++) {
            bookArray2[i].showBookInfo(); // 위에서 변경하지 않은 bookArray2의 0번 인덱스도 같이 수정됨
        }
    }
}
 
cs

'Web > JAVA' 카테고리의 다른 글

[JAVA] print(), println()의 차이점  (1) 2021.09.18
[JAVA] 향상된 for문, 빠른 for문(enhanced for loop)  (0) 2021.09.17
[JAVA] singleton 패턴  (0) 2021.09.15
[JAVA] static 변수  (0) 2021.09.14
[JAVA] this란?  (0) 2021.09.09