2021. 9. 16. 00:36ㆍWeb/JAVA
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[] {1, 2, 3}; // 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 = {1, 2, 3, 4, 5};
int[] array2 = {10, 20, 30, 40, 50};
System.arraycopy(array1, 0, array2, 1, 3);
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, 0, 3);
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) (1) | 2021.09.17 |
[JAVA] singleton 패턴 (0) | 2021.09.15 |
[JAVA] static 변수 (0) | 2021.09.14 |
[JAVA] this란? (0) | 2021.09.09 |