Java 배열 얕은 복사와 깊은 복사 & char[ ] ⬌ String

KDG: First things first!·2024년 7월 23일

Java

목록 보기
4/4

얕은 복사

자바에서 배열은 참조형 변수로서 변수에 실제 값이 아니라 실제 값의 주소값을 저장한다.

int[] a = {1, 2, 3,};
int[] b = a;

따라서 다음과 같이 배열 변수간에 대입 연산자(=)를 사용하여 복사를 하게 되면 복사한 변수는 주소값만 복사하여 변수에 저장하고 두 변수는 모두 같은 배열을 참조한다.
이처럼 실제 값이 아니라 주소 값만 복사되어 저장되고 실제 값은 여전히 1개로 유지되는 것을 얕은 복사라고 한다.


얕은 복사를 해도 위의 예시 두 변수인 a, b는 모두 같은 값(배열)을 바라보고 있기 때문에
b[0] = 10;
System.out.println(a[0]) // 10 출력

변수 b를 이용하여 값을 변화시키더라도 변수 a의 값 또한 같이 변화하는 모습을 보인다.




깊은 복사

그렇다면 만약 얕은 복사처럼 불완전한 복사가 아니라 실제 배열을 복사하여 똑같은 배열을 여러 개로 만들고 싶다면 깊은 복사를 해야 한다.

깊은 복사는 실제 값을 가지고 있는 배열의 값을 꺼내어 복사하여 실제 값을 하나 더 만드는 것이다.

배열을 실제 똑같이 복사하는 깊은 복사에는 여러 가지 방법이 존재한다.

  1. 반복문으로 배열 순회하여 복사
int[] a = {1, 2, 3,};
int[] b = new int[a.length];

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

하지만 더 간편한 다른 메소드들이 존재하기 때문에 권장되는 방법은 아니다.



  1. clone() 메서드 사용
int[] a = {1, 2, 3,};
int[] b = a.clone();

두 번째는 clone() 메서드를 이용하여 매우 간단하게 깊은 복사를 하는 방법이다. 하지만 2차원 이상의 다차원 배열에서는 clone() 메서를 사용해봤자 얕은 복사가 되기 때문에 이 역시 권장되는 방법은 아니다.



  1. Arrays.copyOf() 메서드 사용
int[] a = {1, 2, 3,};
int[] b = Arrays.copyOf(a, a.length) // 배열, 배열 길이 파라미터로 주입

Arrays에서 제공하는 copyOf() 메서드를 사용하면 해당 배열을 복사한 새로운 배열을 리턴해준다. 이제 이렇게 리턴된 배열을 새로운 변수에 담기만 하면 깊은 복사는 완료되어 똑같은 배열을 담고 있는 변수가 하나 더 추가된다. 특별한 단점이 없기 때문에 배열에 관해 깊은 복사할 시 가장 권장되는 방식이다.





char ⬌ String

String → char[ ] 변환

String str = "ABCDE";

char[] strCharArray = str.toCharArray(); 

System.out.println(strCharArray) // {'A', 'B', 'C', 'D', 'E'}

String을 String 클래스의 toCharArray() 메서드를 이용하면 char 배열로 변환할 수 있다.



char[ ] → String 변환

char[] charArray = {'A', 'B', 'C', 'D', 'E'}


String charArrayString = new String(charArray);

System.out.println(charArrayString) // "ABCDE"

new String()에 파라미터로 char 배열을 주입하면 String으로 변환된다.

profile
알고리즘, 자료구조 블로그: https://gyun97.github.io/

0개의 댓글