배열 값의 출력
int[] iArr = {100, 95, 80, 70, 60};
System.out.println(Arrays.toString(iArr));
System.out.println(iArr);
출력결과 :
[100, 95, 80, 70, 60]
[I@5594a1b5
// 자바의 정석 191p 예제
Array값을 출력하고 싶으면, Arrays.toString() 을 통해서 출력해야한다. 바로 출력하면 타입@주소 식의 값이 출력된다.
배열의 복사
// 배열의 길이를 2배만큼 늘림
int arr[] = new int[5];
int temp[] = new int[arr.length*2];
for(int i=0; i<arr.length;i++){
temp[i]=arr[i];
}
arr=temp; // 참조변수 arr이 새로운 참조변수(temp)의 주소를 가르키게 한다
arr[5]=0;
System.out.println(arr[5]);
출력결과:
0
//자바의 정석 192page 예제
cf) 배열은 참조변수를 통해서만 접근할 수 있기 때문에, 자신을 가르키는 참조변수가 없는 배열은 사용할 수 없다. 이렇게 쓸모없게 된 배열은 JVM의 Garbage Collector에 의해 자동적으로 메모리에서 제거된다 (자바의 정석 193page)
더 간편한 방법으로는 System.arraycopy method가 있다.
int x[] = {1,2,3,4,5};
int y[] = new int[5];
System.arraycopy(x,0,y,0,x.length);
// x 0부터 x.length만큼 y 0에 옮김
System.out.println(Arrays.toString(y));
출력결과:
[1,2,3,4,5]
이때 System.arraycopy는 얕은 복사라서 x의 값이 바뀌면 y의 값도 바뀌는데(새로운 인스턴스를 생성하는 것이 아니라 '주소값'을 복사 하기 때문)
import javax.imageio.IIOException;
import java.io.*;
import java.util.Arrays;
class Book{
String a,b;
Book(String a,String b){
this.a=a;
this.b=b;
}
public void setA(String a){
this.a=a;
}
public void showInfo(){
System.out.println(a+b);
}
}
public class Test {
public static void main(String args[]) {
int x[] = {1,2,3,4,5};
int y[] = new int[5];
System.arraycopy(x,0,y,0,x.length);
System.out.println(Arrays.toString(y));
x[0]= 39;
System.out.println(Arrays.toString(y));
Book book[] = new Book[3];
Book book2[] = new Book[3];
book[0]=new Book("안녕1","하세요1");
book[1]=new Book("안녕2","하세요2");
book[2]=new Book("안녕3","하세요3");
System.arraycopy(book,0,book2,0,book.length);
for(Book book3 : book2){
book3.showInfo();
}
book[0].setA("hi");
for(Book book3 : book2){
book3.showInfo();
}
}
}
출력결과:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
// x값이 바뀌었지만 y값은 그대로
안녕1하세요1
안녕2하세요2
안녕3하세요3
hi하세요1
안녕2하세요2
안녕3하세요3
// x값이 바뀌니까 y값도 바뀜
그런데 int에 대해서는 먹히지 않는다. 기본 참조형은 따로 정의를 해둔 것 같다.
참조 자료형에 대해서는 그렇다는 이야기.
cf) 참조 자료형에서 헷갈릴 수 있을 만한 이야기
Book book = new Book[5]; // 선언만 한 것
book[0] = new Book();
book[1] = new Book();
book[2] = new Book();
book[3] = new Book();
book[4] = new Book(); // 배열을 생성
깊은 복사를 할거면, 하나하나 일일이 넣어주어야 한다. ( 인스턴스를 새로 생성해야 하기 때문에 )
'정리하기 이전 자료 ( before 20-11 ) > Java' 카테고리의 다른 글
다형성 , 상속, 가상함수 , 동적바인딩 (0) | 2020.03.28 |
---|---|
ArrayList 기초 (0) | 2020.03.28 |
Singleton Pattern (0) | 2020.03.25 |
Call by value VS Call by reference (0) | 2020.03.25 |
StringBuilder (0) | 2020.03.23 |
댓글