1. 배열(Array) 이란?
1) 개념
선형 자료구조 중 하나로 동일한 타입의 연관 데이터를 메모리에 연속적으로 저장하여 하나의 변수에 묶어서 관리하기 위한 자료구조이다.
같은 데이터 유형의 변수를 여러 개 선언해야하는 불편함을 줄이기 위해 사용된다.
2.기본 자료형 배열
1) 배열 선언 및 출력
int[] arr1 = new int[10];
int arr2[] = new int[10];
배열을 선언한 후 해당 배열을 출력하면 모든 값이 0으로 출력된다.
public class ArrayStudy {
public static void main(String[] args) {
//배열 선언
int[] arr1 = new int[10];
int arr2[] = new int[10];
for(int i = 0 ; i < arr1.length ; i ++) {
System.out.println(arr1[i]);
}
}
}
2) 배열 복사
ArrayCopy 클래스에 arr1, arr2 배열을 각각 생성하고 다른 값을 넣는다.
arrcopy를 이용하여 기본 자료형 배열 복사를 수행한다.
해당 구문의 의미는 arr1의 첫번째 요소부터 3개의 요소를 arr2 1번째 요소부터 차례대로 대입한다는 뜻이다.
arraycopy(Object src, int srcPos, Object dest, destPos, lenght);
public class ArrayCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30, 40, 50};
int[] arr2 = {1, 2, 3, 4, 5};
//배열 복사
System.arraycopy(arr1, 0, arr2, 1, 3);
for(int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
해당 결과를 출력할 경우 1,2,3,4,5가 아닌 1,10,20,30,4,5가 출력된다.
3. 참조 자료형 배열(객체 배열)
1) 배열 선언 및 출력
Book[] libray = new Book[5];
배열 요소에 생성할 객체의 주소를 저장하게된다.
참조 배열을 생성할 Book클래스를 생성하고 책 제목, 저자를 저장한 후 출력할 수 있도록 설정한다.
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 showBookInfo() {
System.out.println("책 제목: " + title);
System.out.println("저자 이름: " + author);
}
}
Book 객체의 참조 배열을 선언한 후 출력한다.
public class ArrayStudy {
public static void main(String[] args) {
//참조 배열 선언
Book[] library = new Book[5];
for(int i = 0; i < library.length; i++) {
System.out.println(library[i]);
}
}
}
참조 배열을 생성하면 객체가 5개 생성된 것이 아닌 배열 요소에 생성할 객체의 주소를 저장하게 될 공간이 생성되기 때문에 null 값이 출력되는것을 확인할 수 있다.
main 함수에 Book 객체를 생성한 후 library 배열 요소에 하나씩 대입한 후 출력한다.
public class ArrayStudy {
public static void main(String[] args) {
//참조 배열 선언
Book[] library = new 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++) {
System.out.println(library[i]);
}
}
}
객체의 정보가 출력되는것이 아닌 객체의 이름과 주소 값을 출력한다.
객체 안의 정보를 출력하고 싶다면 Book 클래스에서 생성한 showBookInfo() 메서드를 호출하여 출력한다.
for(int i = 0; i < library.length; i++) {
System.out.println(i+1 + "번째 책 제목");
library[i].showBookInfo();
}
2) 배열 복사
2.1) 얕은 복사
copyLibrary 배열에 객체가 생성되는것이 아니라 Heap 메모리의 주소 값만 복사되는 경우를 얕은 복사라고 부른다.
ObjectCopy 클래스에 참조 배열 및 복사할 배열을 선언한 후 객체를 생성하고 이전과 동일하게 arraycopy를 이용하여 참조 배열을 복사한 후 출력하면 library 배열과 copyLibrary 배열의 값이 일치하게 된다.
public class ObjectCopy {
public static void main(String[] args) {
//참조 배열 선언
Book[] library = new Book[5];
//복사할 참조 배열 선언
Book[] copyLibrary = new Book[5];
//객체 생성
library[0] = new Book("달러구트 꿈 백화점","이미예");
library[1] = new Book("블랙 소맨과 이름없은 마을의 살인","히가시노 게이고");
library[2] = new Book("작가들의 비밀스러운 삶","귀욤 뮈소");
library[3] = new Book("죽고싶지만 떡볶이는 먹고싶어","백세희");
library[4] = new Book("언어의 온도","이기주");
//참조 배열 복사
System.arraycopy(library, 0, copyLibrary, 0, 5);
for(Book book : copyLibrary) {
book.showBookInfo();
}
}
}
이후 library 배열의 첫번째 요소의 책이름과 저자를 변경한 후 copyLibrary 배열 요소를 출력하면 동일하게 변경 된 것을 확인할 수 있다.
library[0].setTitle("서점 일기");
library[0].setAuthor("숀 비텔");
for(Book book : copyLibrary) {
book.showBookInfo();
}
2.2) 깊은 복사
Heap 메모리의 주소 값이 아닌 객체까지 복사를 하기 위해서는 깊은 복사를 이용해야한다.
ObjectCopy 클래스에서 copyLibrary 객체를 생성한 후 for문을 이용하여 Getter&Setter를 통해 하나씩 값을 대입해 준다.
이후 library에 값이 변경되어도 copyLibrary에는 영향을 받지 않는것을 확인할 수 있다.
public class ObjectCopy {
public static void main(String[] args) {
//참조 배열 선언
Book[] library = new Book[5];
//복사할 참조 배열 선언
Book[] copyLibrary = new 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 < 5; i++) {
copyLibrary[i] = new Book();
}
//참조 배열 복사
for(int i = 0; i < library.length; i++) {
copyLibrary[i].setTitle(library[i].getTitle());
copyLibrary[i].setAuthor(library[i].getAuthor());
}
library[0].setTitle("서점 일기");
library[0].setAuthor("숀 비텔");
for(Book book : copyLibrary) {
book.showBookInfo();
}
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] 싱글턴 패턴(Singleton pattern) 개념 및 구현 (3) | 2021.02.16 |
---|---|
[JAVA] static 변수, 메서드 개념 및 구현 (0) | 2021.02.16 |
[JAVA]this 키워드 개념 및 구현 (0) | 2021.02.15 |
[JAVA]접근 제어자(Access modifier) 개념 및 구현 (0) | 2021.02.14 |
[JAVA] 참조 자료형(Reference data type) 개념 및 구현 (0) | 2021.02.14 |
공부&일상 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 질문은 언제나 환영입니다😊