반응형
배열
같은 타입의 값을 나열한 것 -> 인덱스의 개념이 필요
- 참조타입(mutable) : 주소값으로 변경
- new사용하지 않아도 객체로 생성
- 기본타입 배열 선언방법 3가지
1. int[ ] a={1,2,3};
2. int[ ] b=new int[] {1,2,3};
3. int[ ] c=new int[3];
- 1,2번은 선언 후 초기화 3번은 int형의 3의 크기를 가진 배열이고 값을 초기화하지는 않음
- 초기화 하지 않을 시 0으로 초기화
(int : 0 , boolean : false, char : \u0000) - 참조타입의 경우 null로 초기화
예시 1번과 같은 기본타입 배열은 heap영역에 배열크기만큼 영역을 가지고 기본타입에 맞게 초기화
2차원 배열
- int [행] [열] 로 생각하면 이해하기 편함
1. int[ ][ ] a1=new int[2][3];
2. int[ ][ ] a2={{1,2,3},{4,5,6}};
3. int[ ][ ] a3=new int[][]{{1,2,3},{4,5,6}};
4. int[ ][ ] a4=new int[2][];
1. int[ ][ ] a1=new int[2][3];

//값 대입
a1[0][0]=1;
a1[1][2]=6;

- 2행 3열짜리의 2차원 배열을 생성하고 초기화는 하지 않음
- int형의 기본타입이기 때문에 0으로 초기화됨
2. int[ ][ ] a2={{1,2,3},{4,5,6}};
3. int[ ][ ] a3=new int[ ][ ]{{1,2,3},{4,5,6}};

- 2번과 같은 리터럴 방식은 선언과 초기화를 따로 할 수 없음
- 2번은 3열의 크기를 가진 하나의 배열이 2행으로 이루어져 있고 각각 1 2 3과 4 5 6으로 초기화
- 3번은 2번과 같은 결과를 가지고 선언방식만 다름
4. int[ ][ ] a4=new int[2][ ];

- 2행짜리 2차원배열인데 각각의 행은 크기과 값을 초기화 하지 않음a4[0]과 같이 2차원배열로 선언했는데 []가 1개만 있을 경우 각각의 행을 가리킴a4[0]은 2차원 배열 a4의 첫번째 행을 크기가 3인 1차원 배열로 초기화
a4[1]은 2차원 배열 a4의 두번째 행을 크기가 4인 1차원 배열로 초기화 int[ ][ ] a4=new int[2][ ]; a4[0]= new int[3]; a4[1]= new int[4];
배열 출력
1. 기본
String[ ] str={"칠판","책상","연필"};
for(int i=0;i<str.length;i++){
System.out.print(str[i]+" ");
}
// 칠판 책상 연필
2. 범위기반
String[ ] str={"칠판","책상","연필"};
for(String i : str){
System.out.print(i+" ");
}
// 칠판 책상 연필
3. Arrays.toString
String[ ] str={"칠판","책상","연필"};
System.out.print(Arrays.toString(str));
//[칠판, 책상, 연필]
Shallow Copy & Deep Copy
1. Shallow Copy
- 주소값 전달
- 복사본 변경 시 원본도 같이 변경
//shallow copy
//참조타입의 mutable한 특성-> 받는쪽의 값이 바뀌면 주는 쪽의 값도 바뀐다.
int [] c= {1,2,3,4,5};
int [] d=c; // c ->d로 주소값이 전달
d[2]=20;//d에서 3을 20으로 바꾸면 c도바뀐다.
System.out.println("배열D: "+Arrays.toString(d));
System.out.println("배열C: "+Arrays.toString(c));
//배열D: [1, 2, 20, 4, 5]
//배열C: [1, 2, 20, 4, 5]
2. Deep Copy
- 객체를 복사하여 새로운 객체에 연결값을 넘겨주므로 독립적
- 복사본 변경 시 원본에는 영향 없음
//Deep copy
int [] e=new int [5];
System.arraycopy(c, 0,e, 0,e.length); // 배열 e에 c라는 배열을 복사
e[0]=30; //e의 첫번째 요소를 10으로 바꾸면 c배열의 값은 바뀌지 않는다
System.out.println(Arrays.toString(e));
System.out.println(Arrays.toString(c));
//배열E: [30, 2, 20, 4, 5]
//배열C: [1, 2, 20, 4, 5]
System.arraycopy
배열을 복사하는 메서드
@IntrinsicCandidate
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
2차원 배열 -> 1차원 배열
i(배열의 row번호) * col(배열의 col개수) + j(index번호)
//2차원 -> 1차원 변환
int [][] cc= {{1,2,3},{4,5,6}};
int [] dd=new int[cc.length*cc[0].length];
for(int i=0;i<cc.length;i++) {
for(int j=0;j<cc[0].length;j++) {
dd[i*cc[0].length+j]=cc[i][j];
}
}
System.out.println(Arrays.toString(dd));
//[1, 2, 3, 4, 5, 6]
1차원 배열 -> 2차원 배열
[i/col][i%col]
int[] ee= {1,2,3,4,5,6};
int[][] ff=new int[2][3];
for (int i = 0; i < ee.length; i++) {
ff[i/ff[0].length][i%ff[0].length]=ee[i];
}
//출력
for(int i=0;i<ff.length;i++) {
System.out.println(Arrays.toString(ff[i]));
}
//[1, 2, 3]
//[4, 5, 6]
반응형
'Language > JAVA' 카테고리의 다른 글
(JAVA)객체 지향 프로그래밍(OOP) (0) | 2023.01.18 |
---|---|
(JAVA)로또 (0) | 2023.01.17 |
(JAVA)String 메서드(문자열 자르기) (0) | 2023.01.13 |
(JAVA)String 비교 (0) | 2023.01.13 |
(JAVA)final 예약어 (0) | 2023.01.12 |