배열 변수간에 대입연산자 "=" 를 사용해서 복사하면 주소값만 복사된다.
주소값만 복사되고 실제값은 1개로 유지되는 걸 얕은 복사 라고한다.
int[] a = {1,2,3,4};
int[] b = a; // 얕은복사
b[0] = 3; // b 배열의 0번째 순번값을 3번으로 수정 (1 → 3)
System.out.println(a[0]); // 출력 3 이때 a배열의 0번째 순번값 1도 3으로 조회된다.
이는 a와 b 모두 값이 바뀌게 됨으로 바람직하지 않은 복사라고 볼 수 있다.
실제 값을 가지고 있는 배열의 기본형 값을 꺼내어 복사하면 된다.
반복문 for문을 통해 하나씩 꺼내서 복사하는 방법과 여러 매서드를 사용하는 방법이 있다.
// 깊은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length]; // 이때 b는 a의 배열 수만큼 가짐 {0,0,0,0}으로 int 초기화된 값
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 배열은 그대로 입니다.
int[] a = {1,2,3,4};
int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어준다. ※ Arrays.copyOf()매서드가 사용되었다.
a[3] = 0;
System.out.println(a[3]);
System.out.println(b[3]);
출력값: 0, 4
깊은 복사 매서드(Arrays.copyOf)를 통해 배열 a와 b의 값이 아예 다른 값을 가지게 되었다.
String str = "ABCD";
// (1)length 기능
int strLength = str.length();
System.out.println(strLength);
// (2) charAt(int index)
char strChar = str.charAt(1);
System.out.println(strChar);
// (3) substring(int fromIdx, int toIdx)
String strSub = str.substring(0, 3); // 0번째부터 3번째 전까지 자르는 것
System.out.println(strSub);
// (4) equals(String str) →문자열 A와 B가 일치한지 boolean 값으로 알려주는 것
String newStr = "ABCE";
boolean strEqual = newStr.equals(str);
System.out.println(strEqual);
// (5) toCharArray() : String → char[] 로 변환하는 것
char[] strCharArray = str.toCharArray();
// (6) char[] → String → char
char[] charArray = {'A','B','C'};
String charArrayString = new String(charArray);
System.out.println(charArrayString);
여러 기능들이 있으므로 한번씩 복습하면서 알 수 있도록 해봐야겠다.