1. 얕은 복사
- 참조형 변수가 가지고 있는 "주소"만 복사하는 것
- 서로 다른 변수가 같은 배열/객체를 참조하기 때문에
같은 값을 공유!!!
ex)
// 원본 배열
int[] arr = {10,20,30,40,50};
// 얕은 복사한 배열 선언
int[] copyArr = arr;
#예제
[기능]
package ex;
import java.util.Arrays;
public class ArrayEx2 {
public void method1() {
// 원본 배열
int[] arr = {10,20,30,40,50};
// 얕은 복사한 배열 선언
int[] copyArr = arr;
System.out.println("[변경 전]");
System.out.println("arr : " + Arrays.toString(arr));
System.out.println("copyArr : " + Arrays.toString(copyArr));
// 복사한 배열의 값 변경
copyArr[3] = 4444;
copyArr[4] = 5555;
System.out.println("[변경 후]");
System.out.println("arr : " + Arrays.toString(arr));
System.out.println("copyArr : " + Arrays.toString(copyArr));
// 복사한 배열을 수정 했지만
// 원본도 같이 수정됨
// -> 얕은 복사는 주소만 복사해서
// 같은 배열을 참조하게 만들어 값을 공유함
}
[실행]
package run;
import ex.ArrayEx2;
public class ArrayRun {
public static void main(String[] args) {
ArrayEx2 ex2 = new ArrayEx2();
ex2.method1();
}
}
#결과

2. 깊은 복사
- 원본 배열/객체가 가지고 있는 값을 똑같이 복사한 배열/객체를 만드는 것
(복제의 개념)
- 새로운 배열/객체가 만들어 지는 것으로 원본과는 독립되어 있음
→ 값을 공유하지 않는다.
ex)
// 원본 배열
int[] arr = {10, 20, 30, 40, 50};
// 깊은 복사 1 : for문 이용
int[] copyArr = new int[arr.length]; // 원본 크기 새 배열 생성
[기능]
public void method2() {
// 원본 배열
int[] arr = {10, 20, 30, 40, 50};
// 깊은 복사 1 : for문 이용
int[] copyArr = new int[arr.length]; // 원본 크기 새 배열 생성
// 원본 배열 요소의 값을
// 같은 인덱스의 복사된 배열 요소에 대입
for(int i = 0 ; i < arr.length ; i++) {
copyArr[i] = arr[i];
}
// 깊은 복사 2 : System.arraycopy() 이용
// System.arraycopy(원본 배열명, 원본 복사 시작 인덱스,
// 복사 배열명, 복사 배열의 삽입 시작 인덱스,
// 복사 길이)
int[] copyArr2 = new int[arr.length];
System.arraycopy(arr, 0, copyArr2, 0, arr.length);
// 원본, 복사1, 복사2의 0번 인덱스 값은 변경
arr[0] = 11111;
copyArr[0] = 22222;
copyArr2[0] = 33333;
System.out.println("arr : " + Arrays.toString(arr));
System.out.println("copyArr : " + Arrays.toString(copyArr));
System.out.println("copyArr2 : " + Arrays.toString(copyArr2));
}
[실행]
package run;
import ex.ArrayEx2;
public class ArrayRun {
public static void main(String[] args) {
ArrayEx2 ex2 = new ArrayEx2();
ex2.method2();
}
}
#결과

3. 향상된 for문 (forEach)
- 0번 인덱스 부터 마지막 인덱스까지 1씩 증가하여 terable 성격을 띄는 객체의 요소를
하나씩 순서대로 반환하는 for문
* iterable : 반복 가능한
ex) 배열, List, Set, Map 등
[작성법]
for(배열 요소 자료형의 변수 : 배열명){
ex)
int[] arr = new int[3];
for( int num : arr ){
=> num은 for문이 반복 될때마다 arr[0], arr[1], arr[2] 인덱스 값이
순차적으로 대입됨
#예제1
[기능]
public void method3() {
int[] arr = {10, 20, 30, 40};
//향상된 for문
for(int num : arr) {
System.out.println(num);
}
// 일반 for문
System.out.println("----------------------------------");
for(int i = 0 ;i < arr.length ; i++) {
System.out.println(arr[i]);
}
}
[실행]
package run;
import ex.ArrayEx2;
public class ArrayRun {
public static void main(String[] args) {
ArrayEx2 ex2 = new ArrayEx2();
ex2.method3();
}
}
#결과

#예제2
|
향상된 for문을 이용한 배열 요소 순차 접근(== 반복접근)
|
[기능]
public void method4() {
char[] arr = {'홍', '길', '동'};
for(char ch : arr) { // 향상된 for문
System.out.printf("%c의 유니코드 : %d \n", ch, (int)ch );
}
}
[실행]
package run;
import ex.ArrayEx2;
public class ArrayRun {
public static void main(String[] args) {
ArrayEx2 ex2 = new ArrayEx2();
ex2.method4();
}
}
#결과

4. 2차원 배열
- 1차원 배열을 묶음으로 다루는 것
→ 1차원 배열을 참조하는 참조형 변수의 묶음
[작성법]
( [ ] : 1차원 배열)
자료형[ ][ ] 배열명 = new 자료형[크기][크기];
#예제
[기능]
public void method5() {
// 2차원 배열 선언/ 할당
int[][] arr = new int[2][3];
// 2차원 배열 초기화
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;
// 출력
System.out.println(arr[0]); // 1차원 배열의 해시코드(주소)
System.out.println(arr[1]); // 1차원 배열의 해시코드(주소)
// arr[0]가 참조하는 객체/배열이 int[] 자료형인가?
System.out.println(arr[0] instanceof int[]); //true
[기능] for문으로 모든 요소 출력하기1 (일반 for문)
for(int row = 0 ; row < arr.length ; row++) { // 행 제어
for(int col = 0 ; col < arr[row].length ; col++) { // 열 제어
System.out.print(arr[row][col] + " ");
}
System.out.println(); //줄바꿈
}
[기능] for문으로 모든 요소 출력하기2 (향상된 for문)
for(int[] row : arr) { // 행을 하나씩 순차 접근
for(int col : row) { // 각 행의 열을 하나씩 순차 접근
System.out.print(col + " ");
}
System.out.println(); // 줄바꿈
}
[실행]
package run;
import ex.ArrayEx2;
public class ArrayRun {
public static void main(String[] args) {
ArrayEx2 ex2 = new ArrayEx2();
ex2.method5();
}
}
#결과

'BackEnd > Java' 카테고리의 다른 글
| [Java]OOP_클래스 (1) | 2024.07.23 |
|---|---|
| [Java]객체지향언어(OOP) 정의 및 Account (0) | 2024.07.23 |
| [Java]배열(Array) (0) | 2024.07.21 |
| [Java]Control 조건문(Loop2) (0) | 2024.07.21 |
| [Java]Control 조건문(Loop1) (0) | 2024.07.21 |