[Java] 배열

thingzoo·2023년 6월 13일
0

Java

목록 보기
7/20
post-thumbnail

배열

선언

  1. 타입 [] 변수;

    ex. int[] intArray;

  2. 타입 변수[];

    ex. int intArray[];

생성

배열(Array)는 참조형 변수들처럼 new 명령을 통해서 생성하며, 대괄호[] 안에 크기를 지정

  • 각 칸마다 순번(index)를 가지며 0부터 크기-1까지 있음
  • 배열은 생성될때 각 타입별 초기값으로 초기화됨
    - 예시: int(0), boolean(false), String(null)
  • 참조형 변수이기 때문에 실제 값을 담지않고 실제값의 주소값을 저장!
// 배열 생성

//배열 생성후 초기화하면 배열의 주소가 할당된다.
int[] intArray = new int[3]; // 초기값 {0,0,0}
boolean[] boolArray = new boolean[3]; // 초기값 {false, false, false}
String[] stringArray = new String[3]; // 초기값 {"","",""}
		
//배열 선언만 해놓고 나중에 초기화를 시킬수도 있다.
int[] intArray2;
intArray2 = new int[3]; // 초기값 {0,0,0}

조회/순회

배열 변수뒤에 대괄호 [] 안에 반복문 순번값 i 를 넣어주면
i번째 값을 조회할 수 있음!

//길이가 8인 정수배열 선언
int[] intArray = new int[3];

// 배열이 초기화된 값을 출력해본다.
for(int i=0; i<intArray.length; i++) { // .length 는 배열의 길이
	System.out.println(intArray[i]);
}

🔎 .length 메서드
배열이 지원하는 메서드로써 해당 배열의 길이값 반환
배열의 길이는 처음에 선언한 크기를 가짐

초기화

  1. 중괄호{} 사용
  2. 반복문 for문 사용(또는 향상된 for문)
  3. Arrays.fill 메소드 사용
// 배열 초기화 

import java.util.Arrays; // Arrays 클래스를 import 해주세요!

//1. 배열에 특정값 대입하며 선언
int[] intArray = {1, 2, 3, 4, 5};
String[] stringArray = {"a", "b", "c", "d"};

//2-1. for문을 통해 값을 대입
for (int i = 0; i < intArray.length; i++) {
	intArray[i] = i;
}

//2-2. 향상된 for문을 통한 배열 출력
for (int i : intArray) {
	System.out.print(i); // 01234
}

//3. 배열의 주소를 모두 같은값으로 초기화
Arrays.fill(intArray, 1); //배열의 모든 값을 1로 초기화

for (int i : intArray) {
	System.out.print(i);  // 11111
}

복사

얕은 복사

  • 배열은 참조형 변수이며 실제값이 아닌 실제값의 주소값을 가짐
  • 따라서 배열 변수간에 대입 연산자 = 를 사용해서 복사를 하게 되면 주소값만 복사됨
  • 이렇게 주소값만 복사되고 실제값은 1개로 유지되는걸 얕은 복사 라고함
  • 같은 주소값을 가진다? == 같은 값을 가리키고 있다!
// 얕은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사

b[0] = 3; // (1 -> 3)
System.out.println(a[0]); // 3

깊은 복사

  • 얕은 복사처럼 주소값만 복사하는것이 아닌 진짜 새로운 배열을 똑같이 만들고 싶을때 사용
  • 깊은 복사는 결국 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사해주면 됨
  • 반복문 for 문 을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있음
// 깊은 복사

int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length]; 

for (int i = 0; i < a.length; i++) {
    b[i] = a[i]; // 깊은 복사
}

b[0] = 3; // (1 -> 3)
System.out.println(a[0]); // 1
// 깊은 복사 메서드

// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다. 
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작함!!

// 2. Arrays.copyOf() 메서드
import java.util.Arrays;
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length); // 배열, 크기

다차원 배열

2차원 배열

선언

  • int[][] array
  • int array[][]
  • int[] array[]

생성

  • int[][] array = new int[][];

초기화

  1. 중괄호 사용
// 중괄호를 사용해 선언&초기화

int[][] array = {
	{1, 2, 3},
	{4, 5, 6}
};
  1. 선언/생성 이후 반복문을 통해 초기화
// 반복문을 통한 초기화

int[][] array = new int[2][3]; // 선언

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

가변 배열

  • Java 프로그래밍 에서는 2차원 배열을 생성할 때 열의 길이를 생략하여, 행마다 다른 길이의 배열을 요소로 저장할 수 있음
  • 이렇게 행마다 다른 길이의 배열을 저장할 수 있는 배열을 가변 배열이라고 함
// 가변 배열

// 선언 및 초기화
int[][] array = new int[3][];
// 배열 원소마다 각기다른 크기로 지정 가능
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];

// 중괄호 초기화
int[][] array2 = {
    {10, 20},
    {10, 20, 30, 40},
    {10}
};

2차원 이상 배열

2차원 배열외에도 3차원, 4차원 등..이 있지만 거의 대부분 3차원 까지만 사용하는경우가 많다.

// 3차원 배열의 이해

// 중괄호 3개를 써서 3차원 배열 초기화를 할 수 있습니다.
int[][][] MultiArray = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};

다차원 배열 조회

// 가변 2차원 배열 조회
int[][] array = {
	{10, 20, 30},
	{10, 20, 30, 40},
	{10, 20}
};

for (int i = 0; i < array.length; i++) { // 1차원 길이
	for (int j = 0; j < array[i].length; j++) { // 2차원 길이
		System.out.println(array[i][j]); // 2중 반복문으로 i, j 인덱스 순회
	}
}

Arrays 클래스 ✨

배열을 다룰 때 알아두면 편리한 Arrays의 메소드를 알아두쟈

  • Arrays.copyOf(arr) : 배열 전체 복사
  • Arrays.copyOfRange(arr, begin, end) : begin부터 end전까지 배열 일부 복사(자르기)
  • Arrays.fill(arr, x): 배열을 모두 x값으로 채움
  • Arrays.asList(arr): 배열을 ArrayList로 변환
  • Arrays.sort(arr): 기본 정렬(오름차순)
  • Arrays.sort(arr, Collections.reverseOrder()): 내림차순 정렬(정수는 컬랙션으로 정렬해야함...!)
  • Arrays.binarySearch(arr, x): x값 이진탐색 후 인덱스 반환

🚨 primitive타입(int)는 내림차순 정렬이 불가능하다!
그래서 wrapper클래스(Integer)로 바꿔줘야한다.

Integer[] arr2 = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(arr2, Collections.reverseOrder());

Reference

🔗 스파르타코딩클럽 Java 문법 종합반

profile
공부한 내용은 바로바로 기록하자!

0개의 댓글