[java] 배열(배열정의, 배열선언, 배열생성,배열길이)
학생이30명의 성적을 저장하고, 평균값을 구한다고 가정을 했을때 먼저 학생 30명의 성적을 저장하기 위해 학생 변수를 30개 선언해야한다. 그러나 많은 학생의 변수를 만들기에는 하나씩 변수를 만드는 것은 비효율적이다. 그래서 배열을 사용해서 간단하게 변수를 만들수 있다.
1.배열
같은 타입의 데이터를 연속되 공간에 나열하고 각 데이터에 인덱스를 부여해놓은 자료구조이다.
scores[인덱스]
이런식으로 인덱스만 대괄호에 넣으면 지정된 값을 불러 올 수 있다.
1-1.배열의 특징
- 1. 배열은 같은 타입의 데이터만 저장할 수 있다.
- int 배열은 int 타입만 str 배열은 str타입만 저장가능하다.
- 한 번 생성된 배열은 길이를 늘리거나 줄일수 없다.
- 3개의 값을 저장하는 배열을 생성했다고 가정했을때 프로그램 실행 도중에 5개 값을 저장하는 배열로 수정 못한다. 반대로 2개의 값만 저장하는 배열로 수정 불가능하다.
2.배열 선언
배열을 사용하기 위해 우선 배열을 선언해야한다. 배열 변수 선언은 다음과 같이 작성할수 있다.
1. 타입 [ ] 변수;
ex)
int[ ] intarray;
double[] doublearray;
2.타입 변수[ ] ;
ex)
int intarray[ ];
double doublearray[ ];
배열 변수는 참조 변수에 속한다. 배열고 객체이므로 힙 영역에 생성되고 배열 변수는 립 영역의 배열 객체를 참조하게 된다. 만일 참조할 배열 객체가 없다면 배열 변수는 null값으로 초기화 될 수 있다.
타입 [] 변수 =null;
초기값이 null일때 변수[인덱스]로 값을 읽거나 저장하게 된다면 nullpointerException가 발생한다. 배열을 생성하고 배열 변수가 참조하는 상태에서 값을 저장하고나 읽어야한다.
3. 배열생성
배열 객체를 생성하려면 값 목록을 이용하거나 new연산자를 이용해야한다.
3-1. 값 목록으로 배열 생성하는 방법
값의 목록이 있다면 간단하게 배열 객체를 생성할 수 있다.
타입 [] 변수 = { 값1, 값2--- 값n };
ex) String [] name = { "한정훈", "유주희", "김대웅" . . . }
중괄호는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성하고, 배열 객체의 번지를 리턴한다. 배열 변수는 리턴된 번지를 저장함으로써 참조가 이루어진다. 예시로 참조변수의 값이 힙에 저장이되면
name[0] = 한정훈
name[1] = 유주희
name[2] = 김대웅
이런식으로 인덱스를 이용해서 값을 불러올수 있다.
만약에 name[3]의 값을 김서영으로 바꾸고 싶으면
name[2] = "김서영";
이렇게 바꾸면 인덱스 2에는 김서영이라는 값이 저장이 된다.
int[] scores = {83,12,46,24,99};
System.out.println(scores[1]+scores[2]);
System.out.println(scores[3]-scores[4]);
System.out.println("scores[0]:"+ scores[0] );
System.out.println("scores[1]:"+ scores[1] );
System.out.println("scores[2]:"+ scores[2] );
System.out.println("scores[3]:"+ scores[3] );
System.out.println("scores[4]:"+ scores[4] );
int sum = 0;
for(int i =0; i<3; i++) {
sum+= scores[i];
}
System.out.println("총합:"+ sum);
double avg = (double) sum / 3;
System.out.println("평균:"+ avg);
여기서 주의 할 점이 있다 .
값의 목록으로 배열 객체를 생성할때 배열 변수를 이미 선언한 후에 다른 실행몬에서 중괄호를 사용한 배열 생성이 허용되지 않는다.
타입 [ ] 변수;
변수 = { 값0, 값1, 값2 } // 컴파일 에러가난다
만약에 배열 벼수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이면 다음과 같이 new 연산자를 사용해서 값 목록을 지정 해주면된다.
또 다른 예를 들어보면 names = null;을 초기값으로 지정했을때 경우이다.
3-2. new 연산자로 배열 생성
값의 목록을 가지고 있지 않지만, 향후 값들을 저장할때 배열을 미리 만들고 싶다면 new연산자로 배열 객체를 생성할 수 있다.
타입[]변수 = new 타입[길이];
ex)
int [] intarray = new int[5];
new 연산자로 배열을 처름 생성할 경우 배열은 자동적으로 기본값으로 초기화 된다. 만약 학생 30명의 점수를 저장할 배열을 생성한다 하면
int [] students = new int[30]
위의 코드를 실행하면 students의 인덱스가 0부터 29까지 생성이 된다. 그리고 초기값은 0이다.
만약에 string 배열을 생성했다면 name 배열의 경우 초기값은 null이여서 모든 인덱스의 값은 null이다.
만약 배열을 초기값으로 설정을 해놓고 값을 입력을 할 경우에는
변수 [ 인덱스 ] = 값 //이 공식으로 넣으면된다
ex)
scores[0] = 1;
scores[1] = 2;
scores[2] = 3;
public static void main(String[] args) {
int[] arr1 = new int[3];
for(int i=0;i<3;i++) {
System.out.println("arr1["+i+"]:" + arr1[i]);
}
arr1[0]=10;
arr1[1]=20;
arr1[2]=30;
for(int i=0;i<3;i++) {
System.out.println("arr1["+i+"]:" + arr1[i]);
}
double[] arr2 = new double[3];
for(int i=0;i<3;i++) {
System.out.println("arr2["+i+"]:" + arr2[i]);
}
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
for(int i=0;i<3;i++) {
System.out.println("arr2["+i+"]:" + arr2[i]);
}
}
4. 배열 길이
배열에 저장할 수 있는 전체 항목의 개수를 말한다. 코드에서 배열의 길이를 얻으려면 베열의 객체의 length필드를 읽어야한다. 필드는 객체 내부의 데이터를 말한다. 배열의 length필드를 읽기 위해서는 배열 변수에 도트(.)연산자를 붙이고 length를 적어주면 된다.
배열 변수.length;
ex)
int [] intarray {10,20,30};
int num = intArray.length;
위에 있는 코드를 실행 시키면 10,20,30의 값이 있으니 num = 3 이 나온다 .
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] scores = {10,20,30,40};
int sum =0;
for(int i=0; i<scores.length;i++) {
sum += scores[i];
}
System.out.println("총합:"+sum);
double avg = (double)sum / scores.length;
System.out.println("평균:"+avg);