java

[이것이자바다] 5.6 배열타입(3)

희구 2021. 8. 22. 21:21

값 목록을 이용한 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)