가장 기본적인 자료구조이자, 앞으로 지겹도록 보게 될 JAVA의 배열에 관해 알아보겠습니다.

배열의 이론적인 부분은 다 아신다고 생각하고, 활용적인 면을 위주로 정리해보았습니다.

어느 정도 경험이 있으신 분들은 맨 아래의 코드만 보셔도 이해가 가능할 것 같습니다.

 

 

1. 선언

int[] array0;

선언만 하고 값의 대입은 나중으로 미룰 수 있다.


int[] array1 = new int [10];

배열의 크기만 잡아 선언하면 안의 값은 default값으로 채워진다.

 

int[] array2 = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };

최초에는 직접 값을 넣으면서 선언이 가능하다.

값을 변경할 때는 불가능하지만 새로운 배열을 만들어서 넣어주는 건 가능하다.

 

int[] array3 = new int [] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

새로운 배열을 만들면서 값을 곧바로 대입한다. 이 방법으론 나중에도 값의 변경이 가능하다.

ex) array3 = new int[] {1,2,3,4};

 

2. 기본 값

System.out.println(Arrays.toString(array1));

"{0,0,0,0,0,0,0,0,0,0}"

배열에 아무런 값을 넣지 않을 시 초기값은 0이다. (Int 타입의 경우, Boolean 타입은 false가 들어간다.)

 

3. Java.util.Arrays

Arrays를 import 하면 배열과 관련된 여러 유용한 메서드를 사용할 수 있다.

 

Arrays.fill();

배열 안을 지정된 값으로 채운다.

Arrays.toString();

기본적으로 toString()을 사용하거나 배열 자체를 출력하면 주소 값이 출력된다. Arrays.toString 메서드를 활용하면 배열의 값을 보기 좋게 출력한다. 

Arrays.sort();

배열의 원소들을 정렬한다. 기본적으론 오름차순 정렬이고, 정렬의 기준은 타입에 따라 내부적으로 구현된 compare메서드를 따른다.

 

람다식을 활용한 정렬

Arrays.sort(array, (e1, e2)->{
      return e1[1] - e2[1];
});

이런 식으로 람다식을 활용하면 내림차순 정렬은 물론이고 원하는 어떤 방식으로도 정렬이 가능하다.

단, 기본 타입 (Primitive) 배열엔 적용이 불가능하기 때문에, 동치 되는 class를 사용하면 된다.

ex) int[] -> Integer[] , char[] -> Character[] 등..

 

4. 주소 값 문제

JAVA는 기본 타입의 경우 Call by Value로 값을 전달하고 객체들의 경우엔 주소 값을 전달합니다.

배열도 객체로 취급되어 주소가 전달되다 보니, 개발자의 생각과 다르게 동작하는 경우가 생깁니다.

반복문을 통해 값을 하나하나 대입하는 방법도 있지만, clone메서드를 사용하면 쉽게 값의 복사가 가능합니다.

 

int[] array4 = array2;

array2의 주소 값이 들어갔다.

array4를 수정하면 array2도 동시에 수정되고, array2를 수정하면 array4도 바뀐다.


int[] array5 = array2.clone();

array2의 현재 상태를 복사해서 새로운 배열을 생성했다.

이후 둘의 수정은 서로에게 영향을 끼치지 않는다!

 

for(int i = 0; i < array.length; i++){

    copyArr[i] = arr[i].clone();

}

이런 식으로 반복문을 활용해 다차원 배열의 복사도 가능하다!

 

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {

		int[] array0;
		int[] array1 = new int[10];
		int[] array2 = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
		int[] array3 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

		System.out.println("----> array의 기본 값은 0");
		System.out.println(Arrays.toString(array1));

		System.out.println("----> array2");
		System.out.println(Arrays.toString(array2));

		int[] array4 = array2;
		int[] array5 = array2.clone();

		Arrays.sort(array2);

		System.out.println("----> array2 sort 후");
		System.out.println(Arrays.toString(array2));
		System.out.println("----> array4는 array2의 주소를 가리킨다.");
		System.out.println(Arrays.toString(array4));
		System.out.println("----> array5는 array2의 값을 복사했다.");
		System.out.println(Arrays.toString(array5));

		System.out.println("----> array3");
		System.out.println(Arrays.toString(array3));

		array3 = new int[] { 1, 1, 1, 1 };

		System.out.println("----> array3에 새로운 값 넣기");
		System.out.println(Arrays.toString(array3));

		Arrays.fill(array3, 999);

		System.out.println("----> array3 값 채우기");
		System.out.println(Arrays.toString(array3));

		Integer[] array6 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

		System.out.println("----> Integer 배열 array6");
		System.out.println(Arrays.toString(array6));
		Arrays.sort(array6, (e1, e2) -> {
			return e2 - 21;
		});
		System.out.println("----> array6 역순으로 sort");
		System.out.println(Arrays.toString(array6));

		System.out.println("인자로 전달해 출력하기");
		printArr(array1);

		System.out.println("인자로 전달해 변경하기");
		System.out.println(Arrays.toString(array1));
		fillArr(array1);
		System.out.println(Arrays.toString(array1));

		Integer[][] array7 = { { 1, 2, 3, 4 }, { 4, 3, 2, 1 }, { 4, 1, 2, 3 }, { 1, 4, 3, 2 } };

		System.out.println("----> array7 출력");
		System.out.println(Arrays.toString(array7));

		System.out.println("----> array7 반복문 출력");
		for (int i = 0; i < array7.length; i++) {
			System.out.println(Arrays.toString(array7[i]));
		}

		Integer[][] array8 = { { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, { 4, 3 }, { 3, 1, 5 }, { 1, 4, 3 } };
		System.out.println(array8.length);
		for (int i = 0; i < array8.length; i++) {
			System.out.println("----> array8의 길이 출력");
			System.out.println(array8[i].length);
		}

		Arrays.sort(array8, (e1, e2) -> {
			return e1[1] - e2[1];
		});

		System.out.println("----> array8 두번째 원소로 정렬해 출력");
		for (int i = 0; i < array8.length; i++) {
			System.out.println(Arrays.toString(array8[i]));
		}

		Arrays.sort(array8, (e1, e2) -> {
			return e1.length - e2.length;
		});

		System.out.println("----> array8 배열 길이로 정렬해 출력");
		for (int i = 0; i < array8.length; i++) {
			System.out.println(Arrays.toString(array8[i]));
		}

		int[] array9 = { 1, 2, 3, 4, 5 };
		int[] array10 = { 1, 2, 3, 4, 5 };

		System.out.println(array9.equals(array10));
	}

	static void printArr(int[] arr) {
		System.out.println(Arrays.toString(arr));
	}

	static void fillArr(int[] arr) {
		Arrays.fill(arr, 1);
	}
}

 

728x90

'🔠 Language > ☕ Java' 카테고리의 다른 글

[JAVA] 함수 Interface  (0) 2021.12.07
[JAVA] PS에 유용하게 쓰이는 JAVA의 입출력 방법들  (0) 2021.11.26

+ Recent posts