5. 참조타입
5.6 배열(Array) 타입
변수는 하나의 값만 저장할수 있다. 저장해야할 값의 수가 많아지면 그만큼 많은 변수가 필요해서 코드가 복잡해진다.
따라서 많은 양의 값을 다루는 좀더 효율적인 방법이 필요한데 이것이 배열이다.
배열은 연속된 공간에 값을 나열시키고 각 값에 인덱스를 부여해 놓은 자료구조이다.
배열의 특징 1.배열은 같은 타입의 값만 관리한다. 2. 배열의 길이는 늘리거나 줄일 수 없다.
5.6.1 배열변수 선언
타입[] 변수; | 타입 변수[]; 관례적으로 첫번째 방법 주로 사용
int[] intArray; | int intArray[];
String[] strArray; | String strArray[];
배열변수는 참조 변수이고 배열도 객체이므로 힙 영역에 생성되고 배열변수는 힙 영역의 배열주소를 저장한다. 참조할 배열이 업삳면 배열변수도 null로 초기화 할수 있다.
타입[] 변수 = null; 이 배열을 불러오면 NullPointerException이 발생한다.
5.6.2 값목록으로 배열생성
배열에 저장될 값의 목록이 있다면 다음과 같이 간단하게 배열을 생성할수 있다.
타입[] 변수 = {값0, 값1, 값2, 값3, ...}
String[] season = {"Spring", "Summer", "Fall", "Winter"}; //배열생성
//배열 항목값 읽기
System.out.println("season[0]: " + season[0]);
System.out.println("season[1]: " + season[1]);
System.out.println("season[2]: " + season[2]);
System.out.println("season[3]: " + season[3]);
//인덱스 1번항목값 변경
season[1] = "여름";
System.out.println("season[1]: " + season[1]);
System.out.println();
int[] scores = {83, 90, 87};
//총합과 평균구하기
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);
5.6.2.2 배열변수를 미리 선언한 후에는 값 목록을 변수에 대입할 수 없다.
타입[] 변수;
변수 = {값0, 값1, 값2, 값3, ...} // 컴파일에러
변수 = new 타입[] 변수 = {값0, 값1, 값2, 값3, ...} new타입을 이용해서 만들어주어야함.
메소드로 호출할시에 매개값으로 중괄호로감싼 값목록을주면 에러가 발생한다.
void printItem(int[] scores) {...}
printItem({95, 85, 90}); // 컴파일에러
printItem(new int[] {95, 85, 90}); // 올바른 메소드 호출
//배열변수선언
int[] scores;
scores = new int[] {83, 90, 87};
int sum1 = 0;
for (int i = 0; i <3; i++)
{
sum1 += scores[i];
}
System.out.println("총합: " + sum1);
//배열을 매개값으로 주고 printItem()메소드 호출
printItem(new int[] {83, 90, 87});
}
//printItem 메소드 서언
public static void printItem (int[] scores) {
//매개변수가 참조하는 배열의 항목을 출력
for(int i =0; i <3; i++)
{
System.out.println("score["+ i + "]:" + scores[i]);
}
5.6.3 new연산자로 배열생성
값 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성할 수 있다.
타입[] 변수 = new 타입[길이];
int[] scores = new int[30]; 으로 생성하면 모두 0으로 초기화
String[] scores = new Stirng[30]; 으로 생성하면 모두 null로 초기화
int[] arr1 = new int[3];
for (int i =0; i<3; i++)
{
System.out.print("arr1[" + i + "]: " + arr1[i] + ", ");
}
System.out.println();
//배열 항목의 값 변경
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
for (int i =0; i<3; i++)
{
System.out.print("arr1[" + i + "]: " + arr1[i] + ", ");
}
System.out.println("\n");
double[] arr2 = new double[3];
for (int i =0; i<3; i++)
{
System.out.print("arr2[" + i + "]: " + arr2[i] + ", ");
}
System.out.println();
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
for (int i =0; i<3; i++)
{
System.out.print("arr2[" + i + "]: " + arr2[i] + ", ");
}
System.out.println("\n");
String[] arr3 = new String[3];
for (int i =0; i<3; i++)
{
System.out.print("arr3[" + i + "]: " + arr3[i] + ", ");
}
System.out.println();
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for (int i =0; i<3; i++)
{
System.out.print("arr3[" + i + "]: " + arr3[i] + ", ");
}
5.6.4 배열길이
배열의 길이란 배열에 저장할수 있는 항목 수를 말한다. 코드에서 배열의 길이를 어등려면 도트(.)연산자를 사용해서 참조하는 배열의 length필드를 읽으면된다. 배열변수.length;
int[] scores = {84, 90, 96};
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);
5.7 다차원배열
배열항목에 또 다른 배열이 대입될 수 있는데 이러한 배열을 다차원배열이라고 부른다.
다차원배열은 1차원배열을 서로 연결한 것이라고 볼 수 있다.
각차원의 항목에 접근하는 방법은 다음과 같다/ 변수[1차원인덱스][2차원인덱스]...[n차원인덱스]
타입[][] 변수 = {
{값1, 갑2, ...}, 1차원 배열의 0인덱스
{값1, 갑2, ...}, 1차원배열의 1 인덱스
};
new로 다차원배열 생성
타입[][] 변수 = new 타입[1차원수][2차원수];
int[][] scores = new int[2][];
scores[0] = new int[3]; // 첫번째 반 학생수 3명
scores[1] = new int[2]; // 두번째반 학생수 2명
//2차원 배열 생성
int [][] scores = {
{80, 90, 96},
{76, 88}
};//배열의 길이
System.out.println("1차원 배열 길이(반의 수): " + scores.length);
System.out.println("2차원 배열 길이(첫 번째 반의 학생 수): " + scores[0].length);
System.out.println("2차원 배열 길이(두 번째 반의 학생 수): " + scores[1].length);
//첫번째 반의 세번째 학생의 점수 읽기
System.out.println("scores[0][2]: " + scores[0][2]);
//두번째반 두번째학생
System.out.println("scores[1][1]: " + scores[1][1]);
//첫번째 반의 평균점수 구하기
int classSum = 0;
for(int i = 0; i < scores[0].length; i++)
{
classSum += scores[0][i];
}
double classAvg = (double) classSum / scores[0].length;
System.out.println("첫 번째 반의 평균 점수: " + classAvg);
//전체 학생의 평균점수 구하기
int totalStudent = 0;
int totalSum = 0;
for(int i = 0; i < scores.length; i++)
{
totalStudent += scores[i].length;
for(int j = 0; j < scores[i].length; j++)
{
totalSum += scores[i][j];
}
}
double totalAvg = (double) totalSum / totalStudent;
System.out.println("총 학생의 평균 점수: " + totalAvg);
5.8 객체를 참조하는 배열
기본타입 배열은 각 항목에 값을 직접 저장하지만 참조타입(클래스, 인터페이스)배열은 각 항목에 객체의 번지를 저장한다.
=== != 연산자를 사용하면 배열항목이 참조하는 객체가 같은 객체인지 다른객체인지를 확인할 수 있고 문자열만 비교할때는 equals()메소드를 사용한다.
String[] languages = new String[3];
languages[0] = "Java";
languages[1] = "Java";
languages[2] = new String("Java");
System.out.println(languages[0] == languages[1]); // true 같은 객체를 참조
System.out.println(languages[0] == languages[2]); // false 다른객체를 참조
System.out.println(languages[0].equals(languages[1])); // true 문자열이 동일'기초단계 > JAVA' 카테고리의 다른 글
| 2022.11.17-1 JAVA 클래스 1 (0) | 2022.11.17 |
|---|---|
| 2022.11.16-3 JAVA 참조타입 3 (0) | 2022.11.16 |
| 2022.11.16-1 JAVA 참조타입 (0) | 2022.11.16 |
| 2022.11.15-3 JAVA 반복문 (0) | 2022.11.15 |
| 2022.11.15-2 JAVA 조건문 (0) | 2022.11.15 |