📖혼자공부하는자바

Chapter 05-2 배열

개발자는신이야 2022. 11. 26. 01:54

배열

1개의 데이터만 저장할 수 있는 변수는 여러 변수를 생성 하기에 너무 비효율적으로 코드가 길어진다.

배열이란, 여러 데이터를 저장해야 할 때 좀 더 효율적이고 간단하게 여러 데이터를 묶어서 저장하는 방법이다.

많은 양의 데이터를 다루는 프로그램에서 더 효율적인 방법으로 배열을 사용할 수 있다.

 

배열의 특징

  1. 배열은 같은 타입의 데이터만 저장할 수 있다.
    만약 다른 타입의 데이터 값을 저장하려고 하면 타입 불일치 컴파일 에러가 난다.
  2. 한 번 생성된 배열은 길이를 늘이거나 줄일 수 없다.
    (유동적으로 바뀌는 여러 데이터의 저장소를 만들고 싶다면 java의 List를 사용하도록 하자.)

 

배열 선언

배열을 선언하기 위해서는 우선 배열 변수를 선언해야 한다.

//example code1
int[] intArray;
String[] strArray;
char[] charArray;
double[] doubleArray;

//example code2
int intArray[];
String strArray[];
char charArray[];
double doubleArray[];

배열을 선언하는 방법은 대괄호 []를 사용하여 해당 변수가 배열 형태임을 알려줘야 한다.

위에서 보이는 것처럼 대괄호는 타입 뒤에 붙을 수도 있고 변수 뒤에 붙을 수도 있다.

 

만약 배열 변수가 null 값을 가진 상태에서 변수[인덱스]로 값을 읽거나 저장하게 되면 NullPointerException 예외가 발생한다.

 

인덱스

인덱스란 배열 안의 각 데이터에 부여해 놓는 자료구조이다.

인덱스 값을 통해 배열 안의 데이터를 특정하여 출력, 수정, 삭제 등 사용이 가능하다.

int[] intArray = {1, 2, 3, 4, 5};
//intArray[0] == 1
//intArray[1] == 2
//intArray[2] == 3
//intArray[3] == 4
//intArray[4] == 5

인덱스는 위 코드처럼 0부터 시작한다.

즉 배열 안의 첫 번째 값을 가지고 오고 싶다면 해당 배열의 0 번째 데이터를 들고 온다고 입력해야 한다.

더보기

//intArray [0] == 출력값: 1

//intArray[4] == 출력값: 4

총인덱스의 길이를 알고 싶을 땐 intArray.length로 알아낼 수 있다.

만약 선언된 인덱스의 길이 이외의 값을 받아오려고 하면 ArrayIndexOutOfBoundsException이 발생한다.

 

배열 생성

위에서 잠깐 본 코드처럼 다음과 같이 간단하게 배열 객체를 생성할 수 있다.

//타입[] 변수 = {값0, 값1, 값2, 값3, ...};
int[] intArr = {1, 2, 3, 4, ...};
String[] strArr = {"abc", "def", "ghi", ...};
char[] charArr = {'a', 'b', 'c', ...};

 

.. 이렇게 생성된 배열에서 특정 데이터 값을 바꾸고 싶다면 아래와 같이 할 수 있다.

intArr[0] = 5;
//intArr 0번째의 값 1 대신 5를 대입(변경)한다.

 

※배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않는다.

int[] intArray;
intArray - {1, 2, 3, 4, 5}; //컴파일 에러!!

 

배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면 다음과 같이 new 연산자를 사용해서 값 목록을 지정해주면 된다.

String[] names;
names = new String[] {"tomi", "andrew", "jully"};

 

당연히 메서드의 매개 값이 배열일 경우에도 마찬가지로 배열 변수들이 나중에 결정된다면 new 연산자를 사용하여 매개 값으로 넣어줘야 한다.

int add (int[] scores) {...}

int result = add( {13, 55, 75} ); //<- 컴파일 에러!!
int result = add(new int[] {13, 55, 75});

 

new 연산자로 배열 생성

만약 데이터를 배열 생성과 동시에 넣어줄 수 없을 때나 미리 배열을 만들어 놓고 나중에 데이터를 대입하고 싶을 때

new 연산자를 사용해 다음과 같이 크기만 지정되어 있고 안에 데이터 값은 없는 배열을 생성해 놓을 수 있다.

int[] intArray = new int[7]; //7의 크기를 가지고 있는 배열 생성.

여기서 주의해야 할 점은 크기는 인덱스 순서와 같지 않다. 인덱스는 0부터 시작해서 6까지 총 7개의 데이터 값을 가지는 점을 참고했을 때 인덱스 마지막인 6이 아닌 총크기인 7을 대괄호[] 안에 넣어 주어야 한다.

 

이런 식으로 배열을 생성했을 경우 타입별로 배열의 초기값으로 데이터가 들어가게 된다.

분류 타입 초기값
기본 타입(정수) byte[]
char[]
short[]
int[]
long[]
0
'\u0000'
0
0
0L
기본 타입(실수) float[]
double[]
0.0F
0.0
기본 타입(논리) boolean[] false
참조 타입 클래스[] null
인터페이스[] null

 

위 int타입으로 선언된 배열 안의 데이터 값을 아래와 같다.

int[] intArray = new int[7];
System.out.println(intArray[0]) //출력값: 0
System.out.println(intArray[1]) //출력값: 0
System.out.println(intArray[2]) //출력값: 0
.
.
.

 

다차원 배열

지금까지 봐온 배열은 전부 값 목록으로 구성된 1차원 배열이다.

이와 달리 행과 열로서 구성된 배열을 2차원 배열이라고 한다.

(그냥 배열안에 배열 들어있는게 2차원 배열 / 배열안에 배열안에 배열 있음 3차원 / 배열안에배열안에배열안에...xox)

 

//example code
int[][] scores = new int[2][3];
//scores == {{0,0,0}, {0,0,0}}