공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

배열(Array)이란?

 같은 타입의 변수들을 하나의 묶음으로 다루는 것을 말한다. 배열은 변수와 달리 저장공간이 연속적으로 할당된다는 특징이 있다.

 

 

배열의 선언

  타입에 대괄호 [ ] 를 붙이는 방법과 변수 이름에 붙이는 방법 2가지가 있다. 보통 1의 방법을 많이 사용한다. 

 

  1.  타입[ ] 변수이름 

int[] number;
String[] name;

 

 

  2.  타입 변수이름[ ] 

int number[];
String name[];

 

 

 

 

배열의 생성

타입[] 변수이름;
변수이름 = new 타입[길이];

//두 개를 합쳐서 아래와 같이 쓴다.
타입[] 변수이름 = new 타입[길이];
int[] number = new int[5];

  배열을 선언하면(생성된 배열을 다루기 위한) 참조 변수 공간이 만들어진다. 배열을 사용하기 위해서는(값을 넣는다던지) 배열을 생성해줘야 한다. 배열을 생성할 때는  new 와 함께 배열의 타입과 길이를 지정해야 한다.

 

 

 

 

배열의 길이와 인덱스

 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.  index 는 배열의 요소마다 붙여진 일련번호로 요소를 구별하는 데 사용한다. 인덱스의 범위는 0 ~ (배열 길이 -1)까지이다. 배열에 값을 저장하고 읽어오는 방법은 변수와 같지만  배열 이름[index] 을 사용한다는 점만 다르다.

 

 배열은 index의 값으로 상수 대신 변수나 수식도 사용할 수 있기 때문에 거의  for 문과 같이 사용되는 경우가 많다. 그러나  index 의 범위를 벗어나는 값을  index 로 사용하면 실행 시에 에러( ArrayIndexOutOfBoundsException )가 발생한다.(변수의 값은 실행시에 대입되므로 컴파일러가 잡아주지 못함.) 

 

 

  ■ 배열의 길이

  : 배열의 길이는 값을 저장할 수 있는 공간의 개수이다. 배열의 길이는 최소  0 부터 최대 (int타입의 최대값인) 20억  까지 가능하다.

 

 

  ■ 배열 이름. length

  : 자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며  배열이름.length 로 배열 길이를 얻을 수 있다. 배열은 한번 생성하면 길이를 변경할 수 없기 때문에  배열이름.length 는 상수이다. 값을 읽을 수만 있고 변경할 수 없다.

 

 

  ■ 배열의 길이 변경하기

배열의 길이를 변경하는 방법

1. 더 큰 배열을 새로 생성한다.
2. 기존 배열의 내용을 새로운 배열에 복사한다.

 배열은 한번 선언되고 나면 길이를 변경할 수 없기 때문에 길이를 변경하려면 배열을 새로 생성해서 복사해야 한다. 이러한 작업들은 비용이 많이 들기 때문에 처음부터 배열의 길이를 넉넉하게 잡는 것이 좋다. 너무 크게 잡으면 메모리 낭비가 되므로 적절한 길이로 생성하자. (기존의 2배 정도의 길이로 생성하는 것이 좋다.)

 

 

 

 

배열의 초기화

int[] number = new int[5];	//선언하는 동시에 int형의 기본값인 0으로 초기화 된다.

//1. 값을 저장하려면 각 요소마다 값을 지정해주어야 한다.
number[0] = 10;
number[1] = 20;
number[2] = 30;
number[3] = 40;
number[4] = 50;

//2. 배열의 길이가 크면 for문과 같이 사용되는 경우가 많다.
for(int i = 0 ; i < number.length ; i++){
	number[i] = i * 10;
}

//3. 생성과 동시에 초기화를 하는 방법도 있다.
int[] number = new int[]{10, 20, 30, 40, 50};
int[] number = {10, 20, 30, 40, 50}	//new 타입[]을 생략해도 된다.

배열은 생성과 동시에 자신의 타입에 해당하는 기본값으로 초기화된다. 원하는 값으로 초기화하려면 위와 같이 각 요소마다 값을 지정해 주어야 한다. 배열의 길이가 큰 경우에는  for 문과 같이 사용되는 경우가 많고 생성과 동시에 초기화를 하는 방법도 있다. 한 번에 초기화를 하는 경우에는 중괄호 { } 를 사용해서 값을 표현하고, 쉼표( , )로 값을 구분한다. 이때는 값의 개수가 계산돼서 배열의 길이가 자동으로 결정되기 때문에 배열의 크기는 적지 않아도 된다. 배열은 0부터 시작한다는 것 꼭 기억하자!

 

 

int[] number = new int[0];
int[] number = new int[]{};
int[] number = {};	//new int[]가 생략됨

괄호 { } 안에 아무것도 넣지 않으면, 길이가  0 인 배열이 생성된다. 참조 변수의 기본값은  null 이지만, 배열을 가리키는 참조 변수는  null 대신 길이가  0 인 배열로 초기화하기도 한다. 위의 세 문장은 모두 길이가  0 인 배열을 생성한다.

 

 

 

  ■ 배열의 출력

    1.  for문 사용 

for(int i = 0 ; i < 배열.length; i++){
	System.out.println(배열[i]);
}

 for 문을 이용해서 배열의 값을 출력할 수 있다. 배열 이름만 쓰면 배열의 시작 주소가 출력되기 때문에 ' 배열이름[index의 값] '형태로 출력해야 한다. 자바에서는 '타입@주소'의 형식으로 출력된다. 

+ 예외적으로  char 배열은  println 서드로 출력하면 각 요소가 구분자 없이 그대로 출력된다.

 

 

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

System.out.println(Arrays.toString(number));

 Arrays.toString(배열 이름) 메서드를 사용하면 배열의 모든 요소를  [ 첫 번째 요소, 두 번째 요소,…] 형식의 문자열로 만들어서 반환한다.

 

 

 

 

배열의 복사

 배열의 복사는 2가지 방법이 있다. 보통  System.arraycopy() 를 많이 사용한다.

 

 

  1.  for문을 이용한 복사 

package test;
import java.util.Arrays;	//Arrays.toString()을 사용하기 위한 import

class test{
	public static void main(String[] args) {
		
		int[] arr1 = {10, 20, 30, 40, 50};
		int[] arr2 = new int[arr1.length * 2];	//arr1의 길이의 2배인 배열 arr2선언(0으로 초기화됨)
		
		System.out.println("복사하기전 arr1 = " + Arrays.toString(arr1));
		System.out.println("복사하기전 arr2 = " + Arrays.toString(arr2));
		
		for(int i = 0 ; i < arr1.length ; i++) {	//arr1의 길이만큼 반복문 실행
			arr2[i] = arr1[i];	//arr1배열의 값을 arr2배열에 저장
		}
		
		arr1 = arr2;	//원래의 배열을 가리키고있던 참조변수 arr1이 새로 복사된 arr2 배열을 가리키도록 한다.
		
		System.out.println("복사하고난 후 arr1 " + Arrays.toString(arr1));
		System.out.println("복사하고난 후 arr2 " + Arrays.toString(arr2));
	}
}

 

실행결과

 arr 1 의 2배 길이인  arr2 를 생성해서 배열의 값을 복사하는 내용의 예제이다. 복사되고 나서  arr1  arr2 가 가리키는 배열이 서로 같은 것을 확인할 수 있다.  arr1 이 원래 가리키고 있던 배열은 더 이상 참조하는 변수가 없으므로 메모리는 할당되어 있지만 접근할 수가 없다. 쓸모없게 된 배열은 JVM의 GC(Garbage Collector)에 의해 자동으로 메모리에서 제거된다.

 

 

  2.  System.arraycopy( )를 이용한 복사 

 

System.arraycopy(src, srcPos, dest, destPos, length);
  • src : 복사할 배열
  • srcPos : 복사를 시작할 배열의 위치(index값)
  • dest : 붙여넣을 배열
  • destPos : 복사된 배열값들이 붙여질 시작위치(index값), 이 위치부터 차례대로 붙여넣어진다.
  • length : 길이, 지정된 길이만큼 값들이 복사된다.


 for
문은 배열의 요소 하나하나에 접근해서 복사하는 반면  arraycopy( ) 는 지정된 범위의 값들을 한 번에 통째로 복사한다.

(배열이 연속적으로 저장되어있다는 특성 때문에 가능한 것!)

 

package test;
import java.util.Arrays;	//Arrays.toString()을 사용하기 위한 import

class test{
	public static void main(String[] args) {
		
		int[] arr1 = {10, 20, 30, 40, 50};
		int[] arr2 = new int[arr1.length * 2];	//arr1의 길이의 2배인 배열 arr2선언(0으로 초기화됨)
		
		System.out.println("복사하기전 arr1 = " + Arrays.toString(arr1));
		System.out.println("복사하기전 arr2 = " + Arrays.toString(arr2));
		
		System.arraycopy(arr1, 0, arr2, 0, arr1.length);	//arr1의 index 0부터(처음부터) arr1.length(arr1의 길이)만큼 arr2의 index 0에 붙여넣는다.(0부터 차례대로 값이 들어감)
		
		System.out.println("복사하고난 후 arr1 " + Arrays.toString(arr1));
		System.out.println("복사하고난 후 arr2 " + Arrays.toString(arr2));
	
	}
}

 

실행결과

 위의 예제에서는  srcPos  destPos  0 으로 되어있어서 처음부터 복사되고 붙여 넣어지지만 이 값을 조정하면 원하는 위치에서 자유자재로 복사하거나 붙여 넣을 수 있다.(length에 따라 길이도 조절 가능) 복사한 배열을 붙여 넣을 배열의 위치가 복사할 내용보다 여유공간이 적으면 에러( ArrayIndexOutOfBoundsException )가 발생하니 주의하자!

 

+ 다른 배열과 달리  char 배열은  for 문을 사용하지 않고도  print( )   println( ) 으로 배열에 저장된 모든 문자를 출력할 수 있다!

 

 

 

 


String배열

 문자열은 문자가 여러 개 있다는 의미이므로  char 배열과 같은 뜻이다. 자바에서는  String 클래스가  char 배열에 여러 가지 기능(메서드)을 추가해서 확장한 것이기 때문에 문자열을 처리할 때  String 클래스를 사용하는 것이 더 편리하다.  char 배열과  String 클래스의 중요한 차이점은  String 객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 점이다.

 

 

  ■ String배열의 선언과 생성

String[] name = new String[배열의 크기];

배열의 타입이  String 인 경우에도 다른 타입들의 배열과 선언 방법이 같다.

 

 

  ■ String배열의 초기화

String[] name = new String[3];	//길이가 3인 String배열 생성

name[0] = "Kim";
name[1] = "Lee";
name[2] = "Park";

//괄호{}를 이용해서 간단히 초기화하는 방법도 있다.
String[] name = new String[]{"Kim", "Lee", "Lee"};
String[] name = {"Kim", "Lee", "Lee"};	//new String[] 생략가능

 원래  String 은 클래스이므로  new 연산자를 통해 name[0] = new String("Kim")형식으로 객체를 생성해야 하지만  String 클래스만 더블 쿼터( " )로 표현하는 것이 허용된다. 기본형 배열이 아닌 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소이다. 참조형 배열을 객체 배열이라고도 한다.

 

 

  ■ String클래스의 주요 메서드

메서드 설명
char charAt(int index) 문자열에서 해당위치(index)에 있는 문자를 반환
int length( ) 문자열의 길이를 반환
String substring(int from, int to) 문자열에서 해당 범위(from ~ to)에 있는 문자열을 반환한다.
(to는 범위에 포함하지 않음)

boolean equals(String str)

문자열의 내용이 같은지 확인한다.
(같으면 true, 다르면 false)
char[ ] toCharArray( ) 문자열을 문자배열(char[ ])로 변환해서 반환한다.

 

 

package test;

class test{
	public static void main(String[] args) {
		
		char[] chArr = {'A', 'B', 'C', 'D'};
		String str = new String(chArr);	//char배열을 String으로 변환
		char[] tmp = str.toCharArray();	//String을 char배열로 변환
		
		System.out.println(chArr);
		System.out.println(str);
		System.out.println(tmp);
	}
}

 char 배열과  String 클래스를 양방향으로 변환하는 예제이다.

 char 배열을  String 클래스로 바꿀 때는 괄호 안에  char 배열을 넣어주고, 반대일 때는  toCharArray( ) 메서드를 이용하면 된다.

 

 

 

 


다차원 배열

 앞서 설명했던 것들은 1차원 배열에 대한 설명이고 배열 안에 또 배열이 존재하는 다차원 배열도 선언할 수 있다. 메모리의 용량이 허용하는 한 차원의 제한은 없지만 주로 1차원과 2차원 배열이 많이 사용된다. 2차원 배열은 주로 테이블 형태의 데이터를 담는 데 사용된다.

 

 

  ■ 2차원 배열의 선언과 인덱스

선언방법 예시
타입[ ][ ] 변수이름; int[ ][ ] number;
타입 변수이름[ ][ ]; int number[ ][ ];
타입[ ] 변수이름[ ]; int[ ] number[ ];

2차원 배열도 1차원 배열과 비슷한 방법으로 선언할 수 있다. 마찬가지로 첫 번째 줄의 방법을 많이 사용한다.

 

 

number[4][3]의 배열요소

2차원 배열의 경우에는 행(row)열(column)로 구성되어 있다. 행과 열 또한 배열이기 때문에  index 값은  0 부터 시작한다.

 int[ ][ ] number = new int[4][3]  int 타입인 4행3열의 2차원 배열을 생성하라는 의미이다.

 

 

 

  ■ 2차원 배열의 초기화

int[][] arr = new int[][]{ {1, 2, 3}, {4, 5, 6} };
int[][] arr = { {1, 2, 3}, {4, 5, 6} };	//new int[][]를 생략할 수 있다.

//다차원 배열의 경우 줄바꿈을 해서 보기좋게 쓰는것이 좋다.
int[][] arr = {
			{1, 2, 3},
                	{4, 5, 6}
               };

값을 직접 넣어서 초기화하는 경우 크기를 지정해주지 않아도 알아서 크기가 정해진다. 

2차원 배열은 보기 좋게 행별로 줄 바꿈을 해주는 것이 좋다.

 

 

 

  ■ 2차원 배열 출력

package test;

class test{
	public static void main(String[] args) {
		
		int[][] number = {					//[2][3](2행3열)인 2차원 배열선언
					{1, 2, 3},
					{4, 5, 6}
				};
		
		for(int i = 0 ; i < number.length ; i++) {	//배열.length하면 행의 길이가 반환된다.
			for(int j = 0 ; j < number[i].length ; j++) {	//배열[index].length는 열의 길이가 반환된다.
				System.out.print("number[" + i + "][" + j + "] = " + number[i][j] + "\t");
			}
			System.out.println();	//보기좋게 출력하기 위한 줄바꿈
		}
	}
}

2차원 배열도 1차원 배열처럼  배열이름.length 를 사용한다.

주의할 점은  배열이름.length 는 행의 길이를 반환한다는 것이다. 열의 길이를 얻고 싶다면  배열이름[index].length 를 해야 한다.

 

 

 

  ■ 가변 배열

int[][] number = new int[5][];	//가변배열 생성

number[0] = new int[1];	//1행은 1개의 열
number[1] = new int[3]; //2행은 3개의 열
number[2] = new int[2];	//3행은 2개의 열
number[3] = new int[5];	//4행은 5개의 열
number[4] = new int[4];	//5행은 4개의 열

자바에서는 2차원 이상의 배열을 배열 안에 또 다른 배열이 있는 형태로 처리한다.

2차원 이상의 다차원 배열을 생성할 때 마지막 차수의 길이를 지정하지 않고 각기 다른 길이의 배열을 생성할 수 있다.

 

 

 

+ Recent posts