천천히 빛나는

Java 기초 : 배열 본문

JAVA/JAVA

Java 기초 : 배열

까만콩 •ᴥ• 2023. 7. 27. 16:02

배열

동일한 자료형(Data Type)의 묶음

배열은 heap 영역에 new연산자를 통해 할당된다

 

1차원 배열

int[] arr = new int[5];

1차원 배열을 선언하고 할당하는 코드이다

변수 arr는 stack에 쌓이고, 배열 공간은 heap에 존재하게 된다

int 배열 값은 기본적으로 0으로 저장된다

for(int i = 0; i < 5; i++) {
	arr[i] = i * 10;
}

int 형 5칸의 배열에 각각 값을 대입하는 작업을 반복문을 활용하여 구현할 수 있다

System.out.println(Arrays.toString(arr));

 

배열 값을 한번에 출력할 수 있는 코드이다. 즉, [0, 10, 20, 30, 40]가 출력된다

 

int [] iArr;
char cArr[];
Sring[] strArr;

선언은 stack에 배열의 주소를 보관할 수 있는 공간을 만드는 것이다

iArr = new int[5];
cArr = new char[10];

선언한 참조형 변수에 배열을 할당하여 대입할 수 있다. new 연산자는 heap 영역에 공간을 할당하고 발생한 주소값을 반환하는 연산자이다. 

int[] iArr2 = new int[4];
char[] cArr2 = new int[3];

선언과 할당을 동시에 할 수도 있다

int[] arr = new int[5];
System.out.println("arr 주소: " + arr.hashCode());
System.out.println("arr 길이: " + arr.length);

hashCode(): 주소를 10진수로 변환하여 확인할 수 있다

length: 배열의 크기를 확인할 수 있다. string의 length()에서 배열은 ()이 없다

 

Scanner sc = new Scanner(System.in);
System.out.print("배열의 크기를 입력해주세요: ");
int size = sc.nextInt();

double[] dArr = new double[size];
System.out.println("배열 크기: " + dArr.length);
System.out.println("배열의 주소: " + dArr.hashCode());

배열의 크기를 입력받고 선언 및 할당해주는 코드이다.

참조형의 기본값은 null이고 int는 0, double 0.0이다. 그러므로 dArr은 0.0으로 초기화되어있다.

 

int[] iArr2 = new int[] {22, 33, 44, 55};

선언, 할당, 초기화를 한 줄로 구현할 수도 있다

 

 

2차원 배열

int[][] iArr = new int[2][3];

intArr[0], intArr[1]은 참조형 변수가 된다

 

double[][] dArr = new double[5][3];
System.out.println("dArr: " + dArr);
System.out.println("dArr[0]: " + dArr[0]);
System.out.println("dArr[0]: " + dArr[0][0]);

int[] iArr = new int[6];
double[][] dArr = new double[2][3];
System.out.println("iArr: " + Arrays.toString(iArr));
System.out.println("dArr: " + Arrays.toString(dArr));
System.out.println("iArr: " + iArr);
System.out.println("dArr: " + dArr);
System.out.println("dArr[0]: " + dArr[0]);

 

int[][] iArr = new int[3][];
iArr[0] = new int[3];
iArr[1] = new int[2];
int[] arr = new int[5];
iArr[2] = arr; // 미리 할당된 1차원 배열 사용

for(int i=0; i<iArr.length; i++){
	for(int j=0; j<iArr[i].length; j++){
		iArr[i][j] = i*j;
	}
}

가변 배열을 선언 및 할당하고 값을 대입하는 코드이다

 

 

 

배열의 복사

얕은 복사

stack에 저장되어 있는 배열의 주소값만 복사하는 것이다. 따라서 참조형 변수 arr1과 arr2는 동일한 배열의 주소값을 가지게 된다

하나의 참조형 변수에 저장된 주소값을 가지고 배열이 내용을 수정하면 다른 참조형 변수로 배열에 접근했을때 변경된 값을 가지게 된다

 

int[] originArr = {1, 2, 3, 4, 5};
int[] copyArr = originArr;
System.out.println("originArr: " + originArr);
System.out.println("copyArr: " + copyArr);

 

깊은 복사

heap에 생성된 배열이 가지고 있는 값을 또 다른 배열에 복사를 해놓은 것이다. 서로 같은 값을 가지지만 두 배열은 서로 다른 값을 가지게 된다.

 

int[] originArr = {1, 2, 3, 4, 5};
int[] copyArr = new int[originArr.length];

for (int i = 0; i<copyArr.length; i++){
	copyArr[i] = originArr[i];
}
int[] copyArr2 = originArr.clone();
        
int[] copyArr3 = new int[10];
System.arraycopy(originArr, 1, copyArr3, 4, 2); // copyArr3의 4번부터, 원본의 1번 인덱스 부터 2개 복사 (2, 3)

int[] copyArr4 = Arrays.copyOf(originArr, 3); // 처음부터 3개 복사 (1, 2, 3)

static 끼리는 new 연산자 없이 바로 호출이 가능하므로 arraycopy도 static 메소드임을 추측할 수 있다

https://shine-slowly.tistory.com/14

 

Java 기초 : 메소드와 API

메소드 (method) 어떤 특정 작업을 수행하기 위한 명령문의 집합 (함수와 비슷하다) 중복되는 코드를 메소드로 만들어 코드의 반복 사용을 피할 수 있다. public static void main(String[] args) { // main method

shine-slowly.tistory.com

 

 

'JAVA > JAVA' 카테고리의 다른 글

Java 기초 : 객체  (0) 2023.07.28
Java 기초 : 정리본 (1)  (0) 2023.07.27
Java 기초 : 제어문  (0) 2023.07.25
Java 기초 : 메소드와 API  (0) 2023.07.25
Java 기초 : 변수  (0) 2023.07.21