Java 파트5-1. 배열

1. 선언


두 가지 방법으로 선언이 가능하나, 보통 첫 번째 방식을 더 많이 사용한다.

int[] array;
double[] array;
String[] array;

int array[];
double array[];
String array[];

// 초기화후 변경 불가능한 배열 만들기
private final List<String> value = List.of("1","2");


2. 생성

두 가지 방법으로 생성 가능하다. 목록을 통해 생성하지 않는 경우라면 String에는 null, int에는 0이 들어있다.

타입[] 변수명 = {값0, 값1, 값2,...};
int[] array = {0,1,2};

int[] hello;
hello = {0,1,2,3}; // 컴파일 에러

int[] hello;
hello = new int[] {1,2,3}; // 선언 이후에 값의 목록으로 배열 생성을 원한다면 new 키워드 사용
// 자바는 new int[] {1,2,3} 을 배열로 만들고 그 번지를 hello에 저장해준다.

타입[] 변수명 = new 타입[크기];
int[] scores = new int[30]; // 기본적으로 배열 안에는 0이 저장되어 있다.

첫 번째 방법으로 값 목록을 이용해서 배열을 생성할 경우에는 선언과 동시에 바로 목록을 작성해줘야 한다. 배열을 먼저 선언하고 나중에 목록을 주는 문법은 자바에서 허용하지 않는다. 후에 목록을 이용해서 배열을 생성하고 싶다면 new 키워드를 사용해야 한다.


3. 길이


.length를 이용하면 배열의 길이를 확인할 수 있다.

int[] scores = new int[30]; 
System.out.print(scores.length); // 30


4. 명령 라인 입력


그림1

main() 메소드의 String[] args 매개변수
실행할 때 명령라인 매개값을 주지 않았을 경우 길이가 0인 String 배열 생성 후 main()메소드가 호출되는 것이다. 그렇다면 매개값을 주고 사용해보자. 아래 코드를 실행하기 전에 Run - Run configurations - Arguments - Program arguments 에서 공백을 기준으로 값을 주고 Run 해주면 값이 들어간다.

package sec01.exam02;

import java.util.Scanner;


public class booleanexample {	
	
	public static void main(String[] args) {
		String a1 = args[0];
		String a2 = args[1];
		
		int b1 = Integer.parseInt(a1);
		int b2 = Integer.parseInt(a2);
		
		System.out.print(b1+b2);
			
	}

}


5. 다차원 배열


선언

타입[][] 변수명 = new 타입[크기][크기];
int[][] scores = new int[2][3];

타입[][] 변수 = {{값1,값2,....}, {값1,값2,,....}};
int[][] scores = {{95,80},{92,96}};
int score = scores[0][0] // 95

그림2

int[][] scores = new int[2][3]에서 scores는 int[2][3] 객체의 주소를 참조하고 scores[0]과 scores[1]은 각각 길이가 3인 배열을 참조한다.

scores.length // 2 , 배열 A의 길이
scores[0].length // 3 , 배열 B의 길이
scores[1].length // 3 , 배열 C의 길이

계단식 구조, 비정방형 배열

행수만 결정해두고 열수를 나중에 결정하는 구조이다. 행마다 열 개수가 서로 다르게 만들 수 있다.

int[][] socres = new int[2][]; 
scores[0] = new int[2];
scores[1] = new int[3];

그림3

scores.length // 2 , 배열 A의 길이
scores[0].length // 2 , 배열 B의 길이
scores[1].length // 3 , 배열 C의 길이


연습하기
length를 for문의 조건에 활용하면 유용하게 사용할 수 있다.

package sec01.exam02;

import java.util.Scanner;


public class booleanexample {	
	
	public static void main(String[] args) {
		int[][] scores = {{95,92},{88,96,100}};
		
		for(int i=0;i<scores.length;i++) {
			for(int k=0;k<scores[i].length;k++) {
				System.out.printf("%d ", scores[i][k]);
			}
			System.out.printf("\n");
		}
			
	}

}


6. 객체를 잠조하는 배열


참조 타입 배열은 요소에 값(정수, 실수, 논리값)을 저장하지 않고, 객체의 번지를 가지고 있다.

String[] strarray = new String[3]; // string 타입의 변수에 string 배열 객체를 만들어 번지수를 대입
strarray[0] = "java"; // java라는 String 객체가 생성이되고 이 객체의 번지가 0번 인덱스에 대입
strarray[1] = "java"; // java라는 String 객체가 생성이되고 이 객체의 번지가 1번 인덱스에 대입
strarray[2] = new String("java") // 2번 인덱스에 새로운 객체를 만들어 번지수 대입

그림4

자바에서는 문자 리터럴이 같으면 String 객체를 공유하므로 인덱스 0,1은 같은 번지수를 참조하게 된다.

strarray[0] == strarray[1] // true
strarray[0] == strarray[2] // false
strarray[0].equals(strarray[2]) // true , 문자열은 동일


7. 배열 복사


  1. for문을 이용해서 요소 하나 하나 복사하는 방법
  2. System.arraycopy()를 이용해 복사하는 방법
사용법
System.arraycopy(원본배열,원본배열시작인덱스,대상배열,대상배열시작인덱스,복사개수);

String[] oldStrArray = {"java","array","copy"};
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray,0,newStrArray,0,oldStrArray.length);

prearray에 뒤에 2개의 원소를 추가하려고 한다. 하지만 배열은 길이가 결정이되면 수정할 수 없다. 그러면 새로운 배열은 만들어서 이전 배열을 복사하고 추가적인 요소를 저장하도록 하면 된다.

그림5


8. 향상된 for문


  • 배열이나 컬렉션을 좀 더 쉽게 처리
  • 반복 실행을 위해 루프 카운터 변수나 증감식을 사용하지 않음
기존식
for(int i=0;i<10;i++>){

}

향상된 for문
for (타입 변수명 : 배열){

}

그림6

동작 과정은 파이썬의 for i in 배열과 같다고 보면 된다. 예시를 한 번 보자.

int[] scores = {95,99,98,97};
for (int x : scores) 
	System.out.printf("%d " ,x);

본 포스팅은 ‘혼자 공부하는 자바’를 읽고 공부한 내용을 바탕으로 작성하였습니다.


© 2021. By Backtony