본문 바로가기
정리하기 이전 자료 ( before 20-11 )/Java

배열 ( Array )

by IMSfromSeoul 2020. 3. 27.

배열 값의 출력

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

댓글