목차
배열
의미
배열을 이용하면 아무리 많은 수의 변수라 할지라도 하나의 문장으로 선언하는 것이 가능
배열을 이용하면 반복문을 이용한, 배열을 구성하는 변수에 순차적으로 접근할 수 있다.
선언법
[배열을 쓰지 않는 일반 선언법] 일반적인 변수(예 : 정수형 int)의 경우 아래와 같이 선언
[배열을 사용한 선언 법]
- 변수이름을 숫자로 부여->카테고리 마다 대표이름 부여
- 사용자가 얼마나 긴 변수 덩어리를 선언할지 모름
- 그러므로 컴파일러가 사용자에게 직접 얼마나 내부 메모리를 확보해야 하는지 알려주어야 함.
(주의)
-배열의 접근에는 0부터 시작하는 인덱스값이 사용된다. -가장 첫번째 배열 요소의 인덱스는 0이고 N번째의 인덱스는 N-1이다
int [] book = new int [100];
book[0] = 1;
book[1] = 2;
book[99] = 100;
배열의 선언과 초기화를 동시에
배열의 위치
Dangling Pointer
한번 메모리에 확보한 변수를 재활용할 경우
안쓰게 디는 변수를 자동으로 지워준다
1)선언한 배열의 이름을 재활용하는 경우
int [] var = new int[100];
for(int i = 0;i<100;i++)
var[i] = i;
var = new int[50];
for(int i = 0;i<50;i++)
var[i] = i*2;
2)선언한 배열에 다른 배열을 담는 경우
int [] var1 = new int[100];
int [] var2 = new int[90];
var1 = var2;
[지워지는 과정]
- 지역에 지역을 덮어 쓰면
- 덮어쓰기 전 사용자 지정구역(처음 선언한 integer짜리 100개의 배열)은 좀비가 되어 바이트만 잡아먹음
- 프로그램이 점점 느려짐(C나C++-> GC가 자제적으로 메모리 관리)
- but, 자바는 Garbage Collection있음!
배열의 특징
new로 선언된 배열은
- 기준점으로부터 얼마나 떨어져 있는 지를 알려줌
- 우리의 공간이라 OS가 함부로 건들이지 않음
- New로 저장된 것은 사용자 정의 공간에 들어감
- New [3]->(사용자) 4x3 byte +(지역) 64 bit
2차원 배열
2차원 배열: 2차원의 구조를 갖는 배열
배열의 가로 세로 길이를 명시하여 선언함
배열 접근할 때에도 가로 세로 위치 정보를 명시해서 접근
int [][] arr1 = new int[행][]
선언
int [][] A = { {1,2,3},
{4,5,6},
{7,8,9}
};
접근
같이 풀어볼 문제
[문제 1]
구구단의 값을 저장하는 배열을 만들어라
(답)
Scanner scan = new Scanner(System.in) ;
System.out.print("몇단? ");
int table = scan.nextInt();
int [] gugudan = new int[9];
for(int i = 0;i<9;i++)
gugudan[i] = table * (i+1);
scan.close();
[문제 2]
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다.
이 값을 M이라고 한다. 그리고 나서 모든 점수를 \(점수/(M\*100)\) 으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
(답)
import java.util.Scanner;
public class mmmmmm {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
double num[] = new double[a];
for (int i = 0; i < num.length ; i++) {
int hi = scan.nextInt();
num[i] = hi;
}
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length-1; j++) {
if (num[j] > num[j+1]) {
double temp = num[j];
num [j] = num[j+1];
num[j+1] = temp ;}
}
}
double M =num[a-1];
for (int k=0; k< num.length ; k++) {
double hey=num[k] ;
double hey2= hey/M*100;
num[k]= hey2;
}
double total=0;
for(int l = 0 ; l<num.length; l++) {
total+= num[l];
}
double fianl = total/num.length;
System.out.println(fianl);
}
}
[문제 3]
주어진 두 행렬의 합을 구하시오
주어진 행렬
int [][] A = { {1,2,3},
{4,5,6},
{7,8,9}
};
int [][] B = { {-1,-2,-3},
{0,0,0},
{-7,-8,-9}
};
(답)
int[][] C = new int[3][3];
for(int i = 0;i<A.length;i++)
for(int j = 0;j<A[i].length;j++)
C[i][j] = A[i][j] +B[i][j];
for(int i = 0;i<A.length;i++)
{
for(int j = 0;j<A[i].length;j++)
System.out.print(C[i][j]);
System.out.println("");
}