본문 바로가기

개발/Java

[Java] 배열 / 얕은 복사 / 깊은 복사 / 다차원 배열

배열

 

배열은 참조형 변수들처럼 new 명령어를 통해서 생성됨.

대괄호 안에 크기 지정해주기

배열은 생성될 때 각 타입별 초기값으로 초기화 되어 채워짐 (int는 0, boolean은 false, String은 null)

//선언 생성 동시에
int[] arr = new int[8];

//선언 후 나중에 초기화
int[] arr2;
arr2 = new int[3];

//특정값을 대입해 선언
String[] stringarr = {"a","b","c"};

 

배열의 주소를 모두 같은 값으로 초기화하는 예시 코드

(Arrays 유틸리티 사용, 해당 유틸리티에는 배열과 관련된 여러 메소드들이 들어있다.)

int[] intArr = {10,20,30};
Arrays.fill(intArr,1);

for(int item : intArr) {
	System.out.println(item); //1 1 1
}

 

 

 

배열 복사

 

얕은 복사

대입연산자(=)를 사용해 복사하면 주소값만 복사됨.

변수명은 다르지만 서로 같은 값을 보고 있음.

//얕은 복사
int[] a = {1,2,3,4};
int[] b = a; //얕은 복사

b[0] = 3; //b배열의 0번째 순번값을 3으로 수정

System.out.println(a[0]); //얘도 3으로 출력

 

 

깊은 복사

1. 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; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)

System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.

 

2. 깊은 복사 메서드를 사용하는 방법

// 깊은 복사 메서드

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

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		// 2. Arrays.copyOf() 메서드
		int[] a = { 1, 2, 3, 4 };
		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
	}
}

 

 

 

String 기능 활용 예시

문자열을 다룰 때 유용하게 쓸 수 있는 String 기능들에 대해 정리해보았다.

String str = "ABCD";

//(1) length()
int strLength = str.length(); //4

//(2) charAt(int index)
char strChar = str.charAt(1); //B

//(3) substring(int fromIdx, int toIdx)
String strSub = str.substring(0,3); //0번째부터 3번째 전까지 출력 //ABC

//(4) equals(String str)
String newStr = "ABCD";
boolean strEqual = newStr.equals(str); //true

//(5) toCharArray() : String -> char[]
 char[] strCharArray = str.toCharArray(); // {'A', 'B', 'C'}
 
//(6) 반대로 char[] -> String
char[] charArray = {'A', 'B', 'C'};
String charArrayString = new String(charArray); //ABC

 

 

 

다차원 배열

 

2차원 배열

int[][] array = new int[2][3]; //2*3 총 6개

//중괄호 사용해 초기화
int[][] array = {
 {1,2,3},
 {4,5,6}
};

//반복문 통해 초기화
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;
	}
}

 

 

가변 배열

배열 원소마다 각기 다른 크기로 지정 가능

//가변 배열
int[][] arr = 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}
};

 

 

동적 가변 배열

ArrayList를 사용하여 배열 크기를 지정해두지 않고 동적으로 배열 원소마다 다른 크기 지정 가능

// 가변 배열을 ArrayList로 생성
ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();

// 각 원소마다 ArrayList를 추가
arrayList.add(new ArrayList<>()); // 0번째 리스트
arrayList.add(new ArrayList<>()); // 1번째 리스트
arrayList.add(new ArrayList<>()); // 2번째 리스트

// 원소 추가
arrayList.get(0).add(1); // 0번째 리스트에 1 추가
arrayList.get(0).add(2); // 0번째 리스트에 2 추가

arrayList.get(1).add(3); // 1번째 리스트에 3 추가
arrayList.get(1).add(4); // 1번째 리스트에 4 추가
arrayList.get(1).add(5); // 1번째 리스트에 5 추가
arrayList.get(1).add(6); // 1번째 리스트에 6 추가

arrayList.get(2).add(7); // 2번째 리스트에 7 추가

'개발 > Java' 카테고리의 다른 글

[Java] do while과 비슷한 기능을 하는 로직  (0) 2024.04.23
[Java] 컬렉션  (0) 2024.04.22
[Java] 조건문 / 반복문 / break / continue  (0) 2024.04.22
[Java] 연산자  (1) 2024.04.22
[Java] 사용자에게 값 입력 받기  (0) 2024.04.22