자바

[자바] 배열

j9972 2022. 6. 28. 12:02
728x90

배열

배열 - 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

 

배열의 선언 및 생성

타입[] 변수이름 = new 타입[길이];
int[] score = new int[5];
String[] name = new String[3];

 

배열의 생성 및 초기화

// 배열의 생성과 동시에 초기화 하는 방법
example
int[] score = new int[]{ 50, 60, 70, 80, 90 }
// 위와 같이, 배열의 생성하면서 동시에 초기화를 하면 { }안의 값의 개수에 의해 배열의 길이가 자동으로 결정된다.

// 더 간단하게 선언하는 방법 -> new int[] 생략가능
int[] score = { 50, 60, 70, 80, 90 }

// 배열의 선언과 생성을 따로 하면 new int[] 생략 불가능하다
int[] score;
score = { 50,60,70 }; // 불가능

// 매개변수로 int배열을 받는 add 메소드
int add(int[] arr) {  }
int result = add(new int[] { 100, 90, 80 }); // OK
int result = add({ 100, 90, 80 }); // err

// 길이가 0인 배열
int[] score = new int[0];
int[] score = new int[]{};
int[] score = {};

 

주의 할점

int[] score;
score = {50,60} // error

int[] score;
score = new int[]{50,60}  // right

 

- 배열의 유효한 범위를 넘어선 index를 사용하면, ArrayIndexOutOfBoundsException 이 발생하므로 주의

 

배열의 길이

배열의 길이는 int범위의 양의 정수 ( 0도 포함 ) 이어야 한다.

배열이름.length

int[] arr = new int[5]
int tmp = arr.length // 5

- 배열의 길이는 고정적이므로 변경하지 못한다

int[] arr = new int[5];
arr.length = 10; // 불가능

 

배열의 길이 변경하는 방법

1. 더 큰 배열을 새로 생성
2. 기존 배열의 내용을 새로운 배열에 복사한다

 

배열의 출력

for문을 사용한 방법

int[] iArr = { 100, 90, 80 };
for(int i = 0; iArr.length; i++ ) {
    System.out.println(iArr[i]);
}

// 여러줄에 출력말고 출력 ( 줄바꿈 없이 )
int[] iArr = { 100, 90, 80 };
for(int i = 0; iArr.length; i++ ) {
    System.out.print(iArr[i]);
}

 

Array.toString( 배열이름 )을 사용한 방법

int[] iArr = { 100, 90, 80 };
System.out.println(Arrays.toString(iArr));

// 배열을 가리키는 참조변수 iArr을 출력하는 경우
System.out.println(iArr); 
// 타입@주소( 주소는 16진수이다 - 배열의 주소임 )

 

배열의 복사

System.arraycopy()

배열의 복사는 arraycopy() 사용하기

지정된 범위의 값들을 한번에 통째로 복사하기에 for문을 쓰는 것보다 효율적이다.

// for
for(int i = 0; i < num.length; i++ ) {
    newNum[i] = num[i]
}

// arraycopy
System.arraycopy(num, 0, newNum, 0 , num.length);

// num[0]에서 newNum[0]으로 num.length개의 데이터 복사

// 주의 ) 복사하려는 배열의 위치가 적절하지 못하여 복사하려는 내용보디 여유공간이 적으면 에러

 

for - each

String[] members = {"진혁", "진구", "혁진" };
for(String e: members) { 
    System.out.orintln(e)
}

 

 

String 배열

타입에 따른 변수의 기본값

String클래스는 char배열에 기능(메서드)를 추가한것이다.

 

다차원 배열

다차원 배열은 1차원 배열과 같은데, 다만 [] 가 하나 더 들어갈 뿐이다.

선언방법 선언 예
타입[][] 변수이름; int[][] score;
타입 변수이름[][]; int score[][];
타입[] 변수이름[]; int[] score[];

 

예시)

int[][] score = new int[4][3]; // 4행 3열

4행 3열

1행1열(int니까 기본값 0) 1행2열(int니까 기본값 0) 1행3열(int니까 기본값 0)
2행1열(int니까 기본값 0) 2행2열(int니까 기본값 0) 2행3열(int니까 기본값 0)
3행1열(int니까 기본값 0) 3행2열(int니까 기본값 0) 3행3열(int니까 기본값 0)
4행1열(int니까 기본값 0) 4행2열(int니까 기본값 0) 4행3열(int니까 기본값 0)

 

초기화

int[][] arr = new int[][]{ {1,2,3}, {4,5,6} };
int[][] arr = { {1,2,3}, {4,5,6} };

 

2차원 배열 score의 모든 요소 합 구하는 방법

for(int[] tmp: score) {
    for(int i : tmp ) {
        sum += i;
    }
}

 

가변 배열

가변배열은 2차원 배열이랑 비슷하지만, 각 행들의 길이가 다르다

int[][] score = new int[5][3] // 5행 3열
// way1
int[][] score = new int[5][]; // 2번째 차원의 길이를 정하지 않는다 ( 열의 길이 정하지 않음 )
score[0] = new int[3]; // 첫번째 행에 대해서 열의 길이가 3이다
score[1] = new int[3];
score[2] = new int[3];
score[3] = new int[3];
score[4] = new int[3]; // 5번째 행에 대해서 열의 길이도 3이다

// way2
int[][] score = new int[5][]; // 2번째 차원의 길이를 정하지 않는다 ( 열의 길이 정하지 않음 )
score[0] = new int[4]; // 1번째 행에 대해서 열의 길이가 4이다
score[1] = new int[3]; // 2번째 행에 대해서 열의 길이가 3이다
score[2] = new int[2]; // 3번째 행에 대해서 열의 길이가 2이다
score[3] = new int[2]; // 4번째 행에 대해서 열의 길이가 2이다
score[4] = new int[3]; // 5번째 행에 대해서 열의 길이도 3이다

가변 배열 예시