본문 바로가기
Backend/Java

Java 기초 문법 : 배열

by 코딩쥐 2024. 5. 15.

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루며, 많은 양의 같은 타입의 데이터를 다룰 때 유용하다. 배열의 요소에는 인덱스라고 하는 일련번호를 가지고 있으며, 0부터 시작하여 '배열의 길이 - 1'의 인덱스를 가지고 있다.

 

배열변수 선언

  • 타입[] 배열명; 
    타입 배열명[] 도 사용이 가능하다. 타입 바로 뒤에 와도 상관 없고, 배열 변수명 바로 뒤에 와도 상관없다. 
  • 배열명.length
    배열의 길이를 확인할 수 있다. 배열의 경우 한번 생성하면 실행하는 동안 그 길이를 바꿀 수 없으며, 배열의 길이 변경은 더 큰 배열을 새로 생성한 후에 기존 배열의 내용을 새로운 배열에 복사하여 늘릴 수 있다. 

 

배열 초기화

배열 초기화는 대표적으로 공간만 할당하는 공간할당방식과 값을 직접 삽입하는 직접 삽입 방식이 있다. 

 

공간할당방식

  • 타입[] 배열명 = new 타입[길이];
    길이 만큼의 공간이 생성되고, 공간만 선언할 경우 각 공간은 타입마다 다른값으로 초기화된다.
자료형 기본값
boolean false
char '\u0000'
byte,short,int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 null


직접 삽입 방식

  • 타입[] 변수명 = { 나열하고자 하는 데이터 };

 

배열의 출력

char 배열의 경우 System.out.println(); 사용하여 배열 출력가능, 그 외의 경우에는 for문을 사용하거나 Arrays class 사용해야함

import java.util.Arrays;

public class Example1 {
    public static void main(String[] args) {

        int[] iArr1 = new int[10];
        int[] iArr2 = new int[10];
        int[] iArr3 = {100, 95, 80, 70, 60};
        char[] chArr = {'a', 'b', 'c', 'd'};

        //iArr1에 1부터 10까지의 값을 지정함(중복없음)
        for(int i=0; i < iArr1.length; i++) {
            iArr1[i] = i+1;
        }

        //iArr2에 1~10사이의 난수를 지정함(중복있음)
        for(int i=0; i <iArr2.length; i++) {
            iArr2[i] = (int)(Math.random()*10) + 1;
        }

        System.out.println(Arrays.toString(iArr1));
        System.out.println(Arrays.toString(iArr2));
        System.out.println(Arrays.toString(iArr3));
        System.out.println(Arrays.toString(chArr));
        System.out.println(chArr);

        //for문을 사용해서 출력하는 경우
        for(int i=0; i<iArr3.length; i++)
            System.out.print(iArr3[i] + " ");

        System.out.println(" ");

        //향상된 for문
        for(int i : iArr3){
            System.out.print("향상된 for 문 : " + i + " ");
        }

    }
}

 

배열의 복사

배열을 복사할 때 일반 기본형 변수와는 다르게 참조 타입이기 때문에, 배열의 내용을 갱신하면 원본 배열에도 영향을 미칠 수 있다. 이를 방지하기 위해 다른 방식을 통해 배열을 복사해야 한다.

 

1. 수동 복사 (for 문 사용) 

public class Example1 {
    public static void main(String[] args) {
        char[] num = {'1','2','3','4','5'};
        char[] tmp = new char[num.length*2];

        for(int i=0; i<num.length; i++)
            tmp[i] = num[i];

        System.out.println(tmp);
    }
}

 

2. System.arraycopy(src, srcPos, dest, destPos, length); 사용

import java.util.Arrays;

public class Example1 {
    public static void main(String[] args) {
        char[] abc = {'a','b','c'};
        char[] num = {'1','2','3','4','5'};

        char[] result = new char[abc.length + num.length];

        // abc를 result의 첫번째 요소부터 복사
        System.arraycopy(abc, 0, result, 0, abc.length);

        // num을 result의 abc.length 이후부터 복사해서 num.length만큼의 길이를 복사
        System.arraycopy(num, 0, result, abc.length, num.length);
        System.out.println(result);
    }
}

 

String 배열

여러 개의 문자열을 담을 수 있는 배열로 기본값으로 null이 설정된다.

  • String[] 배열명 = {"요소1", "요소2", "요소3"};
import java.util.Arrays;

public class Test {
public static void main(String[] args) {

    String[] strArr = {"가위", "바위", "보"};

	// 배열을 사용해서 랜덤으로 tmp 값이 0일때는 가위, 1일때는 바위, 2일때는 보가 나옴
    for(int i=0; i<10; i++) {
    int tmp =(int)(Math.random()*3);
    System.out.println(strArr[tmp]);
    }

}
}

 

char배열과 String클래스

문자열을 저장할 때 String 타입의 변수를 사용하는 이유는 String 클래스는 char배열에 여러가지 기능(메서드)를 추가하여 확장한 것이기 때문에 String 클래스를 사용하는 것이 문자열을 다루기가 더 편하기 때문이다. string 클래스는  내용을 변경할수 없다.

String 클래스의 주요 메서드
메서드 설명
char charAt(int index) 문자열에서 해당 위치(index)에 있는 문자 반환 
ex) String str = "ABCDE";
      char ch = str.charAt(3);
      // D
int length() 문자열의 길이 반환 
String substring(int from, int to) 문자열에서 해당 범위(from ~ to)에 있는 문자열 반환
(to는 범위에 포함되지 않음)
ex) String str = "ABCDE";
      String str2 = str.substring(1, 4);
     // BCD
boolean equals(Object obj) 문자열의 내용이 obj와 같은지 확인(true/false)
char[] toCharArray() 문자열을 문자배열(char[])로 변환해서 반환 

 

다차원 배열

테이블 형태의 데이터를 저장하기 위한 배열이다.

  • 타입[][] 배열명 = new 타입[행][열];
    배열명 = { {요소, 요소, 요소}
                     ,{요소, 요소, 요소}
                    };
public class Test {
public static void main(String[] args) {
		

	int[][] score = {{100, 100, 200}
                    ,{20, 20, 20}
                    ,{30, 30, 30}
                    ,{40, 40, 40}
                    };

	int sum = 0;
	
	for(int i=0; i<score.length; i++) { //score.length = 4
	for(int j=0; j<score[i].length; j++) { //score[i].length = 3
	
	System.out.printf("score[%d][%d]=%d%n",i,j,score[i][j]);
	
	sum += score[i][j];
	}
	}
	
	System.out.println("sum=" + sum);

}
}


//score[0][0]=100
//score[0][1]=100
//score[0][2]=200
//score[1][0]=20
//score[1][1]=20
//score[1][2]=20
//score[2][0]=30
//score[2][1]=30
//score[2][2]=30
//score[3][0]=40
//score[3][1]=40
//score[3][2]=40
//sum=670