솜이의 데브로그

Chapter 05 ) 배열 array 본문

책을 읽자/Java의 정석

Chapter 05 ) 배열 array

somsoming 2021. 9. 3. 22:02

참고 : Java의 정석

 

1. 배열

 

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

배열의 선언에는 두가지 방법이 있다.

  1. 타입[] 변수이름;
  2. 타입 변수이름[];

 

배열의 생성

 

파이썬과의 차이점에 주의하자.

ex)

int[] score;  //배열을 선언(참조변수 선언)
score = new int[5];  // 배열을 생성 (실제 저장 공간을 생성)

위와 같이 배열의 선언 후에는 배열을 생성해야 한다.

 

또는 다음과 같이 선언과 생성을 동시에 할 수도 있다.

int[] score = new int[5];

 

※각 배열을 int로 선언 시, 배열 요소는 자동적으로 int의 기본값인 0으로 초기화된다.

변수로 배열 내용 선언할 때, 유효한 범위를 벗어난 값을 index로 사용하면 컴파일은 되지만 ArrayIndexOutOfBoundsException 에러가 발생한다. 따라서 코드를 짤 때 주의해야한다.

 

배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다. (이 때 배열의 길이가 0인 배열도 생성 가능)

배열은 한번 생성하면 길이를 변경할 수 없다. 따라서 배열이름.length 는 변경 불가능하다.

 

더 큰 길이의 새로운 배열을 생성하고자하면 기존의 배열에 저장된 값들을 새로운 배열에 복사해야한다.

 

 

배열의 초기화

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

따라서 원하는 값으로 초기화하려면 다음과 같이 할 수 있다.

 

int[] score = new int[]{10,20,30,40,50};  //가능
int[] score = { 10,20,30,40,50 };  //가능. new int[] 생략 가능

new int[] 생략이 가능하지만, 배열의 선언과 생성을 따로 하는 경우에는 생략 할 수 없다.ex)

int[] score;
score = new int[]{10,20,30,40,50};  //가능
score = {10, 20,30, 40, 50};  //불가능

 

배열의 출력

for 문을 사용해 출력 or Arrays.toString(배열이름) 으로 출력.Arrays.toString 메서드는 배열의 모든 요소를 '[첫번째 요소, 두번째 요소, ....]' 와 같은 형식의 문자열로 반환한다.

 

만약 배열의 이름을 바로 출력한다면 타입@주소 의 형태로 출력된다.( ex : [I@14318bb  와 같은 형식의 문자열)

 

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

ex)

char[] chArr = {'a', 'b', 'c', 'd'};
System.out.println(chArr);  //abcd가 출력된다.

 

배열의 복사

 

배열의 복사는 for문 보다 System.arraycopy() 를 사용하는 것이 효과적이다.

ex)

System.arraycopy(num, 0, newNum, 0, num.length);

배열 num[0]에서 newNum[0]으로 numlength개의 데이터를 복사하라는 뜻.

 

예제) 임의의 값으로 배열 채우기

for(i=0; i<arr.length; i++){
	arr[i] = (int)(Math.random()*5);
}

 

2. String 배열

 

String배열의 선언과 생성 역시 동일하다. 또한 참조형 변수의 기본값은 null 이므로 각 요소는 null로 초기화된다.

참조형 배열의 경우 배열에 저장되는 것은 객체의 주소이다. (String은 클래스이므로 각 요소에는 주소가 저장됨.)

 

자바에서 String 클래스는 char배열에 기능(메서드)를 추가한 것이다.

 

<String 클래스의 주요 메서드>

char charAt(int index) : 문자열에서 해당 위치(index)에 있는 문자를 반환한다.

int length() : 문자열의 길이를 반환한다.

String substring(int from, int to) : 문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 범위 포함하지 않음)

boolean equals(Object obj) : 문자열의 내용이 obj와 같은지 확인한다.

char[] toCharArray() : 문자열을 문자배열(char[])로 변환해서 반환한다.

 

 

커맨드 라인을 통해 입력받기

 

커맨드라인에서 프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 여러개의 문자열을 프로그램에 전달 할 수 있다.

ex)

class ArrayEx16{
	public static void main(String[] args){
    	//main
    }
}

 

커맨드라인 실행 >  java ArrayEx16 abc 123 "Hello World"

결과 : args[0] : "abc"

args[1] : "123"

args[2] : "Hello World"

 

커맨드라인으로부터 입력받는 매개변수는 모두 String 으로 입력되고, 공백으로 구분되므로 필요시에 따라 변환하여 사용한다.

 

 

3. 다차원 배열

2차원 배열을 선언하는 방법은 1차원 배열에 [] 를 추가한다.

 

ex)

int[][] score = new int[4][3];   //4행 3열의 2차원 배열 생성

 

2차원배열의 초기화 역시 {} 를 한번 더 써서 구분해준다. 행별로 줄 바꿈을 해줘서 초기화하는 것이 가독성이 좋다.

 

※위의 4행 3열의 2차원 배열에서, score.lenth 는 score가 참조하는 배열의 길이이므로 4이다. 또 score[0].length 의 길이는 3이다.

 

for (int[] tmp : score){
	for(int i : tmp){
    	sum+= i;
    }
}

위와 같이 2차원 배열의 모든 요소의 합을 구할 수 있는 코드 기억하자.

 

 

가변배열

 

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

ex)

int[][] score = new int[5][];
score[0] = new int[3];
score[1] = new int[4];
score[2] = new int[2];
score[3] = new int[3];
score[4] = new int[4];

 

가변배열 역시 중괄호{} 를 이용해 생성과 초기화를 동시에 할 수 있다.