Java

자바(Java) - 배열(Array)

신동편 2023. 3. 9. 20:56
728x90

 

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

서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.

 

변수 대신 배열을 이용하면 변수의 선언과 달리 다뤄야 할 데이터의 수가 아무리 많아도 단지 배열의 길이만 바꾸면 된다.


선언과 생성

 

배열을 선언하려면, 원하는 타입의 변수를 선언하고, 변수 또는 타입에 배열임을 의미하는 대괄호[ ]를 붙이면 된다. 대괄호는 타입 뒤에 붙여도 되고, 변수 이름 뒤에 붙여도 된다.

 

배열을 선언한 다음에는 배열을 선언해야 한다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야 값을 저장할 수 있는 공간이 만들어진다.

 

배열을 생성하기 위해서는 'new'연산자 와 함께 배열의 타입과 길이를 지정해 주어야 한다.

타입[] 변수이름;            //배열의 선언(배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이];  //배열의 생성(실제 저장공간을 생성)

타입[] 변수이름 = new 타입[길이]; //배열의 선언과 생성을 동시에 한줄로

배열의 인덱스

 

생성된 배열의 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.

인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용한다.

인덱스는 1이 아닌 0부터 시작한다.

인덱스의 범위는 0부터 배열길이 - 1까지이다.

배열에 값을 저장하고 읽어오는 방법은 변수와 같다.

변수이름 대신 배열이름[인덱스]를 사용한다.

 

score[3] = 100;  //배열 score의 4번째 요소에 100을 저장.

int value = score[3];  //배열 score의 4번째 요소의 값을 읽어서 value에 저장.

 

배열은 인덱스로 상수 대신 변수나 수식도 사용할 수 있다.


배열의 길이(배열이름.length)

 

자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며,

'배열이름.length'를 통해서 배열의 길이에 대한 정보를 알 수 있다.

 

int[] arr = new int[5];  //길이가 5인 int배열
int tmp = arr.length;    //arr.length의 값은 5이고, tmp에 5가 저장

배열은 한번 생성되면 길이를 변경할 수 없다.

따라서,  이미 생성된 배열의 길이는 변하지 않는다.

'변수이름.length'는 상수이다.


배열의 초기화

 

배열은 생성과 동시에 자동적으로 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만, 원하는 값을 저장하려면 각 요소마다 값을 지정해줘야 한다.

 

int[] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;

 

배열의 길이가  큰 경우, 요소 하나하나에 값을 지정하기보다 for문을 사용하는 것이 좋다.

int[] score = new int[5];

for(int = i; i < score.length; i++){
		score[i] = i * 10 + 50;
}

for문으로 배열의 값을 초기화하는 경우 저장하려는 값에 일정한 규칙이 있어야만 가능하다.

 

자바에서는 다음과 같이 배열을 초기화 시키는 방법이 있다.

int[] score = new int[]{..., ..., ..., ...};  //배열을 생성과 동시에 초기화

 저장할 값들을 { }안에 쉼표로 구분하여 나열한다. { }안의 갯수에 의해 배열의 길이가 정해지기 때문에 [ ]안에 배열의 길이는 생략할 수 있다.

 

'new 타입[]'도 생략 가능하다.

int[] score = {..., ..., ..., ...};

배열의 선언과 생성을 동시에 할 때만 생략이 가능하다.


배열의 출력

 

int[] arr = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};
//배열을 가리키는 참조 변수 arr 을 출력
System.out.println("arr = " + arr); 
//메모리 주소와 비슷한 문자열이 출력 -> 실제 주소는 아닙니다.
// [I@7a81197d -> [(배열을 뜻함), I(int 타입을 뜻함), @(위치를 뜻함)

//예외 확인 하기 - char[]
char[] chArr = {'a', 'b', 'c', 'd'};
System.out.println(chArr); // abcd 가 출력되는데 이는 println 메서드의 기능 때문!

//배열의 요소 하나씩 출력하기
for (int i = 0; i < arr.length; i++) {
       System.out.println("arr[" + i + "] = " + arr[i]);
}
        
//Arrays.toString(배열) : 배열의 모든 요소를 문자열로 만들어서 반환한다.
System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));

배열의 활용

더보기

배열의 활용 - 총합과 평균

int sum = 0; // 총합을 저장
float avg = 0f; // 평균을 저장

int[] score = {100, 40, 33, 50, 77, 29};

for (int i = 0; i < score.length; i++) {
      System.out.println("score[" + i + "] = " + score[i]);
      sum += score[i];
}

avg = sum / (float) (score.length); // 계산결과를 float 타입으로 얻기 위해 형변환

System.out.println("총합 = " + sum);
System.out.println("평균 = " + avg);

 


배열의 활용 - 최댓값과 최솟값

 

int[] score = {65, 97, 88, 43, 33, 91, 28};

int max = score[0]; // 최대값을 배열의 첫 번째 값으로 초기화 한다.
int min = score[0]; // 최소값을 배열의 첫 번째 값으로 초기화 한다.

for (int i = 0; i < score.length; i++) {
      if (score[i] > max) {
            max = score[i];
      } else if(score[i] < min) {
           min = score[i];
      }
}

System.out.println("최대값 = " + max);
System.out.println("최소값 = " + min);

 


배열의 활용 - 섞기

 

int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println("원본 = " + Arrays.toString(numArr));

for (int i = 0; i < numArr.length; i++) {
      int num = (int) (Math.random() * 10); // 0 ~ 9 의 랜덤 수

      int tmp = numArr[0]; // 배열의 첫 번째 수로 계속 초기화 된다.

// 랜덤한 위치의 값과 배열의 첫 번째 수가 서로 바뀐다.
      numArr[0] = numArr[num];
      numArr[num] = tmp;

      System.out.println(i + 1 + " 번째 변경 : " + Arrays.toString(numArr));
}

System.out.println("결과 = " + Arrays.toString(numArr));

 


배열의 활용 - 로또 번호 만들기

 

int[] ball = new int[45]; //45개의 값을 저장하기 위한 배열 생성

for(int i=0; i < ball.length; i++){
	ball[1] = i+1;  //배열의 각 요소에 1 ~ 45의 값을 저장
}

int tmp = 0;  //두 값을 바꾸는데 사용할 임시 변수
int j = 0;	  //임의의 값을 얻어서 저장할 변수

//배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 섞는다.
//0부터 5번째 요소까지 모두 6개만 바꾼다.
for(int i=0; i < 6; i++){
	j = (int)(Math.random() * 45); //0 ~ 45범위의 임의의 값을 얻는다.
    tmp = ball[i];
    ball[i] = ball[j];
    ball[j] = tmp;
}
//배열 ball의 앞에서부터 6개의 요소를 출력한다.
for(int i=0; i < 6; i++){
	System.out.printf("ball[%d]=%d%n", i, ball[i]);

 


 

String 배열의 선언과 생성

 

String[] name = new String [n]; //정수 n개의 문자열을 담을 수 있는 배열을 생성

n개의 String타입의 참조변수를 저장하기 위한 공간을 생성한다.

참조형 변수의 기본값은 null이므로 각 요소의 값은 null로 초기화된다.


String배열의 초기화

 

배열의 각 요소에 문자열을 지정하면 된다.

String[] name = new String[3];
name[0] = "kim";
name[1] = "yi";
name[3] = "park";

또는 { }를 이용해서 간단히 할 수 있다.

String[] name = {"kim", "ye", "park"};
//new String[] 생략 가능

String클래스만 "kim"과 같이 큰 따옴표만으로 간략히 표현하는 것이 가능하지만, 원래 String은 클래스이므로 new연산자를 통해 객체를 생성해야 한다.

String[] = name new String[3];
name[0] = "kim";		//name[0] = new String("kim");

String클래스

 

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

String 클래스는 내용을 변경할 수 없다.

따라서 내용을 바꾸려면 새로운 내용의 문자열을 생성해야 한다.

String str = "java";
str = str + "8";		//"java8"이라는 내용이 새로운 문자열 str에 저장된다.

String클래스의 주요 메서드

 


2차원 배열의 선언과 생성

 

2차원 이상의 배열, 즉 다차원의 배열도 선언해서 사용할 수 있다.

메모리의 용량이 허용하는 한, 차원의 제한은 없지만 주로 1, 2차원 배열이 사용된다.

 

2차원의 배열을 선언하는 방법은 대괄호를 2개 붙이면 된다.

타입[][] 변수이름;

타입 변수이름[][];

타입[] 변수이름[];

 

 

 

int[][] score = new int[4][3];

4행 3열의 2차원 배열, int타입 score를 생성하면,

4 * 3 의 int값을 저장할 수 있는 공간이 생기고, 각 배열 요소에 접근할 수 있는 방법은 위와 같다.

 


2차원 배열의 초기화

 

2차원 배열도 { }를 써서 생성과 초기화를 동시에 할 수 있다.

1차원보다 { }를 더 써서 행별로 구분해준다.

 

크기가 작은 배열은 간단히 한줄로 써도 좋지만, 가능하면 행별로 줄 바꿈을 해주는 것이 좋다.

int[][] arr = { //new int[][]가 생략됨
		{1, 2, 3},
		{4, 5, 6}
              };

Arrays

 

Arrays클래스는 배열을 다루는데 유용한 메서드를 제공한다.

 

1. 배열의 비교와 출력 - equals(), toString()

 

toString()배열의 모든 요소를 문자열로 편하게 출력할 수 있다.

toString()은 일차원의 배열에만 사용할 수 있고, 다차원 배열에는 deepToString()을 사용할 수 있다.

int[] arr = {0, 1, 2, 3, 4}; 
int[][] arr2d = {{11, 12}, {21, 22}}; 

System.out.println(Arrays.toString(arr)); //[0, 1, 2, 3, 4]
System.out.println(Arrays.deepToString(arr2d)); //[[11, 12], [21, 22]]

 

equals()는 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다.

equals()는 일차원에서만 사용 가능하므로, 다차원 배열 비교에서는 deepEquals()를 사용해야 한다.

String[][] str2d = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2d2 = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};

System.out.println(Arrays.equals(str2d, str2d2));  //false
System.out.println(Arrays.deepEquals(str2d, str2d2)); //true

 

2. 배열의 복사 - copyOf(), copyOfRange()

 

copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 만들어 반환한다.

copyOfRange()에 지정된 범위의 끝을 포함하지 않는다.

int[] arr = {0, 2, 3, 4};
int[] arr2 = Arrays.copyOf(arr, arr.length);	//0, 1, 2, 3, 4
int[] arr3 = Arrays.copyOf(arr, 3);				//0, 1, 2
int[] arr4 = Arrays.copyOf(arr, 7);				//0, 1, 2, 3, 4, 0, 0
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);		//2, 3
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);		//0, 1, 2, 3, 4, 0, 0

 

3. 배열의 정렬 - sort()

 

배열을 정렬할 때 sort()를 사용한다.

int[] arr = {3, 2, 0, 2, 4};
Arrays.sort(arr);	//arr을 정렬한다. [0, 1, 2, 3, 4]

 


Aviv - Failed English

 

728x90