Java 배열

Jinny·2022년 1월 9일
0

TIL

목록 보기
18/28
post-thumbnail

배열

같은 자료형의 변수 여러 개를 하나의 묶음으로 만들어 하나의 이름으로 다루는 것을 배열이라고 한다.
자바에서는 배열 공간은 자유 메모리 영역인 Heap 영역에 할당하도록 지정되어 있으며, 배열변수는 할당된 배열공간의 주소를 저장하며, 배열공간의 주소를 이용해 인덱스(순번, index)를 참조하는 방식으로 값들을 처리하도록 정해두었다.

배열 선언

배열공간의 주소 저장용 참조(Reference) 변수를 만드는 것

💡 자료형[] 배열명; // int[] arr; 자료형 배열명[]; // int arr[];

배열 생성

Heap 영역에 값을 저장하는 변수들을 연속 나열 할당하고, 발생한 배열 공간의 시작주소를 선언된 배열 레퍼런스에 대입한다.

💡 배열참조변수 = new 자료형 [배열크기];

배열의 선언과 생성

💡 자료형[] 배열명 = new 자료형[배열크기]; 자료형 배열명[] = new 자료형[배열크기]; // int[] arr = new int[3]; // int arr[] = new int[3];

배열의 초기화

💡 자료형[] 배열명 = {값1, 값2, 값3, ... }; 자료형[] 배열명 = new 자료형[] {값1, 값2, 값3, ... };
  • 인덱스를 이용한 초기화
arr[0] = 1;
arr[1] = 2;
  • for문을 이용한 초기화
for(int i = 0; i < arr.length; i++) {
   arr[i] = i;
}
  • 선언과 동시에 초기화
int[] arr = {1, 2, 3, 4, 5};
int[] arr = new int[] {1, 2, 3, 4, 5};
// arr[0] = 1; 
// arr[1] = 2; ...
String fruit[] = {”사과”, “포도”, “참외”};
// fruit[0] = “사과”;
// fruit[1] = “포도”;
// fruit[2] = “참외”;

얕은 복사

객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것

💡 int[] arr1 = new int[4]; int[] arr2 = arr1;
public void ShallowCopy() {
		String originArr[] = {"Apple", "Banana", "Orange"};
		String destArr[]; // 배열의 주소 복사용 배열 레퍼런스 선언
		
		destArr = originArr; // 주소 복사
		
		for(int i = 0; i < 3; i++) {
			System.out.println(originArr[i] + " : " + destArr[i]);
		}
		System.out.println("================");
		
		originArr[1] = "Pineapple"; // 원본 배열 2번째 인덱스의 값 수정
		
		for(int i = 0; i < 3; i++) {
			System.out.println(originArr[i] + " : " + destArr[i]);
		}
	}

// 결과
Apple : Apple
Banana : Banana
Orange : Orange
================
Apple : Apple
Pineapple : Pineapple
Orange : Orange

얕은 복사는 원본 배열의 값을 바꾸면, 복사한 배열의 값도 같이 바뀐다.

깊은 복사

새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것

  • for문을 이용한 복사
💡 for(int i = 0; i < arr1.length; i++) { arr2[i] = arr1[i]; }
public void DeepCopy() {
		String originArr[] = {"Apple", "Banana", "Orange"};
		String destArr[];
		
		destArr = new String[originArr.length];
		
		for(int i = 0; i < originArr.length; i++) {
			destArr[i] = originArr[i];
		}

    originArr[1] = "Pineapple";
		
		for(int i = 0; i < originArr.length; i++) {
			System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
		}
 	}

// 결과
0 : Apple, Apple
1 : Pineapple, Banana
2 : Orange, Orange

깊은 복사는 원본 배열의 값을 바꿔도 복사한 배열의 값은 바뀌지 않는다.

  • arraycopy() 함수를 이용한 복사
💡 System.arraycopy(src, srcPos, dest, destPos, length); // 매개변수(src : 원본 배열, src : 원본 배열 시작 인덱스, dest : 복사할 배열, destPos : 복사할 배열 시작 인덱스, length : 복사할 길이)
public void ArrayCopy() {
		String originArr[] = {"Apple", "Banana", "Orange"};
		String destArr[] = new String[originArr.length];
		
		System.arraycopy(originArr, 0, destArr, 0, originArr.length);
		
		for(int i = 0; i < destArr.length; i++) {
			System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
		}
	}

// 결과
0 : Apple, Apple
1 : Banana, Banana
2 : Orange, Orange
  • Arrays.copyOf() 함수를 이용한 복사
💡 Arrays.copyOf(original, newLength);
import java.util.Arrays;

public void ArraysCopyOf() {
		String originArr[] = {"Apple", "Banana", "Orange"};
		String destArr[] = new String[originArr.length];
		
		destArr = Arrays.copyOf(originArr, originArr.length);
		
		for(int i = 0; i < destArr.length; i++) {
			System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
		}
	}

// 결과
0 : Apple, Apple
1 : Banana, Banana
2 : Orange, Orange
  • clone() 함수를 이용한 복사
public void cloneCopy() {
		String originArr[] = {"Apple", "Banana", "Orange"};
		String destArr[] = new String[originArr.length];
		
		destArr = originArr.clone();
		
		for(int i = 0; i < destArr.length; i++) {
			System.out.println(i + " : " + originArr[i] + ", " + destArr[i]);
		}
	}

// 결과
0 : Apple, Apple
1 : Banana, Banana
2 : Orange, Orange

2차원 배열

자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열이 존재한다.
2차원 배열은 할당된 공간마다 인덱스 번호가 두 개 부여된다.(앞 번호는 행, 뒷 번호는 열([0][0]))

2차원 배열의 선언

💡 자료형[][] 배열명; 자료형 배열명[][]; 자료형[] 배열명[];

2차원 배열의 할당

💡 자료형[][] 배열명 = new 자료형[행크기][열크기]; 자료형 배열명[][] = new 자료형[행크기][열크기]; 자료형[] 배열명[] = new 자료형[행크기][열크기]; // int[][] arr = new int[3][4]; int arr[][] = new int[3][4];

2차원 배열의 초기화

💡 자료형 배열명[][] = { {0행0열값, 0행1열값, ... }, {1행0열값, 1행1열값, ...}, ... };
  • 인덱스를 이용한 초기화
arr[0][0] = 1;
arr[1][1] = 2;
  • for문을 이용한 초기화
for(int i = 0; i < arr.length; i++) {
   for(int j = 0; j < arr[i].length; j++) {
       arr[i][j] = j;
   }
}
  • 선언과 동시에 초기화
int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int[][] arr = new int[][] {{1, 2, 3, 4}, {5, 6, 7, 8}};
String fruit[][] = {{"사과", "딸기", "석류"}, {"바나나", "참외", "레몬"}};
  • 가변배열 초기화
public void TestTwoVriableArray() {
		int score[][] = new int[3][]; // 가변배열
		score[0] = new int[] {1, 2, 3, 4, 5};
		score[1] = new int[] {12, 24, 36};
		score[2] = new int[] {11, 22, 33, 44};
		
		for(int i = 0; i < score.length; i++) {
			for(int j = 0; j < score[i].length; j++) {
				System.out.print(i + "행" + j + "열 : " + score[i][j] + "\t");
			}
			System.out.println();
		}
	}

// 결과
00: 1	01: 2	02: 3	03: 4	04: 5	
10: 12	11: 24	12: 36	
20: 11	21: 22	22: 33	23: 44
profile
코린이

0개의 댓글