본문 바로가기

Backend/Java

[JAVA] 배열 (Array), 2차원 배열

 

 

 


 

배열 (Array) 과 2차원 배열 알아보기

국비지원수업 10일차

 


 

 

1. 배열이란?


배열(Array)

- 동일한 변수 이름에 변호(첨자, index)를 붙여서 다수개의 데이터를 한 번에, 효과적으로 저장하고 다루기 위한 자료구조

- 하나의 이름으로 다수개의 변수들을 손쉽게 생성, 제어 가능

 

변수와 배열

저장공간을 차지하고 이름을 불러서 사용한다는 의미에서는 변수와 비슷하지만, 변수와는 구조사용방법이 다름

- 변수 : 변수의 이름으로 구분 (kor1, kor2, kor3...)

- 배열 : 첨자(index)로 구분 (kor[1], kor[2], kor[3]...)

 

// 일반변수의 생성
int b;
// 배열의 생성
int[] a = null; // 아무것도 없는 상태

 

a(배열)은 b(일반 정수형 변수)와는 다른 ' 참조변수 ' (레퍼런스 변수)

 

참조변수

주기억장치(메모리)에는 크게 영역이 구분되어 부르는 곳이 존재한다.

- 일반변수 또는 참조변수가 만들어지는 공간STACK

- 참조변수가 저장한 위치에 실제 데이터가 저장되는 공간 HEAP

 

 

 

참조변수란? HEAP에 저장된 실제 데이터의 위치정보를 저장하는 변수

* 참조값 = 레퍼런스값 = 주소값 = 어드레스값 = 번지값

 

int[] a = null;
//a = 100; // 에러	a변수는 참조값(주소값)만 저장할 수 있는 참조변수, 정수 대입 X
// System.out.println(a[0]); // 에러	참조변수 a가 null이므로 에러

 

참조변수에는 참조값(주소값)만을 저장할 수 있기에 배열을 int형으로 선언해도 a = 100; 식으로 정수를 대입할 수 없음

* Type mismatch: cannot convert from int to int[]

 

추가로, int[] a 에 null 을 대입한 상태라면 a는 null (비어있음) 상태이기에 출력을 시도하면 오류를 발생시킴

* Null pointer access: The variable a can only be null at this location

 

 

null

값(value)로서 인정은 되지만, 아무것도 없다는 뜻의 값

초기화되지 않은 상태와 구분됨

 

int[] a1 = null;
int[] b1;
System.out.println(a1); // null
// System.out.println(b1); // 에러	값이 아무것도 대입되지 않아 사용불가

 

String s0;
String s1 = null;
String s2 = "";
//System.out.println("String형 참조변수 - " + s0); // 에러
System.out.println("String형 참조변수 - " + s1); // null값이 참조변수에 저장
System.out.println("String형 참조변수 - " + s2); // HEAP에 공간이 할당되고 그 주소가 저장

 

 

 

2. 배열 선언과 공간 할당


2-1. 배열 선언

배열 선언

int[] a;
char[] b;
String[] c;

 


2-2. 공간 할당(배열 생성)

new 연산자

동적인 메모리를 생성하는 연산자 (공간을 할당하는 키워드)

 

a 참조변수에 공간 할당 후 할당된 공간의 주소를 저장

a = new int[5];

 

 

5개의 공간을 생성했다면 첨자(인덱스)는 0~4로 결정

System.out.println(a1[5]); //에러  java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5

* java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5

: 첨자(인덱스)값이 배열의 범위인 0~4를 벗어났음을 나타내는 에러

 

 

참조변수 생성과 공간할당을 동시에 가능

int[] a = new int[3];

 

 


2-3. 값 저장

a[0] = 100;
a[1] = 200;
a[2] = 300;
System.out.println(a[0] + " " + a[1] + " " + a[2]);

int i = 0;
a[i] = 400;
i = 1;
a[i] = 500;

a[i+1] = 600; // i == 2

System.out.println(a[0] + " " + a[1] + " " + a[2]);

 

1. 참조(인덱스)값을 숫자로 직접 지정

ex) a[0] = 100;

2. 정수형 변수 선언 후 참조값에 변수 대입

ex) a[i] = 100;

3. 연산자를 이용해 참조값 지정

ex) a[i-1] = 100;

4. 공간 할당과 배열 값 지정을 동시에

ex) int[] a = new int[5]; 에서 new int[5] 대신 {1, 2, 3, 4, 5} 를 대입

// int[] a = new int[5];
int[] a = {1, 2, 3, 4, 5}

- 5개짜리 공간 할당과 함께 각 저장공간에 1, 2, 3, 4, 5의 값이 저장

 

 

new에 의해서 HEAP 메모리에 생성되는 모든 영역은 자동 초기화

- 정수형 자료라면 0

- 실수형 자료라면 0.0

- String 자료라면 null

double[] d = new double[3]; // 0.0  0.0  0.0
System.out.println(d[0] + " " + d[1] + " " + d[2]);

String[] s = new String[3]; // null  null  null
System.out.println(s[0] + " " + s[1] + " " + s[2]);

 

 

 

3. 배열 출력


 


2-1. for문을 활용한 배열 생성과 출력

// 배열 a, b, c 생성 (각 갯수 10개)
int[] a = new int[10];
int[] b = new int[10];
int[] c = new int[10];

// a배열 - 3의 배수 10개 저장
// b배열 - 5의 배수 10개 저장
// c배열 - a배열과 b배열의 각 같은 인덱스 값들의 합 저장
for(int i = 0; i <= 9; i++) {
    a[i] = 3 * (i+1);
    b[i] = 5 * (i+1);
    c[i] = a[i] + b[i];
}

// 출력
System.out.print("a배열 -> ");
for(int i = 0; i <= 9; i++) System.out.printf("%2d ", a[i]);

System.out.print("\nb배열 -> ");
for(int i = 0; i <= 9; i++) System.out.printf("%2d ", b[i]);

System.out.print("\nc배열 -> ");
for(int i = 0; i <= 9; i++) System.out.printf("%2d ", c[i]);

 


3-2. 배열 데이터를 한꺼번에 저장( : )

배열, 리스트에 한해서 ' :(콜론) ' 을 이용해 다음과 같이 for문을 선언할 수 있음

for(int k : a)
        System.out.printf("%d ", k);
    System.out.println();

* a배열에 저장된 값들이 순서대로 한번씩 k에 저장되면서 System.out.printf("%d ", k); 명령이 반복 실행

 

int k : a배열에 있는 데이터들이 한번씩 저장될 변수

a : 변수 k에 데이터들을 하나씩 제공해줄 배열

 

 


3-3. 배열 값 오름차순, 내림차순 정렬 (응용)

(연습이니 단순무식한) 방법

1. 이중반복문 사용

2. 기준점이 되는 인덱스를 제어변수 i로 사용

3. 비교대상이 되는 인덱스를 제어변수 j로 사용

4. 배열을 a라고 선언했을 때, a[i]와 a[j] 를 비교

5. a[j]가 더 작으면 자리를 맞바꿈

- i가 0일 때 j를 1부터 9까지 -> 전체중 가장 작은 숫자 a[0]에 저장
- i가 1일 때 j를 2부터 9까지 -> 남은 숫자 중 가장 작은 숫자를 a[1]에 저장
- i가 2일 때 j를 3부터 9까지 -> 남은 숫자 중 가장 작은 숫자를 a[2]에 저장
- i가 3일 때 j를 4부터 9까지 -> 남은 숫자 중 가장 작은 숫자를 a[3]에 저장

 

int[] a = {85, 69, 87, 41, 23, 65, 11, 99, 3, 36};

// 오름차순 정렬
int temp;
for(int i=0; i<a.length; i++) {
    for(int j=i+1; j<a.length; j++) {
        if(a[i] > a[j]) {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
}

// 결과 출력
System.out.print("오름차순 정렬 : ");
for(int i=0; i<a.length; i++) System.out.printf("%d ", a[i]);

System.out.println();

// 내림차순 정렬
for(int i=0; i<a.length; i++) {
    for(int j=i+1; j<a.length; j++) {
        if(a[i] < a[j]) {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
}

// 결과 출력
System.out.print("내림차순 정렬 : ");
for(int i=0; i<a.length; i++) System.out.printf("%d ", a[i]);

 

 

값 위치 변경 코드

- 임시로 값을 담아둘 temp 선언

int c = 30, d = 40;
// 잘못된 연산
// c = d; // c에 d값이 덮어짐
// d = c; // 이미 c값 소실

// 올바른 연산
int temp = c;
c = d;
d = temp;
System.out.printf("%d %d", c, d);

 

 

 

4. 2차원 배열


행과 열의 개념을 사용하는 인덱스가 2개인 배열

- 1차원 배열 : 일직선상의 선형 데이터 구조

- 2차원 배열 : 행과 열이 존재하는 table형(면) 데이터 구조

 

int[행][열] a = new int[][];

int[][] a; // 참조변수
a = new int[3][2];
// int[][] a = new int[3][2];

 

int[행][열] b = {{값1, 값2}, {값3, 값4}, {값5, 값6}}; // 3행 2열

int[][] b = {{1,2}, {2,3}, {3,4}}; // 3행 2열 배열 생성

System.out.println("b[0][0] : " + b[0][0]);
System.out.println("b[2][1] : " + b[2][1]);

 

'Backend > Java' 카테고리의 다른 글

[JAVA] 클래스 생성자(Constructor)  (0) 2024.10.14
[JAVA] 클래스(Class) 생성과 사용  (0) 2024.10.07
[JAVA] 메소드 (Method)  (0) 2024.09.27
[JAVA] 연산자 (Operator)  (0) 2024.09.24
[JAVA] System.out.printf()  (0) 2024.09.24