java 배열

moonseungha·2022년 12월 11일
0

📌배열

  • Stack영역에 주소값을 담는 변수(== 참조 변수 == 레퍼런스 변수)
  • 같은 자료형의 변수 여러개를 하나의 묶음으로 다루는 것
  • 저장된 값마다 인덱스 번호(0부터 시작)가 설정
  • 장점 : 반복문 활용 가능

📌배열의 선언

package 선언부
Class 작성부
	method 작성부
    	자료형[] 배열명;
        
        자료형 배열명[];
        
        int[] arr;

📌배열의 할당

package 선언부
Class 작성부
	method 작성부
    	배열명 = new 자료형[배열의 크기];
        
        arr = new int[3];

📌배열 선언과 동시에 할당

package 선언부
Class 작성부
	method 작성부
    	자료형[] 배열명 = new 자료형[배열의 크기];
        자료형 배열명[] = new 자료형[배열의 크기];
        
        int[] arr = new int[3];

📌배열 초기화

  • 배열은 할당만 한 상태여도 기본값으로 초기화가 되어있음
    Heap영역에는 빈공간이 존재할 수 없기때문에 JVM이 기본값(Null)을 초기화해줌

- 인덱스를 이용한 초기화

package 선언부
Class 작성부
	method 작성부
    	배열명[인덱스] = 값;
        
        arr[0] = 1;
        arr[1] = 2;
        arr[2] = 3;

- for문을 이용한 초기화

package 선언부
Class 작성부
	method 작성부
    	for(int i=0; i<arr.length(); i++) {
        	arr[i] = i + 1;
        }

- 선언과 동시에 초기화

package 선언부
Class 작성부
	method 작성부
    	int[] arr = {1, 2, 3};
        
        int[] arr = new int[] {1, 2, 3};

📌배열 저장구조

  • 배열은 참조변수로 Heap영역에 할당되며 Stack영역에는 배열 공간의 주소를 저장
  • 배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값 처리

실행 순서
1. int[] arr
2. new int[4];
3. = (대입 연산자)

📌배열의 단점

  • 한번 지정된 배열의 크기 변경 불가

📌자바의 자동 메모리 관리

  • 연결이 끊긴 배열은 일정 시간이 지나면 "가비지컬렉터(GC)"가 삭제
    따라서 배열을 강제로 삭제하려면 연결을 끊으면 됨
package 선언부
Class 작성부
	method 작성부
    	int[] arr = {1, 2, 3};
        
        arr = null;

📌배열 얕은 복사

  • 객체의 주소값만 가져와 참조형 변수에 저장
  • 하나의 객체를 두 변수가 참조하는 것
  • 복사본 배열의 값을 변경하면 원본 배열의 값도 같이 변경됨
package 선언부
Class 작성부
	method 작성부
    	int[] arr1 = {1, 2, 3, 4};
        
        int[] arr2 = arr1;

📌배열 깊은 복사

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

- for문을 활용한 방법

  • 새로운 배열 객체 생성 후 반복문을 활용해서 기존 배열의 각 인덱스 값을 대입
package 선언부
Class 작성부
	method 작성부
    	int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = new int[5];
        
        for(int i=0; i<arr1.length; i++) {
        	arr2[i] = arr1[i];
        }

- System 클래스의 arraycopy() 메소드를 이용한 방법

  • 새로운 배열 객체 생성 후 기존 배열에서 가져오고 싶은 만큼 가져와서 새로운 객체 배열에 대입
  • 나머지 자리는 기본값으로 채움
  • System.arraycopy(기존 배열명, 복사할 시작 인덱스
                          , 새로운 배열명, 복사될 시작 인덱스, 복사할 개수);
package 선언부
Class 작성부
	method 작성부
    	int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = new int[10];
        
        System.arraycopy(arr1, 0, arr2, 0, arr1.length);
        
        for(int i=0; i<arr2.length; i++) {
        	System.out.print(arr2[i] + " "); // 1, 2, 3, 4, 5, 0, 0, 0, 0, 0
        }
        
        System.arraycopy(arr1, 2, arr2, 3, 3);
        
        for(int i=0; i<arr2.length; i++) {
        	System.out.print(arr2[i] + " "); // 0, 0, 0, 3, 4, 5, 0, 0, 0, 0
        }

- Arrays 클래스의 copyOf() 메소드를 이용한 방법

  • import java.util.Arrays; 필요
  • 새로운 배열 객체 생성 필요 없음
  • 제시한 복사할 길이가 기존 배열 크기보다 클 경우
    기존 배열에 담겨있는 값을 다 복사한 후 나머지 자리는 기본값으로 채움
  • 제시한 복사할 길이가 원본배열의 크기보다 작을경우
    기존 배열에 담겨있는 값에서 내가 제시한 복사할 길이만큼만 복사
  • 새로운 배열 = Arrays.copyOf(기존 배열명, 복사할 길이);
package 선언부
Class 작성부
	method 작성부
    	int[] arr1 = {1, 2, 3, 4, 5};
        
        int[] arr2 = Arrays.copyOf(arr1, 3);
        
        for(int i=0; i<arr2.length; i++) {
        	System.out.print(arr2[i] + " "); // 1, 2, 3
        }
        
        int[] arr2 = Arrays.copyOf(arr1, 10);
        
        for(int i=0; i<arr2.length; i++) {
        	System.out.print(arr2[i] + " "); // 1, 2, 3, 4, 5, 0, 0, 0, 0, 0
        }

- clone() 메소드를 이용한 방법

  • 새로운 배열 객체 생성하여 기존 배열의 데이터를 복사
  • 가져오고 싶은 만큼 지정하거나 기존 배열의 크기와 다른 크기로 생성 불가
package 선언부
Class 작성부
	method 작성부
    	int[] arr1 = {1, 2, 3, 4, 5};
        
        int[] arr2 = arr1.clone();
        
        System.out.println(Arrays.toString(arr2); // [1, 2, 3, 4, 5]

0개의 댓글