Java 배열(Array)
▶ 배열
동일한 자료형의 데이터를 연이어 저장할 수 있도록 하는 기억 공간의 집합체(모임)이다.
배열의 크기는 최초에 한번 설정되면 변경이 불가능하다.
▶ 배열의 원소
배열에는 여러 개의 데이터를 저장할 수 있는데 배열에 저장된 각각의 값을 배열의 원소(Element)라고 부른다.
▶ 배열 선언
변수와 유사하지만 배열의 원소 개수를 언급해야 한다.
▶ 배열 선언하는 형식
- new 연산자를 이용하는 방법
- 해당 배열의 내용을 직접 초기화하는 방법
▶ 배열 선언할 때 고려해야 할 점
- 각 원소에 저장할 값에 대한 자료형
- 배열명(참조변수의 선언)
- 배열의 원소의 개수
▶ 배열 선언 방법
- new 연산자를 이용한 방법
- a라는 이름을 가진 배열에 5개의 정수형을 저장하기 위해 배열 선언 방법
- int[] a= new int[5];
- int : 각 원소에 저장할 값에 대한 자료형
- a : 배열명(참조변수)
- 5 : 배열 원소의 개수(배열의 크기)
- 자바 컴파일러는 선언문을 보고 5개의 원소를 보관할 기억 공간(메모리)을 할당한다.
- int는 정수 형태의 값을 저장하기 위해 위에 배열은 20바이트(4바이트*5)이다.
- a[0]=10; a[1]=20; 이런 식으로 데이터 값을 넣을 수 있다.
- 배열은 index가 지정이 된다. intdex는 0번부터 시작해서 번호를 순서대로 증가시킨다.
- 첫 번째 원소는 a[0], 두 번째 원소는 a[1]이 된다.
- 마지막 원소는 원소의 개수보다 1이 작다.
- 배열의 원소 개수가 n으로 선언하면 배열명[0]부터 배열명[n-1]이 된다.
- 배열을 초기화하는 방법
- 1차원 배열이면 데이터 값을 콤마(,)로 구분해 나열하고 집합화하기 위해서는 중괄호로 묶어준다.
- int[] a={10, 20, 30, 40, 50}
- int : 자료형
- a: 배열명(참조변수)
- 배열의 크기(원소의 개수): 5
▶ 배열 선언 후 값 대입하기
1. 배열을 선언한 후 5개의 원소에 개별적으로 값을 대입 반복문을 사용해 원소에 저장된 값을 출력
public static void main(String[] args){
int[] arr= int[5]; //5개의 원소를 갖는 배열을 선언.
arr[0]=10; //index 0~4까지 원소에 5개의 배열에 각각 값을 대입
arr[1]=20;
arr[2]=30;
arr[3]=40;
arr[4]=50;
for(int i=0;i<5;i++){ //배열 값을 출력
System.out.println("arr["+i+"]="+arr[i]);
}
}
2. 위에 각각 값을 넣은 방법을 더 간단하게 값을 입력하는 방법
public static void main(String[] args){
int[] arr= int[5]; //5개의 원소를 갖는 배열을 선언.
for(i=0;i<5;i++){ //index 0~4까지 원소에 5개의 배열에 각각 값을 대입
a[i]=(i+1)+10;
}
for(int i=0;i<5;i++){ //배열 값을 출력
System.out.println("arr["+i+"]="+arr[i]);
}
}
3. 배열을 초기화로 점수 5개를 대입하여 총점, 평균을 구하는 방법
public static void main(String[] args){
int[] a={70, 50, 60, 90, 95}; //배열 초기화
int tot=0; //총점 변수 초기화
double avg=0; //평균 변수 초기화
for(int i=0;i<5;i++){ //총합은 반복문을 사용해 배열의 원소값을 변수 tot에 더해 누적.
tot+=a[i];
}
avg=(double)tot/5.0; //평균은 총합에서 원소의 개수로 나누어 구함.
//소수점 이하자리까지 구하기위해 캐스트연산자를 사용하고
//5도 5.0으로나누어야 한다.
System.out.pirntln("총점 :"+ tot+", 평균 :"+avg);
▶ 배열의 길이
원소의 개수가 배열의 길이가 된다.
배열이름.length : 배열의 길이를 알 수 있다.
int[]a = new int[5]; //길이가 5인 int배열
int tmp=a.length; //a.length 값은 5이다. 위에 길이가 5인 배열을 선언했기 때문에
public static void main(String[] args){
int[] arr= int[5]; //5개의 원소를 갖는 배열을 선언.
for(i=0;i<arr.length;i++){ //배열의 길이만큼 값을 대입
a[i]=(i+1)+10;
}
for(int i=0;i<arr.length;i++){ //배열의 길이만큼 값을 출력
System.out.println("arr["+i+"]="+arr[i]);
}
}
▶ 2차원 배열
2차원 배열은 행(row)과 열(column)로 이루어진 표(행렬)를 연상하면 이해하기 쉽다.
국어 | 영어 | 수학 | |
1번 학생 | 80 | 90 | 100 |
2번 학생 | 100 | 90 | 80 |
3번 학생 | 70 | 60 | 50 |
4번 학생 | 90 | 70 | 70 |
5번 학생 | 60 | 85 | 90 |
행단 위로는 핵생의 정보가 저장되고 열 단위로는 각 과목별 점수가 저장되어있다.
▶ 2차원 배열 선언(열과 행의 개수 추가)
int[][] a=int[5][3];
3개의 원소를 갖고 있는 1차원 배열 형태가 5묶음 있는 형태로 전체 15개의 정수 값을 저장할 수 있다.
a[0][0] | a[0][1] | a[0][2] |
a[1][0] | a[1][1] | a[1][2] |
a[2][0] | a[2][1] | a[2][2] |
a[3][0] | a[3][1] | a[3][2] |
a[4][0] | a[4][1] | a[4][2] |
행의 시작 위치는 (맨 위쪽)의 index 0으로 보고 아래로 갈수록 1씩 증가한다.
열의 시작 위치(맨 왼쪽)에 있는 index를 0으로 보고 오른쪽으로 갈수록 1씩 증가한다.
▶ 2차원 배열을 선언함과 동시에 특정한 값을 주는 초기화 방법
int[][] a={{80, 90, 100}, //0번째 행에 대한 초기화
{100, 90, 80}, //1번째 행에 대한 초기화
{70, 60, 50), //2번째 행에 대한 초기화
{90, 70, 70), //3번째 행에 대한 초기화
{60, 85, 90} //4번째 행에 대한 초기화
};
2차원 배열의 초깃값을 중괄호를 중첩해 사용한다.
바깥쪽 중괄호는 초기화를 위한 값을 하나의 집합으로 묶기 위한 것이다.
안쪽의 중괄호는 행단위로 중괄호를 묶고 콤마(,)로 분리한다.
▶ 2차원 배열 출력하기(for문을 이용)
System.out.print(a[0][0]+", ");
System.out.print(a[0][1]+", ");
System.out.println(a[0][2]);
System.out.print(a[1][0]+", ");
System.out.print(a[1][1]+", ");
System.out.println(a[1][2]);
.
.
.
System.out.print(a[4][0]+", ");
System.out.print(a[4][1]+", ");
System.out.println(a[4][2]);
15개의 출력문을 다 쓰는 것은 비효율 적이다.
중첩 for문을 이용하여 행이 0일 때 열이 0~2까지 출력하고
행이 1일 때 열이 0~2까지 출력하도록 for문을 이용하여 쉽게 출력할 수 있다.
public static void main(String[] args){
int[][] a={{80, 90, 100}, //0번째 행에 대한 초기화
{100, 90, 80}, //1번째 행에 대한 초기화
{70, 60, 50), //2번째 행에 대한 초기화
{90, 70, 70), //3번째 행에 대한 초기화
{60, 85, 90} //4번째 행에 대한 초기화
};
for(int r=0;r<5;r++){
for(int c=0;c<3;c++){
System.out.print(a[r][c]+"\t");
}
System.out.println();
}
위에 방법에서 a.length로 써보기
public static void main(String[] args){
int[][] a={{80, 90, 100}, //0번째 행에 대한 초기화
{100, 90, 80}, //1번째 행에 대한 초기화
{70, 60, 50), //2번째 행에 대한 초기화
{90, 70, 70), //3번째 행에 대한 초기화
{60, 85, 90} //4번째 행에 대한 초기화
};
for(int r=0;r<a.length;r++){
for(int c=0;c<a[i].length;c++){
System.out.print(a[r][c]+"\t");
}
System.out.println();
}
▶ 배열의 출력
System.out.println(arr); //arr 주소값이 출력된다.
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]); //배열의 요소를 순서대로 출력
}
System.out.println(Arrays.toString(arr)); //배열의 모든 요소를 출력한다.
//[100, 90, 80, 70, 60] 이런식으로 출력된다.
▶ 배열 메모리 구조
stack에 데이터의 주소값이 저장되고 원소 값들은 heap에 저장된다.
주소값은 "레퍼런스"라고 한다.
동일한 주소값을 가지고 있다면 같은 데이터를 가리키고(가지고) 있다.
▶ 레퍼런스
가르키고 있다, 참조하고 있다고해서 레퍼런스라고 한다.
▶ 배열 문제 풀기
1. 배열 요소 순서 바꾸기
배열 arr이 있고 요소들은 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 있다. 이 요소들을 랜덤으로 100 번돌려서 순서를 섞어보자
public static void main(String[] args){
int[] arr={1,2,3,4,5,6,7,8,9,10};
int n=0;
int tmp=0;
for(int i=0;i<100;i++){
n=(int)(Math.random()*10);
tmp= arr[0];
arr[0]=arr[n];
arr[n]=tmp;
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
}