본문 바로가기

coding/Java

[Java] 배열(1) - 초기화, 복사, For-each문

배열(Array)에 대해 알아보자.

배열은 인덱스와 인덱스에 대응하는 데이터들로 이루어진 연속적인 자료구조로, 같은 종류의 데이터들이 순차적으로 저장된다. 1차원 배열은 타입이 같은 둘 이상의 데이터를 저장할 수 있는 1차원 구조의 메모리 공간을 말한다. C/C++에서와 비슷한데, 대신 생성하는 단계가 좀 다르다.

	//배열에 대한 레퍼런스 변수 선언
	int intArray[];
	//배열 생성
	intArray = new int[5];
		
	//한꺼번에 하기
	int[] intArray = new int[5];
	int intArray[] = new int[5];
		
	//배열 생성과 초기화 동시에 하기
	int[] intArray = new int[] {1, 2, 3, 4, 5};
	int[] intArray = {1, 2, 3, 4, 5};

 

배열 선언시 무심코

int intArray[5];

같은 실수를 하면 안된다. 자바에서는 컴파일 오류가 난다(경험담이다). 저렇게 쓰는 건 배열 내 값에 접근할 때 쓴다.

	int[] intArray = new int[5]; //배열 생성 및 선언
	intArray[0] = 5; //인덱스가 0인 원소에 5 저장
	intArray[1] = 6; //인덱스가 1인 원소에 6 저장
	int n = intArray[1]; //변수 n에 인덱스 1의 값을 저장. n=6이 된다.

 

다차원배열도 구현할 수 있다. 2차원 배열만 간단히 만들어봄. length 의미가 1차원 배열과는 다르니 주의!

	//2차원 배열의 레퍼런스 변수 선언
	int[][] intArray;
	int intArray[][];
	//2x5의 차원 배열 생성
	intArray = new int[2][5];
		
	//한꺼번에 하기
	int[][] intArray = new int[2][5];
	int intArray[][] = new int[2][5];
		
	//배열 생성과 초기화 동시에 하기
	int[][] intArray = {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}};
		
	//length의 의미
	int size1 = intArray.length;
	int size2 = intArray[0].length;
	int size3 = intArray[1].length;

 

size1과 size2, size3는 각각 어떤 값을 가질까?

- size1은 2차원 배열의 행의 개수, 2이다.

- size2는 0번째 행에 있는 열의 개수, 5이다.

- size3는 1번째 행에 있는 열의 개수, 5이다.

 

2차원 배열은 다수의 1차원 배열을 엮어서 구성한 것이라고 이해하면 편하다.

 

 

 

1) 배열의 초기화 메소드

fill(int[] a, int fromIndex, int toIndex, int val)

 

- 원하는 값으로 배열 전부 또는 일부를 채울 때 사용하는 메소드

- 인덱스 fromIndex ~ (toIndex-1)의 범위까지 val의 값으로 배열 초기화

- java.util.Arrays 클래스에 정의되어 있다.

 

 

2) 배열의 복사 메소드

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

 

- 한 배열에 저장된 값을 다른 배열에 복사할 때 사용하는 메소드

- 복사할 원본의 위치: 배열 src의 인덱스 srcPos

- 복사 대상의 위치: 배열 dest의 인덱스 destPos

- 복사할 요소의 수: length 

- java.lang.System 클래스에 정의되어 있다.

 

 

  <예시코드>

import java.util.Arrays;
import java.lang.System;

public class FinalTermTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr1 = new int[10];
		int[] arr2 = new int[10];
		
		Arrays.fill(arr1, 7); //배열 arr1을 7로 초기화
		System.arraycopy(arr1,  0,  arr2,  3,  4); //배열 arr1을 arr2의 3번째 인덱스로 4칸만큼 복사
		
		for(int i = 0; i < arr1.length; i++)
			System.out.print(arr1[i] + " ");
		System.out.println();
		for(int j = 0; j < arr2.length; j++)
			System.out.print(arr2[j] + " ");
	}
}

 

(클래스 이름).(메소드 이름) -> 이렇게 불러오는 것 잊지말자.

 

 

3) For-each 문

Enhanced for문이라고도 한다. 기존의 for문을 변형하여, 배열이나 나열의 크기만큼 루프를 돌면서 각 원소를 순차적으로 접근하는데 유용하게 만든 for문이다.

 

for (참조변수 : 배열 레퍼런스) {

.... 반복 작업문 ....

                                                 }

import java.util.*;

public class FinalTermTest {
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] n = {1, 2, 3, 4, 5}; 
		String names[] = {"탄산수", "두유", "젤리", "커피", "사탕"};
		int sum = 0;
		
		for (int k : n) {
			System.out.print(k + " ");
			sum += k;
		}
		System.out.println("합은 " + sum);
		
		for (String s : names)
			System.out.print(s + " ");
	}
}