※출처
https://fastcampus.co.kr/dev_online_javaend
https://coding-factory.tistory.com/548
객체 배열 선언과 구현
- 기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만, 객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당되고(null) 각 요소 객체는 생성하여 저장해야 함
| library[0] | library[1] | library[2] | library[3] | library[4] |
| null | null | null | null | null |
객체 배열 예제
|
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
public class Book {
private String title;
private String author;
public Book() {
}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void showInfo() {
System.out.println(title + "," + author);
}
}
------------------------------------------------
public class BookTest {
public static void main(String[] args) {
Book[] library = new Book[5]; // 선언을 해줘도 책이 5개 잡히는게 아니다.
// for (int i = 0; i < library.length; i++) {
// System.out.println(library[i]);
// }
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
for (Book book : library) {
System.out.println(book);
book.showInfo();
}
}
}
|
cs |
- 40 : 객체 배열 선언 및 객체 초기화
- 46 ~ 50 : 객체 초기화 후 정보 입력
- 53 : 객체 주소 값 확인
- 54 : 객체 값 확인
- ch21.Book@2a139a55
- 태백산맥1,조정래
- ch21.Book@15db9742
- 태백산맥2,조정래
- ch21.Book@6d06d69c
- 태백산맥3,조정래
- ch21.Book@7852e922
- 태백산맥4,조정래
- ch21.Book@4e25154f
- 태백산맥5,조정래
객체 배열 복사
System.arrayCopy(src, srcPos, dest, destPos, length)지바에서 제공되는 배열 복사 메서드
얕은 복사(Shallow Copy)
- 객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정됨
(하나의 주소 값을 가지고 있으므로 하나라고 볼 수 있다.) - 두 배열이 같은 객체를 가리킴
얕은 복사 예제
|
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
42
43
44
45
|
public class ObjectCopyTest {
public static void main(String[] args) {
Book[] library = new Book[5];
Book[] copyLibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
System.arraycopy(library, 0, copyLibrary, 0, 5);
System.out.println("=== library ===");
for (Book book : library) {
System.out.println(book);
book.showInfo();
}
System.out.println("=== copyLibrary ===");
for (Book book : copyLibrary) {
System.out.println(book);
book.showInfo();
}
library[0].setAuthor("박완서");
library[0].setTitle("나목");
System.out.println("=== changeLibrary ===");
for (Book book : library) {
System.out.println(book);
book.showInfo();
}
System.out.println("=== changeCopyLibrary ===");
for (Book book : copyLibrary) {
System.out.println(book);
book.showInfo();
}
}
}
|
cs |

- 29, 30 :
library[0]번째 값을 바꾸면copyLibrary[0]번째 값도 바뀌는 것을 볼 수 있다.
깊은 복사(Deep Copy)
- 각각의 객체를 생성하여 그 객체의 값을 복사하여 배열이 서로 다른 객체를 가리키도록 함
깊은 복사 예제
|
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public class DeepCopyTest {
public static void main(String[] args) {
Book[] library = new Book[5]; // 선언을 해줘도 책이 5개 잡히는게 아니다.
Book[] copyLibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
copyLibrary[0] = new Book();
copyLibrary[1] = new Book();
copyLibrary[2] = new Book();
copyLibrary[3] = new Book();
copyLibrary[4] = new Book();
for (int i = 0; i < library.length; i++) {
copyLibrary[i].setAuthor(library[i].getAuthor());
copyLibrary[i].setTitle(library[i].getTitle());
}
System.out.println("=== library ===");
for (Book book : library) {
System.out.println(book);
book.showInfo();
}
System.out.println("=== copyLibrary ===");
for (Book book : copyLibrary) {
System.out.println(book);
book.showInfo();
}
library[0].setAuthor("박완서");
library[0].setTitle("나목");
System.out.println("=== changeLibrary ===");
for (Book book : library) {
System.out.println(book);
book.showInfo();
}
System.out.println("=== changeCopyLibrary ===");
for (Book book : copyLibrary) {
System.out.println(book);
book.showInfo();
}
}
}
|
cs |

- 바뀐 결과 값을 보면
chargeCopyLibrary의 값은 변화 없고 주소 값은 달라진 것을 확인할 수 있다.
'Java > 객체지향 프로그래밍' 카테고리의 다른 글
| JAVA / 객체 간의 상속 (0) | 2022.06.22 |
|---|---|
| JAVA / 객체 배열을 구현한 클래스 ArrayList (0) | 2022.06.20 |
| JAVA / static 응용 - 싱글톤 패턴(singleton pattern) (0) | 2022.06.17 |
| JAVA / static 메서드 (0) | 2022.06.17 |
| JAVA / static 변수 (0) | 2022.06.16 |