참조 타입
같은 타입의 변수가 여러 개 필요할 때 사용한다.
배열은 기본형 배열과 참조형 배열로 나뉜다.
기본형 배열: boolean, byte, char, int, long, float, double 타입의 변수를 여러 개 선언할 필요가 있을 때 사용한다.
기본형[] 변수명;
기본형타입 변수명[];
int[] array1;
int array2[2];
int array3[];
array1, array2, array3는 현재 배열 객체를 참조해야 한다. 하지만 아무 값도 초기화하지 않았으므로 null을 참조하므로 array1을 작업하면 nullPointException 발생
array1 = new int[5];
정수형 변수 5개를 배열로 만들건데, array1이 이것을 참조한다.
array3 = new int[0];
정수를 아무것도 가질 수 없는 배열을 생성하는 것이다.
int[] array1, array2;
int array3[], array4;
기본형타입[] 변수명 = new 기본형타입[배열의크기];
변수명[index값] = 값;
// 선언과 동시에 초기값 설정
기본형타입[] 변수명 = new 기본형타입[]{ 값1, 값2, ... };
기본형타입[] 변수명 = {값1, 값2, 값3, ...};
배열의 타입이 기본형이 아닌 경우
배열 변수가 참조하는 배열의 공간이 값을 참조한다는 의미이다.
public class ItemForArray {
private int price;
private String name;
public ItemForArray(int price, String name) {
this.price = price;
this.name = name;
}
public int getPrice() {
return price;
}
public String getName() {
return name;
}
ItemForArray클래스는 private한 price와 name을 선언
클래스 이름과 이름이 같은 생성자 생성ItemForArray
price와name을 초기화하기 위해 파라미터로 받아와서 this.price this.name과 같이 초기화
-> 인스턴스를 생성할 때 두 변수명으로 초기화하겠다!
=> 생성할 때 값을 넣어주고 값을 바꿀 수 없는 클래스를 불변 클래스 라고 한다.
ItemForArray[] array1;
ItemForArray array2[];
array1 = new ItemForArray[5];
array2 = new ItemForArray[5];
array1-> ItemForArray[]->ItemForArray[0]-> ItemForArray 인스턴스를 참조한다.
하지만 지금 아무것도 참조하지 않으므려 null 상태
new라고 해서 ItemForArray가 인스턴스로 만들어진게 아니다.
->ItemForArray[5]배열만 만들어지는 것이다.
array1[0] = new ItemForArray(500, "양파");
-> array1[0]이 ItemForArray의 인스턴스를 참조할 수 있게 해야 한다.
System.out.println(array1[0].getName());
array1[0]가 참조하는 객체 ItemForArray의 get메소드를 호출해라double[] array = {1.5, 2.4, 3.5};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
array[3]는 범위에 벗어나므로 에러 발생타입[] [] 변수명 = new 타입[행의 수][열의 수];
변수명[행 인덱스][열 인덱스] = 값;
int[][] array = new int[2][3];
array[0][0] = 0;
array[0][1] = 1;
array[0][2] = 2;
array[1][0] = 3;
array[1][1] = 4;
array[1][1] = 5;
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[i].length; j++){
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
array는 배열[2]을 참조하고 배열[2]는 배열[3]을 참조하는 상황이다.(배열[0]-> 배열[3], 배열[1] -> 배열[3])int[][] array = {{0,1,2}, {3,4,5}};
타입[][] 변수명 = new 타입[행의 수][];
변수명[행의 인덱스] = new 타입[열의 수];
int[][] koreanScoreArray = new int[3][];
koreanScoreArray[0] = new int[20];
koreanScoreArray[1] = new int[19];
koreanScoreArray[2] = new int[21];
for(타입 변수명 : 배열명) {
....
}
int [] array = {1,2,3,4,5};
for(int i : array) {
System.out.println(i);
}
ItemForArray[] array = new ItemForArray[3];
array[0] = new ItemForArray(500, "사과");
array[1] = new ItemForArray(300, "바나나");
array[2] = new ItemForArray(900, "수박");
for(ItemForArray item : array) {
System.out.println(item.getName());
System.out.println(item.getPrice());
}
int[] copyFrom = {1,2,3};
int[] copyTo3 = copyFrom; // copyFrom이 참조하는 것을 copyTo3도 같은 것을 참조한다.
int[] copyTo = java.util.Arrays.copyOf(copyFrom, copyFrom.length); // copyFrom의 내용을 복사해서 참조한다.
for(int c : copyTo) {
System.out.println(c);
}
System.out.println("--------------------");
int[] copyTo2 = java.util.Arrays.copyOf(copyFrom, 5);
for(int c : copyTo2) {
System.out.println(c);
}
⭐️ 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy)
import java.util.Arrays;
....
int[] copyTo = Arrays.copyOf(copyFrom, copyFrom.length);
...
// java.lang 패키지의 클래스는 import를 하지 않아도 사용 가능하다.
import java.util.Arrays;
...
int[] array1 = {1,2,3,4,5};