본문 바로가기

스터디/JAVA

[JAVA] 배열

[배열의 개념]

'배열이란 동일한 타입의 자료형끼리만 사용이 가능하고 순차적인 자료 구조를 띄고 있다.

변수는 어떠한 값을 저장해서 사용하는 게 전부이지만, 배열은 인덱스연산자[]를 통해 보다 빠른 참조가 가능한 자료형이다.

그리하여 배열은 같은 타입의 값들을 배열이라는 곳에 모아 데이터를 구조적으로 다루는데 도와준다.

배열을 구성하는 각 값들은 요소(element)라고 하며, 해당 요소의 위치를 인덱스(index)라고 한다.

배열에는 1차원 배열과 2차원 배열 2가지가 존재한다.

 

[배열의 선언 & 초기화]

배열은 처음에 선언해줄때 꼭 배열의 크기를 정해주어야 한다.

int[] num = new int[5];				 // 기본 초기화 방법

int[] num = {1,2,3,4,5};			// num이라는 객체를 선언과 동시에 초기화

int[] num = new int[] {1,2,3,4,5);	// 선언후 배열을 생성

 

이처럼 배열을 초기화 해주는 방법은 3가지가 존재한다.

자료형 참조변수 = new 자료형[배열의 크기 지정];   으로 이루어진다.

 

자료형 = char, byte, int, float, double, long 등

참조변수  = 객체의 주소를 가리키는 변수

new  = 필드의 값들이 임의의 메모리에 저장시킨다.

자료형 [배열의 크기] = 해당 자료형에 지정한 배열의 크기로 초기화시킨다.

 

배열을 선언할 때 주의사항은 다음과 같다.

  1. 선언한 자료형 배열에 다른 자료형의 값을 할당하면 안 된다.
  2. 지정한 배열의 크기가 넘는 값을 할당하면 오류가 발생한다.
  3. 배열의 인덱스는 1이 아닌 0부터 시작하므로 범위를 초과하지 않도록 주의해야 한다.
  4. 배열의 크기는 생성과 동시에 결정되며, 중간에 크기를 변경할 수 없다.
int[] num = {1,2,3,4,5};
num[10] = 10;				// 배열의 10번째 인덱스는 없으므로 오류 발생

int[] num = new int[] {1,2,3,4,5);
System.out.println(num[10]);		// num 배열의 범위를 넘어가므로 오류 발생

[배열의 출력]

만약 내가 만든 배열의 값들을 보고 싶을 때 일반 변수를 호출할 때와는 다르다.

처럼 배열의 값이 아닌 이상한 값이 나오는 것을 확인할 수 있다.

사실 이 값은 메모리에 있는 배열의 주소값을 가리키는 것이다.

따라서 해당 값들을 for문으로 배열의 각 인덱스를 돌면서 출력시켜 주거나

자바의 내부에 존재하는 Arrays.toString()이라는 메서드를 이용하여 출력할 수 있다.

 

 

결괏값을 보면 알 수 있듯이 배열의 값이 순차적으로 나오는 것을 확인할 수 있다.

 

더보기

   다만 char타입의 배열은 예외로 println() 메서드로 바로 호출이 가능하다.


[배열의 정렬]

배열에 존재하는 값들을 오름차순으로 정렬하고 싶다면 for문을 이용하고 if문을 통해 인덱스에 존재하는 값들을 비교하면서 정렬해도 되지만 메서드를 사용하는 것보다 비효율적이다.

배열을 정렬하는 방법은 정말 간단하다.

int num = {20, 15, 30, 24, 80};

int result = Arrays.sort(num);
System.out.println("result : " + result);

일 때 자바의 내부 메서드인 Arrys.sort(정렬할 변수); 를 해주면 된다.

결괏값은 result : 15, 20, 24, 30, 80 가 나오게 된다.


[배열의 복사]

배열은 한번 초기화하고 나면 크기를 변경할 수 없다고 했었다.

만약 배열의 공간이 부족해진다면 어떻게 해야 할까?

 

 

해결방법은 기존에 존재하던 배열보다 더 큰 배열을 생성하고 새로운 배열을 생성하여 기존에 있던 배열을 복사하면 된다.

하지만 이런 과정은 귀찮기도 하고 코드가 더 복잡해 보일 수 있기 때문에 처음부터 배열의 크기를 넉넉하게 만들고

사용하는 것이 베스트다.

배열을 복사하는 방법은 다음과 같다. 

 

1) for문으로 하나씩 할당

import java.util.Arrays;

class Example{
	public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4, 5};
	int[] arr2 = new int[arr1.length * 2]; // 초기배열의 2배 큰 배열 생성
        
        // for문을 이용하여 인덱스 하나씩 할당
        for(int i = 0 ; i < arr1.length ; i++) { // arr1의 길이만큼 반복문 실행	
            arr2[i] = arr1[i];	// arr1배열의 원소값을 순회하며 arr2배열에 저장
        }
        arr1 = arr2; // 원래의 배열을 가리키고있던 참조변수 arr1이 새로 복사된 arr2 배열을 가리키도록 한다.
	}
}

 

2) Arrays.copyOf() 메서드 사용

import java.util.Arrays;

class Example{
	public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4, 5};
	int[] arr2 = new int[arr1.length * 2]; // 초기배열의 2배 큰 배열 생성
        
        // arr1의 index의 0부터 arr1.length 전체 길이 만큼을 arr2의 0번째 인덱스부터 붙여넣는다.
        System.arraycopy(arr1, 0, arr2, 0, arr1.length);
        
        arr1 = arr2; // 원래의 배열을 가리키고있던 참조변수 arr1이 새로 복사된 arr2 배열을 가리키도록 한다.
	}
}

 


[배열값 비교]

만약 다른 배열끼리 같은 값을 가지고 있는지 궁금하다면 어떻게 해야 할까?

바로 equals()라는 메서드를 이용하면 된다.

equals() 메서드는 보통 String 자료형일 때 문자열에 내가 원하는 값이 존재하는지 확인할 때 많이 사용된다.

사용 방법은 아래와 같다.

import java.util.*;

public class Example {
	public static void main(String[] args) {
    	int[] a = {50, 6, 10, 20, 45};
    	int[] b = {50, 6, 10, 20, 45};
        if (Arrays.equals(a, b)) {
        	System.out.println("a 배열과 b 배열의 값이 동일합니다.");
        }else {
        	System.out.println("a 배열과 b 배열의 값이 일치하지 않습니다.");
              }
	}
}

 

Arryas.equals(비교할 배열)을 넣어주면 된다.

 


[2차원 배열]

1차원 배열이 1열로 쌓이는 공간이라면 2차원 배열은 행도 쌓이고 열도 쌓인다고 생각하면 좋다. 즉 행열이라고 생각하면 된다.

2차원 배열을 많이 쓰이지는 않지만 그래도 한번 알아보자.

2차원 배열을 선언하는 방법은 다음과 같다.

public static void main(String[] args) {

	int[][] array = new int[5][5];	// 세로(열)5줄, 가로(행) 5줄을 만들겠다. 5*5배열 생성
    	// 세로(열)2줄, 가로(행) 3줄을 만들겠다. 2*3배열 생성 및 해당 배열에 1 ~ 6의 값할당
        int[][] array = {{1,2,3}, {4,5,6}} 
}

보통 2차원 배열을 선언과 동시에 초기화하는 방법을 많이 사용한다.

 

만약 내가 원하는 인덱스에 값을  할당하고 싶다면 해당 인덱스를 지정해 주면 된다.

public static void main(String[] args) {

	int[][] array = new int[5][5];	// 세로(열)5줄, 가로(행) 5줄을 만들겠다. 5*5배열 생성
    	array[2][0] = 5;
        array[2][1] = 10;
        array[2][2] = 15;
        array[2][2] = 20;
}

 

 

[핵심 요약]

  • 배열은 동일한 타입의 값을 담을 때 사용한다.
  • 인덱스 기반으로 접근하기 때문에 빠르게 접근할 수 있다.
  • 배열을 생성 시 크기가 고정되므로 요소의 추가나 삭제가 어렵다.
  • 연속된 메모리 공간에 값을 저장하기 때문에 요소의 삽입이나 삭제가 발생하면 메모리를 재배치해야한다.

 

 

 

출처 :https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4Array-%EB%AC%B8%EB%B2%95-%EC%9D%91%EC%9A%A9-%EC%B4%9D%EC%A0%95%EB%A6%AC

'스터디 > JAVA' 카테고리의 다른 글

[JAVA] 컬렉션  (1) 2024.02.18
[JAVA] Thread  (0) 2024.02.15
[JAVA] 상속  (0) 2024.02.12
[JAVA] 클래스  (1) 2024.02.03
[JAVA] 변수와 타입  (0) 2024.01.29