Language/JAVA

(JAVA)배열

doheun 2023. 1. 16. 13:03
반응형

배열

같은 타입의 값을 나열한 것 -> 인덱스의 개념이 필요

  • 참조타입(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