JAVA / 객체 배열 사용하기

아몬드봉봉·2023년 12월 12일
0

Java

목록 보기
12/17

객체 배열 선언과 구현

기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만, 객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당되고(null) 각 요소 객체는 생성하여 저장해야 함

library[0] library[1] library[2] library[3] library[4]
null null null null null

객체 배열 예제

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();
        }
        
    }
    
}
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) 지바에서 제공되는 배열 복사 메서드

얕은 복사

  • 객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정됨
    (하나의 주소 값을 가지고 있으므로 하나라고 볼 수 있다.)
  • 두 배열이 같은 객체를 가리킴
얕은 복사 예제
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();
        }
    }
    
}

  • library[0]번째 값을 바꾸면 copyLibrary[0]번째 값도 바뀌는 것을 볼 수 있다.

깊은 복사

  • 각각의 객체를 생성하여 그 객체의 값을 복사하여 배열이 서로 다른 객체를 가리키도록 함
깊은 복사 예제
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();
        }
        
    }
 
}

  • 바뀐 결과 값을 보면 chargeCopyLibrary의 값은 변화 없고 주소 값은 달라진 것을 확인할 수 있다.

출처

https://coding-factory.tistory.com/548

profile
성장을 즐기는 백엔드 자바 개발자

0개의 댓글

관련 채용 정보