Java/객체지향 프로그래밍

JAVA / 객체 배열 사용하기

CBJ 2022. 6. 20. 14:44

※출처

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, 05);
        
        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의 값은 변화 없고 주소 값은 달라진 것을 확인할 수 있다.