배열이란?
-같은 타입의 데이터를 연속된 공간에 저장하는 자료구조
-각 데이터에 인덱스(index)를 부여해놓은 자료 구조
예를들어 학생들의 성적은 다음과 같이 배열로 나타 낼 수 있다.
점수 | 78 | 49 | 90 | 78 | 99 | 84 |
인덱스 | 0 | 1 | 2 | 3 | 4 | 5 |
-각 데이터 저장 위치는 인덱스를 부여해서 접근 할 수 있다.
-배열변수는 참조변수에 속한다.
배열 읽기
배열이름[인덱스]
위의 score 배열을 예시로 들면
score[2] //90을 값으로 가진다.
배열선언
-배열을 사용하기 위해서는 우선 배열을 선언해야 한다.
-배열 변수 선언은 다음 두 가지 형태로 작성 할 수 있다.
타입[] 변수;
타입 변수[];
보통 위의 방법이 일반적이다.
<배열선언 예시>
int[] intArray;
int[] doubleArray;
String[] stringArray;
-배열도 객체이므로 힙 영역에 생성되고, 배열 변수는 힙 영역의 배열 객체를 참조하게 된다.
ㄴ위의 예시에서 intArray, doubleArray, stringArray는 heap 영역에 있는 번지를 저장한다.
-참조할 배열 객체가 없다면 배열 변수는 null값으로 초기화 될 수 있다.
-배열 변수는 배열을 생성하고 참조하는 상태에서 값을 저장하거나 읽어야 한다.
값 목록으로 배열 생성
데이터타입[] 변수 = {값1, 값2...};
-데이터타입과 값의 데이터타입은 일치해야 한다.
-{값1, 값2..}값들을 항목으로 가지는 배열 객체를 힙에 생성하고,
stack 영역에 저장된 참조변수는 배열 객체의 번지를 리턴한다.
String[] cafe = {"블랙업", "스타벅스", "이디야"};
여기서 "블랙업"은 cafe[0]으로 읽히고, "스타벅스"는 cafe[1]로 읽힌다.
-블랙업을 할리스로 바꾸고 싶다면 대입연산자(=)를 사용하면 된다.
cafe[0] = "할리스";
주의사항
배열 변수를 이미 선언 한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용하지 않는다.
타입[] 변수;
변수 = {값1, 값2,...}; //컴파일에러
(X)
배열 변수를 미리 선언 한 후에 값 목록이 나중에 결정되는 상황이라면 new연산자를 사용해야 한다.
밑의 설명 참조↓
배열 변수 선언(new 연산자)
-배열 변수를 미리선언 한 후, 값 목록들이 나중에 결정되는 상황
타입[] 변수;
변수 = new 타입[] {값1, 값2,...};
String[] names = null;
names = new String[] = {"백자바", "김자바"};
또 다른 방법(밑의 new 연산자로 배열생성2를 참고)
타입[] 변수 = new 타입[길이];
타입[] 변수 = null
변수 = new 타입[길이]
메소드의 매개값이 배열일 경우
-매개변수 자리에 (중괄호) 값 목록으로 배열을 생성함과 동시에 new 연산자를 사용해야 한다.
학생들의 점수를 다 더하는 메소드를 만들어보자.
int add(int[] scores) {
...//메소드식
}
정수를 리턴하는 add 라는 메소드에 점수 정보를 담고 있는 정수타입 배열 scores를 매개변수를 넣는다.
int result = add(new int[] {95, 85, 90});
괄호 자리에 new 연산자가 없다면 컴파일 에러가 난다.
배열생성 예시
public class ArrayCreateByValueListExample2 {
public static void main(String[] args) {
//new 생성자를 이용한 배열생성(배열 변수 먼저 만든 후 값을 나중에 저장할 때)
int[] scores;
scores = new int[] { 83, 90, 87 };
//for문을 이용해서 총합 구하기
int sum1 = 0;
for(int i=0; i<3; i++) {
sum1 += scores[i];
}
System.out.println("총합 : " + sum1);
//리턴된 총 합을 add2에 저장
int sum2 = add( new int[] { 83, 90, 87 } ); //new를 쓰지 않으면 컴파일 에러
System.out.println("총합 : " + sum2);
System.out.println();
}
//점수를 더하는 add메소드
public static int add(int[] scores) {
int sum = 0;
for(int i=0; i<3; i++) {
sum += scores[i];
}
return sum;
}
}
실행결과:
총합:260
총합:260
배열생성 (new 연산자2)
-값의 목록을 가지고 있지 않지만, 나중에 값들을 저장할 배열을 만들고 싶다면 new연산자를 사용해야 한다.
-길이를 미리 정해야 한다.
타입[] 변수 = new 타입[길이];
타입[] 변수 = null
변수 = new 타입[길이]
배열이 생성되고 나서 새로운 값을 저장하려면 대입연산자(=)를 사용하면 된다.
변수[인덱스] = 값;
길이가 5이고 정수를 받는 배열 intArray를 생성 해보자.
int[] intArray = new int[5];
자바는 intArray[0] ~ intAraay[4]까지 값이 저장 될 수 있는 공간을 확보하고, 배열의 생성 번지를 리턴한다.
리턴된 번지는 intArray 변수에 저장된다.
<Stack>
intArray
<Heap>
인덱스 | intArray[0] | intArray[1] | intArray[2] | intArray[3] | intArray[4] |
확보된 공간 | 4byte(=1int) | 4byte | 4byte | 4byte | 4byte |
-new 연산자로 배열을 처음 생성 할 경우 배열은 자동적으로 기본값으로 초기화 됨
위의 예시를 예로 들면,
인덱스 | intArray[0] | intArray[1] | intArray[2] | intArray[3] | intArray[4] |
확보된 공간 | 4byte(=1int) | 4byte | 4byte | 4byte | 4byte |
값 | 0 | 0 | 0 | 0 | 0 |
-만약 String 배열을 생성했다면 모두 null값으로 초기화 된다.
예시
public class ArrayCreatByNewExample {
public static void main(String[] args) {
int[] arr1 = new int[3]; //길이가 3인 배열 생성
for(int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
}
//new 연산자로 만든 배열에 값 넣기
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
for(int i=0; i<3; i++) {
System.out.println("arr1[" + i + "]: " + arr1[i] );
}
//new 연산자로 생성한 double타입의 길이가 3인 배열 생성
double[] arr2 = new double[3];
for(int i = 0; i<3; i++) {
System.out.println("arr2[" + i + "]: " + arr2[i]);
}
//new 연산자로 만든 배열에 값 넣기
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]);
}
//new 연산자로 생성한 String 타입의 길이가 3인 배열 생성
String[] arr3 = new String[3];
for(int i=0; i<3; i++) {
System.out.println("arr3[" + i + "]: " + arr3[i]);
}
//new 연산자로 만든 배열에 값 넣기
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for(int i=0; i<3; i++) {
System.out.println("arr3[" + i + "]: " + arr3[i]);
}
}
}
실행결과
arr1[0] : 0
arr1[1] : 0
arr1[2] : 0
arr1[0]: 10
arr1[1]: 20
arr1[2]: 30
arr2[0]: 0.0
arr2[1]: 0.0
arr2[2]: 0.0
arr2[0]: 0.1
arr2[1]: 0.2
arr2[2]: 0.3
arr3[0]: null
arr3[1]: null
arr3[2]: null
arr3[0]: 1월
arr3[1]: 2월
arr3[2]: 3월
배열길이
배열에 저장할 수 있는 전체 항목 수
배열변수.length
-final 필드다 = 읽기전용(값을 바꿀 수 없다)
-for문을 사용해서 배열 전체를 루핑 할 때 유용하게 사용
public class ArrayLengthExample {
public static void main(String[] args) {
int[] scores = { 83, 90, 87 };
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);
}
}
실행결과 :
총합: 260
평균: 86.66666666666667
'5. 참조타입' 카테고리의 다른 글
5.6.10_ 향상된 for문 (0) | 2020.05.01 |
---|---|
5.6.8_객체를 참조하는 배열 (1) | 2020.04.30 |
5.6.7_다차원 배열 (0) | 2020.04.30 |
5.6.6_커맨드 라인 입력 (0) | 2020.04.30 |
5.1_ 데이터 타입 분류 (0) | 2020.04.18 |