본문 바로가기
Java 강의

자바 배열 / 객체 배열 선언 / java array / java object array

by 자유코딩 2017. 9. 21.

이번 글에서는 배열에 대해서 알아보도록 하겠습니다.

 

●배열이 등장한 배경

 

여기 다음과 같은 코드가 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Array;
public class Array {
    public static void main(String[] args) {
        
        int a=0;
        int b=1;
        int c=2;
        int d=3;
        int e=4;
            
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        System.out.println(e);
    }
}
cs

 

코드에서 되풀이 되는 부분이 많습니다.

 

int가 반복해서 쓰이고 있습니다.

 

이렇게 반복적인 변수 선언을 100번 , 1000번 계속 하다보면 코드의 길이가 굉장히 길어질 것입니다.

 

이 코드를 조금 더 간편하게 작성할 방법이 있습니다.

 

배열을 사용하면 됩니다.

 

자바에는 배열이란 것이 있습니다.

 

배열의 사전적 정의는 "같은 자료형들끼리 순차적으로 모여있는 하나의 묶음"입니다.

배열은 연속된 변수라고 정의할 수 있습니다.

 

int[] array = new int[5];

 

 

 

소스코드 안에서 배열은 다음과 같이 선언 될 수 있습니다. 

array[0]

array[1]

array[2]

array[3]

array[4]

 

배열을 선언하면 위와 같이 연속된 저장공간에 변수가 할당 됩니다.

그래서 위의 코드는 이렇게 바뀔 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Array;
public class Array {
    public static void main(String[] args) {
        
        int[] array = new int[5];
        array[0= 0;
        array[1= 1;
        array[2= 2;
        array[3= 3;
        array[4= 4;
 
        System.out.println(array[0]);
        System.out.println(array[1]);
        System.out.println(array[2]);
        System.out.println(array[3]);
        System.out.println(array[4]);
    }
}
cs

그렇지만 여전히 코드가 깁니다.

여기서 배열을 사용할 때의 장점을 알려드리겠습니다.

 

배열의 인덱스 즉, array[1] , array[2]에서 array뒤의 1,2를 개발자는 조작 할 수 있습니다.

 

바로 이렇게요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Array;
public class Array {
    public static void main(String[] args) {
        
        int[] array = new int[5];
 
        //array[0],array[1],array[2],array[3],array[4] 선언
 
        for (int i = 0; i < array.length; i++) {
                        //array.length는 배열의 크기만큼을 의미한다
 
            array[i]=i;//i의 값을 array[0]~array[4]에 대입한다
    
        System.out.println(array[i]);
        }    
    }
}
cs

이렇게 하면 반복문으로 array[0]~array[4]에 한번에 값을 대입 할 수 있습니다.

 

출력

 

배열의 크기, 즉, 변수의 개수가 1000개라면 정말 편리할 것입니다.

 

배열의 길이에 대해서 조금 더 알아보겠습니다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ArrayLength {
    public static void main(String[] args) {
    
        int[][] arrLength = new int[3][5];//행과 열의 길이가 다른 배열을 선언합니다
        //3행 5열 배열을 선언합니다
        for (int i = 0; i < arrLength.length; i++) {
            System.out.print(i+" ");//arrLength.Length는 전체 2차원 배열에서 행의 길이를 의미한다
            //그래서 0,1,2가 출력된다
        }
        System.out.println();
        for (int i = 0; i < arrLength[0].length; i++) {
            System.out.print(i+" ");//arrLength[0].Length는 전체 2차원 배열 중에서 0번째 행의 전체 열의 길이를 의미한다
            //그래서 0,1,2,3,4를 출력한다
        }
    }
}
cs

 

arrLength.Length를 사용하면 2차원 배열의 전체 행의 길이를 알 수 있습니다

 

arrLength[0].Length를 사용하면 2차원 배열의 0번째 행의 열의 길이를 알 수 있습니다

 

그림과 같습니다

 

자바에서는 객체 배열도 있습니다.

 

객체 배열의 선언도 일반 배열과 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Array;
 
import java.util.Scanner;
 
public class Array {
    public static void main(String[] args) {
        
        Array[] arrayArray = new Array[5];//Array클래스의 객체 배열 선언
        
        for (int i = 0; i < arrayArray.length; i++) {
            arrayArray[i] = new Array();//배열을 반복문으로 초기화
            System.out.println(arrayArray[i]);//배열에 저장된 값을 
        }
    }        
}
cs

 

출력

 

정수 타입을 뜻하는 int 가 들어가는 부분에 클래스 이름 Array를 적었기 때문에 arrayArray[0]~arrayArray[4]는 Array클래스를 참조하는 주소가 저장됩니다.

 

출력해보면 위와 같이 주소가 출력됩니다.

 

●배열의 복사(주소) = 얕은 복사

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class e_ArrayCopy {
    public static void main(String[] args) {
 
        int[] arr = new int[3];//배열객체 arr을 힙영역에 생성하고 변수 arr에 arr객체의 주소를 저장한다
        int[] arr2;
        System.out.println(arr2);//이 부분은 arr과 다르게 new를 사용해서 
        //힙 영역에 배열 객체의 영역을 생성하고 대입하지 않았으므로 출력할때 에러가 난다
        
        int[] aaa = {1,2,3};
        int[] bbb = {3,2,1};
        
        bbb = aaa;//이렇게 값을 대입하면 배열객체 aaa의 주소를 bbb에 대입한다.
        //이렇게 주소를 대입하면 bbb의 주소를 이용해서 힙영역의 배열객체 aaa를 사용할 수 있다
        
        System.out.println(bbb[0]);//aaa[0]과 값이 같다
        System.out.println(bbb[1]);//aaa[1]과 값이 같다
        System.out.println(bbb[2]);//aaa[2]와 값이 같다
    }
}
cs

 

얕은 복사에서는 주소가 복사되어 대입된다

 

그래서 아래 표와 같이 값이 같아집니다

 

bbb[0] 

aaa[0]

값이 같아진다 

bbb[1]

aaa[1]

값이 같아진다

bbb[2]

aaa[2]

값이 같아진다 

 

코드의 출력

 

코드를 조금 간소화 해서 보겠습니다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ArrayCopy {
 
        public static void main(String[] args) {
 
            int[] aaa = {1,2,3};
            int[] bbb = {3,2,1};
            
            bbb = aaa;//이렇게 값을 대입하면 배열객체 aaa의 주소를 bbb에 대입한다.
            //이렇게 주소를 대입하면 bbb의 주소를 이용해서 힙영역의 배열객체 aaa를 사용할 수 있다
            
            System.out.println(bbb[0]);//aaa[0]과 값이 같다
            System.out.println(bbb[1]);//aaa[1]과 값이 같다
            System.out.println(bbb[2]);//aaa[2]와 값이 같다
            
            System.out.println(aaa.equals(bbb));
 
        }
 
}
cs

 

코드의 출력

 

얕은 복사를 그림으로 확인해보겠습니다

배열 aaa를 배열 bbb에 대입하기 전의 모습입니다


배열 aaa를 배열 bbb에 대입한 후의 모습입니다

 

대입연산 이후로 Stack 영역에서 배열객체 aaa와 bbb가 같은 곳의 주소를 같게 됩니다

그래서 bbb[0] , bbb[1] , bbb[2] 모두 aaa[0] , aaa[1] , aaa[2] 와 같은 값을 같게 됩니다

 

●배열의 복사(값) = 깊은 복사

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ArrayCopy {
    
    public static void main(String[] args) {
        
        int[] aaa = {1,2,3};
        int[] bbb = {3,2,1};
        for(int i=0;i<aaa.length;i++){
            bbb[i] = aaa[i];//인덱스를 0부터 2까지 증가시키며 값만을 대입한다
        }
        
        System.out.println(bbb[0]);//aaa[0]과 값이 같다
        System.out.println(bbb[1]);//aaa[1]과 값이 같다
        System.out.println(bbb[2]);//aaa[2]와 값이 같다
        
        System.out.println(aaa.equals(bbb));//값은 같지만 객체의 주소가 다르기 때문에 false 값이 출력된다
        System.out.println(bbb.equals(aaa));//값은 같지만 객체의 주소가 다르기 때문에 false 값이 출력된다
    }
}
cs

 

코드의 출력

 

출력을 보시면 값은 같지만 두 객체가 같은지를 출력해보면 false 값이 출력됩니다

 

그림으로 확인해보겠습니다

깊은 복사를 하기 전의 모습입니다

 

깊은 복사를 하고 난 후의 모습입니다

 

 

설명이 부족하신 부분은 없으셨나요? jswoo030@gmail.com으로 질문해주시면 빠른 답변을 받으실 수 있습니다.

 

여러분의 자바 실력이 빠르게 향상되시길 바랍니다

댓글