Programming Language/Java

[Java] 배열(1) | 배열 선언, 생성, 초기화, 인덱스, 배열 길이, 배열 출력, 배열 복사, Array.toString

성니 2021. 1. 18. 20:13

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788994492032&orderClick=LEa&Kc=

 

Java의 정석 - 교보문고

자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한『Java의 정석』. 저자의 오랜 실무경험과 강의한 내용으로 구성되어 자바를 처음 배우는 초보자들의 궁금한 점을 빠짐없이 담고 있

www.kyobobook.co.kr

 

[배열 array]

 

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

 

* 배열의 선언

배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조 변수를 위한 공간이 만들어질 뿐이다.

// 타입[] 변수이름;
int[] score;
String[] name;
// 타입 변수이름[];
int score[];
String name[];

 

 

* 배열의 생성

배열을 생성해야 값을 저장할 수 있는 공간이 만들어진다.

타입[] 변수이름;		// 배열을 선언(배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이];	// 배열을 생성(실제 저장공간을 생성)

 

 

- 배열의 선언과 생성을 동시에

타입[] 변수이름 = new 타입[길이];	// 배열의 선언과 생성을 동시에
int[] score = new int[5];		// 길이가 5인 int 배열

 

 

* 배열의 길이와 인덱스

"인덱스(index)의 범위는 0부터 '배열길이 -1'까지."
int[] score = new int[5]; // 길이가 5인 int 배열

인덱스 넘버는 0부터 시작하기 때문에, 위의 경우 인덱스의 범위는 0부터 4가 된다.(크기가 5)

 

 

int[] arr = new int[0];		// 길이가 0인 배열

길이가 0인 배열? 무슨 말이냐고 하겠지만 자바에서는 '배열의 길이가 0일 수도 있다.'

프로그래밍을 하다 보면 나름 유용하게 쓰인다고 하니 참고로 알아두자.

 

 

- 배열이름.length

자바에서는 '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.

int[] arr = new int[5];		// 길이가 5인 int배열
int tmp = arr.length;		// arr.length의 값은 5이고 tmp에 5가 저장된다

배열은 한번 생성하면 길이를 변경할 수 없으므로, 이미 생성된 배열의 길이는 변하지 않는다.

그래서 '배열이름.length'는 상수이고, 값을 읽을 수만 있을 뿐 변경할 수 없다.

 

 

for문의 조건식에 배열의 길이를 직접 적기보다 '배열이름.length'를 사용하는 것이 좋다.

 

배열의 크기를 수정하였을 때, 일일이 조건식을 변경하기보다는,

배열이름.length를 조건식에 넣어서 수정된 부분이 바로 적용될 수 있도록 하는 것이 효율적이다.

// 원래 코드
int[] candy = new int[6];
for (int i = 0; i < 6; i++){
	System.out.println(candy[i]);
}

// 에러가 발생하는 코드
int[] candy = new int[5];	//배열 길이를 6에서 5로 변경
for (int i = 0; i < 6; i++){	// 조건식은 변경되지 않았음
	System.out.println(candy[i]);
}

// 배열이름.length를 사용하는 올바른 코드
int[] candy = new int[5];	//배열 길이를 6에서 5로 변경
for (int i = 0; i < candy.length; i++){	// 조건식을 변경하지 않아도 상수로 적용됨
	System.out.println(candy[i]);
}

 

 

* 배열의 초기화

배열은 원래 생성과 동시에 자동으로 자신의 타입에 해당하는 기본값으로 초기화된다.

따로 초기화하지 않아도 되지만, 원하는 값을 저장하고 싶다면 값을 지정해야 한다.

int[] candy = new int[5];
candy[0] = 10;
candy[1] = 20;
candy[2] = 30;
candy[3] = 40;
candy[4] = 50;

 

 

배열에 지정하는 값에 규칙이 있다면 for문으로도 초기화 할 수 있다.

int[] candy = new int[5];
for (int i = 0; i < candy.length; i++)
	candy[i] = (i + 1) * 10;

 

 

- 배열의 생성과 초기화를 동시에

자바에서는 배열을 간단히 초기화 할 수 있는 방법을 제공한다.

int[] candy = new int[] {10, 20, 30, 40, 50};
int[] candy = {10, 20, 30, 40, 50};		// new int[] 생략 가능. 더 간단!

// 잘못된 코드의 예
// 배열의 선언과 생성을 따로 하는 경우에는 new 타입[] 생략 불가능
int[] candy;
candy = new int[] {10, 20, 30, 40, 50};		// OK
candy = {10, 20, 30, 40, 50};		// 에러 발생. new int[] 생략 불가능

 

 

괄호{} 안에 아무것도 넣지 않으면 길이가 0인 배열이 생성된다.

아래는 길이가 0인 배열을 생성하는 세 가지 예시이다.

int[] candy = new int[0];
int[] candy = new int[] {};
int[] candy = {};

 

 

* 배열의 출력

- for문

출력을 할 때, println은 개행문자 \n이 포함되어 있으므로 자동 줄 바꿈을 한다. 원하지 않는 경우에는 println 대신에 print로 해주자.

 

 

- Array.toString(배열이름) 메서드

배열의 모든 요소를 [첫번째 요소, 두번째 요소, ...] 형식의 문자열로 변환한다.

 

 

배열의 출력 예제

7~8번째 줄 : for문을 이용해서 배열을 출력

10번째 줄 : Array.toString 메서드를 이용하여 출력

 

 

char 배열을 println메서드로 출력한 예제

char 배열을 println 메서드로 그냥 출력하면 구분자 없이 요소가 그대로 출력된다.

이는 println 메서드가 char 배열일 때만 이렇게 동작하도록 작성되었기 때문이다.

 

 

* 배열의 복사

- for문

배열을 한 번 생성하면 그 길이를 변경할 수 없으므로, 더 많은 저장공간이 필요하면 큰 배열을 새로 만들고 기존의 배열을 새로운 배열에 복사한다.

 

1. 기존의 배열보다 길이가 2배인 배열을 생성한다.

2. tmp 배열에 기존의 요소를 담는다.

3. 새로 생성된 배열에 tmp에 담아두었던 기존의 요소를 넣는다.

int[] candy = new int[5];

int[] tmp = new int[candy.length*2];	// 기존 배열보다 길이가 2배인 배열 생성
for (int i = 0; i < candy.length*2; i++)
	tmp[i] = arr[i];	// candy[i]의 값을 tmp[i]에 복사
candy = tmp;	// 참조변수 candy가 새로운 배열을 가리키게 한다. candy와 tmp는 이름만 다를 뿐 동일한 배열

 

 

- System.arraycopy()

for문 대신 System.arraycopy()를 사용하면 더욱 효율적이다.

for문 : 배열 요소 하나하나를 직접 복사

~ System.arraycopy() : 지정된 범위의 값들을 통째로 복사

 

for (int i = 0; i < candy.length*2; i++)
	tmp[i] = arr[i];
    
System.arrycopy(candy, 0, tmp, 0, candy.length);
// 괄호 차례대로, candy[0]에서 tmp[0]으로 candy.length개의 데이터를 복사한다는 의미

 

 

* 배열의 활용

이중 for문과 배열을 활용해서 구구단 2, 3, 4단 출력하기

 

 

public class Hello {
	public static void main(String[] args) {
		int number[] = {2, 3, 4};
		for (int i = 0; i < number.length; i++) {
			for (int j = 1; j < 10; j++) {
				System.out.printf("%d * %d = %d\n", number[i], j, (number[i] * j));
			}
		}
	}
}

 

728x90