배열의 특징

2023. 5. 24. 02:52
배열을 사용하면 많은 양의 데이터를 손쉽게 다룰 수 있다.

>  배열의 특징

  • 배열은 각 저장공간이 연속적으로 배치되어 있다.
  • 배열 선언: 배열을 다루기 위한 참조변수를 위한 공간 할당
  • 배열 생성: 값을 저장할 수 있는 공간 생성
int[] arr = new int[5];  // 타입[] 변수이름: 배열 선언 / new int[길이]: 길이만큼의 배열 생성
  • 배열이름.length는 상수
  • 배열이 한번 선언되면 길이를 변경할 수 없다. 하지만 배열을 복사해서 새로운 배열에 붙여넣는 방식으로 길이를 변경한다.

 

>  배열의 복사

int[] arr = new int[5];  // {1, 2, 3, 4, 5} 라고 가정
int[] temp = new int[arr.length * 2];  // arr보다 길이가 2배인 배열 생성

for (int i = 0; i < arr.length; i++) {
	temp[i] = arr[i];
}

arr = temp;  // 참조변수 arr이 새로운 배열을 가리키게 한다.

// 자신을 가리키는 참조변수가 없는 배열은 JVM 가비지 컬렉터에 의해서 자동적으로 메모리에서 제거된다.
// 즉 원래 arr의 배열이었던 {1, 2, 3, 4, 5} -> 사라짐

배열을 복사하는 방법은 여러가지가 있다.

 

>>  System.arraycopy()

int[] temp1 = new int[arr.length * 2];
System.arraycopy(arr, 0, temp1, 0, arr.length);
            // arr[0] -> temp1[0]으로 arr.length개의 데이터 복사

지정된 범위의 값들을 한 번에 통째로 복사한다.

 

>>  Arrays.copyOf()

import java.util.Arrays;
...
int[] temp2 = Arrays.copyOf(arr, arr.length * 2);
            // arr을 arr길이의 2배의 길이의 배열(temp2)에 복사

import java.util.Arrays 를 꼭 선언해주어야 한다. 새로운 배열에 복사 대상 배열을 복사한다. 이때 새로운 배열의 길이를 설정해줄 수 있다.

 

>>  Arrays.copyOfRange()

import java.util.Arrays;
...
int[] temp3 = Arrays.copyOfRange(arr, 3, 12);
		// arr[3]부터 arr[12]까지 복사 (값이 없으면 0으로 길이를 맞춤)

import java.util.Arrays 를 꼭 선언해주어야 한다. 새로운 배열에 복사 대상 배열을 복사한다. 이때 복사 대상 배열의 원하는 인덱스부터 원하는 인덱스까지 값을 복사한다. (만약 값이 없으면 0으로 길이를 맞춘다.)

 

>  배열의 정렬

>>  Arrays.sort()

import java.util.Arrays;
...
Arrays.sort(arr);  // 1, 2, 3 ... 오름차순 정렬

Integer[] arr = {1, 2, 3, 4, 5};
Arrays.sort(arr, (a, b) -> b - a);  // 5, 4, 3 ... 내림차순 정렬
  • 오름차순 정렬이 기본이다.
  • 내림차순 정렬을 위해선 wrapper class로 변환해야한다. ( sort() 메서드 호출시 구현된 Comparator 클래스를 명시해주어야 하기 때문에 객체로 받아야 함 )
  • 음수 끝지점은 잘 정렬이 안된다. ( -2_147_483_645 정도까지만 정렬된다. )

https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html

 

>> 변수의 타입에 따른 기본값

자료형 기본값
boolean false
char '\u0000'
byte, short, int 0
long 0L
float 0.0f
double 0.0d 혹은 0.0
참조형 변수 (String 등) null

 

>>  String 배열

  • String 클래스는 char배열에 기능(메서드)을 추가한 것이다.
  • String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다.
String str = "Java";
str = str + "8";

// str의 내용이 변경되는 것 같지만 새로운 내용의 문자열이 생성된다.

(나중에 String 한다면 거기에 옮길거임)

 

>  다차원 배열

>>  2차원 배열

// 다양한 선언 방법
int[][] arr = new int[2][3];  // 타입[][] 변수명 = new 타입 [행][열];
int arr [][] = new int[2][3];  
int[] arr[] = new int[2][3];

 

>>  가변 배열

int[][] arr = new int[5][];  // 5행 ?열의 2차원 배열 생성
arr[0] = new int[1];
arr[1] = new int[2];
...
arr[4] = new int[3];
// 각 행마다 다른 길이의 배열을 생성할 수 있다.

 

 

참조

남궁성, <Java의 정석: 최신 Java 8.0 포함 - 3rd Editon>, 도우출판, pp 192~228

https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html  2023.05.25 확인

BELATED ARTICLES

more