배열 (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 |