[Java]-기초 배열(Array)

J._.n·2024년 7월 4일

[Java]

목록 보기
5/10
post-thumbnail

배열이란?

자료형이 동일한 둘 이상의 데이터를 저장할 수 있는 메모리 공간으로,
배열은 참조 변수로 Stack영역에 할당되며 배열 공간의 주소를 저장하고, 주소를 통해 인덱스를 참조하는 방식으로 값을 처리한다.
실제 값은 Heap영역에 존재한다.

참조 변수(레퍼런스 변수)란?
주소값을 담고 있는 변수

배열 선언 및 할당

배열을 선언과 할당하게 되면 참조 변수를 만들고 참조 변수에 실제 값들이 들어이 있는 Heap영역에 선언된 배열의 [0]인덱스의 주소를 가진다.
배열의 크기를 지정하여 선언하지 않으면 Heap 영역의 실제 메모리를 차지하고 있는 것이 아니다.
크기를 지정하여 선언하게 되면 자동으로 초기화 한다.
기본 자료형 배열의 경우 모든 요소를 '0'으로 초기화
String의 경우 null로 초기화

int[] arr = new int[5];   // 배열선언

int[] arr = {1,2,3,4,5};  // 선언과 동시에 할당
int[] arr = new int[5] {1,2,3,4,5} // 선언과 동시에 할당

배열 추가 및 접근 방법

배열에 접근하는 건 인덱스를 사용한다.
[표현법]
배열명[인덱스]

	int[] arr = new int[4]
    arr[0] = 1;
    arr[1] = 2;
    arr[2] = 3;
    arr[3] = 4;
    for(int i = 0; i < arr.length; i++){
    	System.out.print(arr[i] + " ");
    }

[출력]

1 2 3 4

int형 배열을 사용한 예제

[예제]
사용자에게 배열의 길이를 입력받아 해당 길이의 정수형 배열 arr을 생성한다.
arr 모든 인덱스값에 1~100사이의 랜덤값을 할당해주고
arr에 모든 값을 출력한 후
이중 짝수인 값의 총 합을 구해서 출력

import java.util.Scanner;
public class A_Array3 {
	public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
		System.out.print("정수 입력 : ");
        int size = scanner.nextInt();
        int sum = 0;
        scanner.nextLine();
        int[] arr = new int[size];
        for(int i =0; i<arr.length;i++){
            arr[i] = (int)(Math.random() * 100) + 1;
        }
        for(int i =0; i< arr.length;i++){
            System.out.println(arr[i]);
        }
        for(int i = 0; i < arr.length ;i++){
            if(arr[i] % 2 == 0){
                sum += arr[i];
            }
        }
        System.out.println("짝수의 총합 : " + sum);
        scanner.close();
	}
}

String형 배열, Character형 배열 사용 예제

[예제]
문자열을 입력 받아 문자 하나하나를 배열에 넣고 검색할 문자가 문자열에 몇 개 들어가 있는지 개수와
몇 번째 인덱스에 위치하는지 인덱스를 출력하세요.
[출력]
문자열 : application
문자 : i
application에 i가 존재하는 위치(인덱스) : 4 8
i의 개수 : 2

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = 0;

        System.out.print("문자열 : ");
        String str = scanner.nextLine();

        Character[] chr = new Character[str.length()];
        for(int i = 0; i < str.length(); i++){
            chr[i] = str.charAt(i);
        }

        System.out.print("문자 : ");
        Character findChar = scanner.next().charAt(0);
        System.out.print(str + "에 "+  findChar + "가 존재하는 위치(인덱스) : ");

        for(int i = 0; i < chr.length; i++){
            if(chr[i] == findChar){
                System.out.print(i + " ");
                count++;
            }
        }
        System.out.println();
        System.out.println(findChar + " 개수 : " + count);
        scanner.close();
    }

배열 복사

배열 자료형의 가장 큰 단점은 배열의 크기가 고정이라는 것이다. 배열 복사를 통해 이 부분을 해결할 수 있다.

얕은 복사

객체의 레퍼런스 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 참조형 변수가 참조하게 만드는 것이다.

int[] arr1 = new int[4];
int[] arr2 = aar1;

스택 영역에 참조형 변수 arr1과 arr2는 힙 영역의 같은 배열을 참조하고 있어 arr2에 값을 변경하여도 arr1의 배열에 값도 변경된다.

깊은 복사

배열에 새로운 값을 넣을 때 배열의 크기가 가득찬 경우 크기를 늘린 새로운 배열에 기존 배열의 내용을 복사하여 사용할 수 있다.

// 방법 1
System.arraycopy([원본 배열], [원본 배열의 복사 시작 인덱스], [대상 배열], [대상 배열의 복사할 시작 인덱스], [복사할 개수]);
// 방법 2
새로운 배열 = Arrays.copyOf([기존 배열], [새로운 배열의 크기]);

추가적으로 크기를 조정할 순 없지만 객체를 그대로 복사하는 .clone() 메서드가 있다.

새로운 배열 = [기존 배열].clone();

int[] arr1 = {1,2,3,4};
int[] arr2 = new int[10];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
// {1, 2, 3, 4, 0, 0, 0, 0, 0, 0}

int[] arr3 = Arrays.copyOf(arr1, arr1.length + 1);

int[] arr4 = new int[10];
arr4 = arr1.clone();
profile
개발자를 꿈꾸는 대학생

0개의 댓글