IT 개발노트

배열이란? 본문

기초튼튼/JAVA

배열이란?

limsungju 2019. 1. 17. 21:32

1. 배열이란?
: 하나의 데이터만 가지고 있던 변수와 달리 여러개의 데이터를 가지고 있는 변수.
즉, 여러개의 변수를 모아놓은 또 하나의 변수라고 생각하면 쉽다.
* 변수는 한개의 데이터만 저장할 수 있다. 따라서 저장해야 할 데이터의 수가 많아지면 그만큼 많은 양의 변수를 선언해줘야 하는 비효율성이 발생한다. 그럴때 좀 더 효율적인 방법인 배열을 사용한다.



1.1 배열문법
: 변수 선언과 거의 비슷하며, 여러개의 데이터가 모여 있어 '{ }'를 이용한다.
 배열의 크기는 최초에 한번 설정되면 변경이 불가능하다.
 (배열에 저장할 공간이 부족한 경우에는 더 큰 길이의 새로운 배열을 생성한 후, 기존의 배열에 저장된 값들을 새로운 배열에 복사하면된다.)
* 배열은 인덱스(순서)를 가지게 된다. (0부터 시작)
- 변수 선언 : int i = 10;
- 배열 선언1 : int[ ] Arr = {10, 20, 30, 40, 50};
- 배열 선언2 : int[ ] Arr = new int[5];
int[0] = 10; int[1] = 20; int[2] = 30; int[3] = 40; int[4] = 50;

 10

20 

30 

40 

50 

인덱스 [0] 

인덱스 [1] 

인덱스 [2] 

인덱스 [3] 

인덱스 [4]


예시1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.javalec.ex;
 
import java.util.Scanner;
 
public class TestEx {
    public static void main(String[] args)
    {
        
        int[] Arr1 = {1020304050};
        
        System.out.println(Arr1[4]);
        
        int[] Arr2 = new int[5];
        Arr2[0= 10;
        Arr2[1= 20;
        Arr2[2= 30;
        Arr2[3= 40;
        Arr2[4= 50;
        
        System.out.println(Arr2[4]);
        
    }
}



1
2
3
4
5
6
7
8
9
10
11
package sungju.Java.Test3;
 
public class Test3 {
    public static void main(String[] args) {
        int[] arr = new int[5];
        for(int i=0; i<arr.length; i++) {
            arr[i] = 100*(i+1);
            System.out.println("arr[" + i + "] : " + arr[i]);
        }
    }
}


1.2 배열의 메모리 구조의 이해
: int i = 10; -> 메모리에 'i 변수'가 만들어 지고, 10이라는 데이터가 들어있다.
10byte 메모리가 있다고 가정했을 때, i에 4byte라는 메모리가 할당되고 그 영역에 10이라는 데이터가 저장된다.

10

 

 

 

 

 

 

int[ ] Arr = {10, 20, 30}; -> 메모리에 'Arr변수'가 만들어 지고, 'Arr변수'안에는 배열을 구성하고 있는 데이터의 주소값이 들어있다. 즉, 배열 변수에는 기초자료형 변수와 달리 데이터가 들어 있지 않고, 10, 20, 30을 저장하고 있는 메모리의 주소값을 저장하고 있다.

 주소값

 

 

 

 

 

 

 

 

 


 10

20 

30 

1.3 레퍼런스의 이해
: 배열은 배열을 구성하고 있는 데이터들의 주소값을 가지고 있다고 했다. 이때 주소값을 '레퍼런스'라고 한다.
만약 동일한 주소값을 가지고 있다면, 같은 데이터를 가리키고(가지고) 있다고 보면 된다.

1.3.1 Shallow Copy & Deep Copy
: JAVA에서 참조변수를 복사하는 방법에는 Shallow Copy와 Deep Copy가 있다.


- Shallow Copy : 원본 참조변수의 참조값만 복사하는것
-Deep Copy : 원본 참조변수의 참조값이 가리키는 객체를 메모리 공간에 복사생성 후 복사본 참조변수가 가리키는 것을 복사하는것
*Shallow Copy의 경우 복사 후 원본이나 복사본을 수정하면 둘다 동일한 객체를 참조하기에 같이 변경되지만, Deep Copy의 경우 원본과 복사본은 독립적인 객체이므로 영향을 받지 않는다.


예시2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.javalec.ex;
 
import java.util.Scanner;
 
public class TestEx {
    public static void main(String[] args)
    {
        
        int[] Arr1 = {1020304050};
        int[] Arr2 = Arr1;
        
        for (int i = 0; i < Arr1.length; i++)
        {
            System.out.println("Arr1[" + i + "] = " + Arr1[i]);
            System.out.println("Arr2[" + i + "] = " + Arr2[i]);
        }
        
        Arr2[0= 100;
        Arr2[1= 200;
        Arr2[2= 300;
        Arr2[3= 400;
        Arr2[4= 500;
        
        for (int i = 0; i < Arr1.length; i++)
        {
            System.out.println("Arr1[" + i + "] = " + Arr1[i]);
            System.out.println("Arr2[" + i + "] = " + Arr2[i]);
        }
        
    }
}



예시2 설명

배열은 데이터값이 아닌 데이터값의 주소(레퍼런스)를 저장하고 있다고 했다.
현재 Arr1배열과 Arr2배열이 같은 주소를 가리키고(가지고)있게 선언을 해주었을때, Arr1배열과 Arr2배열이 {10, 20, 30, 40, 50}의 데이터 값을 가지고 있는 같은 주소를 가리키고 있어서 둘다 {10, 20, 30, 40, 50}값이 출력이 되는 것을 확인할 수 있다.
Arr2배열이 가리키고 있는 주소의 데이터를 {100, 200, 300, 400, 500}으로 변경해주었더니 Arr1배열과 Arr2배열이 가리키고 있는 값을 출력했을때 둘다 {100, 200, 300, 400, 500}으로 출력되는 것을 확인할 수 있다.
이로써 배열은 데이터값이 아닌 데이터값이 저장된 주소(레퍼런스)값을 저장하고 있다는 것을 확인할 수 있다.

예제1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.javalec.ex;
 
import java.util.Scanner;
 
public class TestEx {
    public static void main(String[] args)
    {
        String[] ArrName = {"영희""철수""길동""영수""말자"};
        int[] Arr = new int[5];
        int totalHeight = 0;
        int maxH = 0;
        int maxHIndex = 0;
        int minH = 0;
        int minHIndex = 0;
        
        Scanner sc = new Scanner(System.in);
        for(int i = 0; i < Arr.length; i++)
        {
            System.out.print(ArrName[i] + "키를 입력 하세요. : ");
            Arr[i] = sc.nextInt();
            totalHeight = totalHeight + Arr[i];
        }
        System.out.println("학생들의 평균 신장은 " + (totalHeight/ArrName.length+ "입니다.");
        
        for(int i = 0; i < Arr.length; i++)
        {
            if(Arr[i] > maxH)
            {
                maxH = Arr[i];
                maxHIndex = i;
            }
        }
        System.out.println("가장 큰 학생은 " + ArrName[maxHIndex] + "입니다.");
        
        minH = maxH;
        for(int i = 0; i < Arr.length; i++)
        {
            if(Arr[i] < minH)
            {
                minH = Arr[i];
                minHIndex = i;
            }
        }
        System.out.println("가장 작은 학생은 " + ArrName[minHIndex] + "입니다.");
        
    }
}


예제 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package sungju.Java.ch5;
 
import java.util.Arrays;        // Arrays.toString()을 사용하기 위해 추가
 
public class ArrayEx {
    public static void main(String[] args) {
        int[] iArr1 = new int[10];
        int[] iArr2 = new int[10];
    //    int[] iArr3 = new int[] {100, 95, 80, 70, 60};
        int[] iArr3 = {10095807060};
        char[] chArr = {'a''b''c''d','e','f'};    //String chArr = "abcdef"; 와 같은 의미
        String chArr2 = "abcdef";    // String은 char[] + 알파느낌 String은 class이다.
        
        for (int i=0; i<iArr1.length; i++) {
            iArr1[i] = i + 1// 1~10의 숫자를 순서대로 배열에 넣는다.
        }
        
        for (int i=0; i < iArr2.length; i++) {
            iArr2[i] = (int) (Math.random()*10+ 1// 1~10의 값을 배열에 저장
        }
        
        // 배열에 저장된 값들을 출력한다.
        for(int i=0;  i < iArr1.length; i++) {
            System.out.print(iArr1 [i] + ",");
        }
        
        System.out.println();
        System.out.println(Arrays.toString(iArr1));
        System.out.println(Arrays.toString(iArr2));
        System.out.println(Arrays.toString(iArr3));
        System.out.println(iArr3);        // iArr3 배열의 주소값을 출력
        System.out.println(iArr3[0]);    // iArr3 배열 0번째 방의 데이터값을 출력
        System.out.println(chArr);        // chArr 배열은 char형이기 때문에 주소값이 아닌 chArr 배열의 모든 데이터값이 출력됨
    }
 
}
cs

1.4 다차원 배열
: 배열이 가리키는 데이터에 또 다른 배열이 들어 있는 구조


-다차원 배열 선언1 : int[ ][ ] Arr = new int[3][ ];
int[0] = new int[2];  int[1] = new int[3];  int[2] = new int[2];
-다차원 배열 선언2 : int[ ][ ] Arr = new int[3][2];
Arr[0][0] =10;  Arr[0][1] = 20;  Arr[1][0] = 100;  Arr[1][1] = 200;  Arr[2][0] = 1000;  Arr[2][1] = 2000;
*다차원 배열을 사용할 경우 가독성이 떨어지기 때문에 보통 데이터베이스를 사용한다.

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package sungju.Java.Test3;
 
public class Test3 {
    public static void main(String[] args) {
        int arr[][] = new int[][] {
            {10,20,30},
            {40,50,60},
            {70,80,90},
        };
        for(int i=0; i<arr.length; i++) {
            for (int j=0; j<arr.length; j++) {
                System.out.println("arr[" + i + "][" + j + "] : " + arr[i][j]);
            }
        }
    }
}



- 가장 밖에있는 { }를 기준으로 배열안에 ,를 기준으로 0, 1, 2...번째 인덱스를 구분한다.


'기초튼튼 > JAVA' 카테고리의 다른 글

변수의 종류와 특징  (0) 2019.01.18
객체지향의 등장 배경과 이해  (0) 2019.01.18
제어문과 루프란?  (0) 2019.01.16
연산자란?  (0) 2019.01.15
기본 자료형과 객체 자료형의 이해  (0) 2019.01.15