값 목록을 이용한 2차원 배열
타입[][] 변수 = { {값1, 값2, ...}, {값1, 값2, ...}, ... } ;
0 1
int[][] scores = { {95,80}, {92,96} };
int scores = scores[0][0]; //95
int scores = scores[1][1]; //96
String[][] names = {
{"이호석", "김선호", "최우식"},
{"박보검", "채형원", "이주헌"}
};
String name = names[0][1]; //김선호
String name = names[1][2]; //이주헌
예제)
package review;
public class Array06_ArrayInArray {
public static void main(String[] args) {
int[][] mathScores = new int[2][3];
for(int i=0; i<mathScores.length; i++) { //mathScores.length = 2
for(int k=0; k<mathScores[i].length; k++) { //mathScores[i].length = 3
System.out.println("mathScores[" + i + "][" + k + "] = " + mathScores[i][k]);
}
}
System.out.println();
int[][] englishScores = new int[2][];
englishScores[0] = new int[2];
englishScores[1] = new int[3];
for(int i=0; i<englishScores.length; i++) { //englishScores.length = 2
for(int k=0; k<englishScores[i].length; k++) { //englishScores[0].length = 2 / englishScores[1].length = 3
System.out.println("englishScores[" + i + "][" + k + "] = " + englishScores[i][k]);
}
}
System.out.println();
int[][] javaScores = { {95,80}, {92,96,80} };
for(int i=0; i<javaScores.length; i++) { //javaScores.length = 2
for(int k=0; k<javaScores[i].length; k++) { //javaScores[0].length = 2 / javaScores[1].length = 3
System.out.println("javaScores[" + i + "][" + k + "] = " + javaScores[i][k]);
}
}
}
}
객체를 참조하는 배열
- 기본타입 (byte, char, short, int, long, float, double, boolean)
각 항목에 직접 값을 가지고 있다.
- 참조타입( 클래스, 인터페이스) 배열
각 항목에 객체의 번지를 가지고 있다.
String[] array = new String[3];
array[0] = "Java";
array[1] = "C++";
array[2] = "C#";
저장될 땐 값이 저장되는 것이 아니라 java라는 값을 갖고 있는
String객체의 생성번지를 저장한다.
String[] array = new String[3];
array[0] = "Java";
array[1] = "Java";
array[2] = new String ("Java");
문자열 리터럴이 동일할 경우에는 문자열을 가지고 있는 string객체는 하나만 만들어진다.
index[2]에는 new로 새로운 객체를 생성했기 때문에
객체 속 문자열은 "java"로 동일하더라도 같은 곳에 저장되는 것이 아니라 새로운 곳에 저장된다.
System.out.println(array[0] == array[1]); //true 같은 객체를 참조
System.out.println(array[0] == array[2]); //false 다른 객체를 참조
System.out.println(array[0].equals(array[1])); //true "문자열"이 동일!
예제)
package review;
public class Array07_referenceObject {
public static void main(String[] args) {
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");
System.out.println(strArray[0] == strArray[1]); //true
System.out.println(strArray[0] == strArray[2]); //false
System.out.println(strArray[0].equals(strArray[2])); //true 문자열 비교!
}
}
배열복사
- 배열은 한 번 생성하면 크기를 변경할 수 없다.
- 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목값들을 복사해야 한다.
- 배열 복사 방법
1. for 문을 이용하는 방법
int[] oldIntArray = {1,2,3};
int[] newIntArray = new int[5];
for(int i=0; i < oldIntArray.length; i++){
newIntArray[i] = oldIntArray[i]; //이전배열의 i번째 항목을 새로운배열의 i번째 항목에 대입해준다.
}
예시)
package review;
public class Array08_ArrayCopy {
public static void main(String[] args) {
int[] oldIntArray = {1,2,3};
int[] newIntArray = new int[5];
for(int i=0; i<oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
for(int i=0; i<newIntArray.length; i++) {
System.out.print(newIntArray[i] + ", ");
}
}
}
2. System.arrayCopy()메소드를 이용하는 방법
System.arrayCopy(Object src, int srcPos, Object dest, int destPos, int length);
System.arrayCopy() 메소드는 다섯개의 매개값을 갖는다.
1. src: 원본배열
2. srcPos: 원본배열에서 복사할 위치
3. dest: 새로운 배열
4. destPos: 새로운 배열에서 붙여넣기 할 위치
5. length: 복사할 개수
String[] oldStrArray = {"java", "array", "copy"}; //원본 배열
String[] newStrArray = new String[5]; //새로운 배열
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
예시)
package review;
//System.arrayCopy를 사용한 배열복사
public class Array09_ArrayCopyEx {
public static void main(String[] args) {
String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for(int i=0; i< newStrArray.length; i++) {
System.out.print(newStrArray[i] + " , ");
}
}
}
>복사한 세가지 문자열은 0,1,2 번째에 붙여넣기 되어있고 복사되지 않고 남은 3,4번째 인덱스는 null값으로 비어있다.
3. Array클래스 이용 방법
향상된 for문
- 배열 및 컬렉션의 항목 요소를 순차적으로 처리
- 인덱스를 이용하지 않고 바로 항목 요소를 반복
일반 for문을 사용할땐 코드가 너무 길고 하나하나 arr[i]..따위로 쓰는 것이 매우 귀찮다.
그래서 우리는 향상된 for문을 사용한다.
예제)
package review;
public class Array10_AdvancedFor {
public static void main(String[] args) {
int[] scores = {95, 71, 84, 93, 87};//이 배열의 전체항목을 순차적으로 이용한다.
int sum=0;
for(int score : scores) { //scores의 개수만큼 반복된다.
sum += score;
}
System.out.println("점수 총합= " + sum);
double avg = (double) sum / scores.length;
System.out.println("점수 평균= " + avg);
}
}
출처: 신용권님의 '이것이 자바다' 교재 및 유튜브강의( https://youtu.be/dDD8T7fbq9k)
'java' 카테고리의 다른 글
[java] 추상클래스와 인터페이스의 차이? (0) | 2021.08.26 |
---|---|
[JAVA] 버블정렬 버블소트 (Bubble Sort) (0) | 2021.08.24 |
[이것이자바다] 5.6 배열타입(2) (0) | 2021.08.22 |
[이것이자바다] 5.6 배열타입(1) (0) | 2021.08.22 |
1. java 시작하기 (0) | 2021.07.20 |