1. 하나에 많은 것을 담을 수 있는 배열 자료구조
기본 자료형의 경우에는 하나의 변수에 하나의 자료만을 넣을 수 있습니다.
배열은 한 가지 타입에 대해서 하나의 변수에 여러 개의 데이터를 넣을 수 있습니다.
1
2
|
int [] lottoNumbers;
int lottoNumbers[];
|
|
자바에서 기본 자료형의 배열은 다음과 같이 선언 할 수 있습니다. 로또 번호 7개를 저장하는 배열을 선언하였습니다.
이와 같이 변수를 선언할 때 대괄호를 열고 닫음으로써, 해당 변수가 배열이라는 것을 정의 합니다.
여기서 중요한 것은 배열 변수를 정의할 때 대괄호 안에는 아무것도 써주면 안된다는 것입니다.
또한 보통은 타입과 변수명 사이에 대괄호를 넣는 것을 권장합니다.
1
|
int [] lottoNumbers = new int[7];
|
|
이렇게 선언한 배열에 몇개의 데이터가 들어가는지 초기화를 해주었습니다. 등호 우측에는 "new int[7];"과 같이 new를 써준 후 타입 이름을 명시해 주고, 대괄호 안에 해당 배열의 크기를 지정해줍니다.
배열도 참조 자료형이기 때문에 객체를 생성할 때에는 반드시 new를 사용해야합니다.
2. 배열의 기본값
기본 자료형 배열의 기본값은 각 자료형의 기본값과 동일 합니다. 지역 변수의 경우에는 초기화를 하지 않으면 사용이 불가능 합니다. 하지만, 배열에서는 지역 변수라고 할지라도, 배열의 크기만 정해주면 에러가 발생하지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class Main{
public static void main(String[] args) {
byte []byteArray = new byte[1];
short []shortArray = new short[1];
int []intArray = new int[1];
long []longArray = new long[1];
float []floatArray = new float[1];
double []doubleArray = new double[1];
char []charArray = new char[1];
boolean []booleanArray = new boolean[1];
System.out.println("byteArray[0]="+byteArray[0]);
System.out.println("shortArray[0]="+shortArray[0]);
System.out.println("intArray[0]="+intArray[0]);
System.out.println("longArray[0]="+longArray[0]);
System.out.println("floatArray[0]="+floatArray[0]);
System.out.println("doubleArray[0]="+doubleArray[0]);
System.out.println("charArray[0]="+charArray[0]);
System.out.println("booleanArray[0]="+booleanArray[0]);
}
}
|
|
위의 코드의 실행결과를 확인해 보면 다음과 같습니다.
이렇게 각 배열의 크기만 잡아주면, 초기화를 하지 않아도 각 배열의 기본값이 할당 됩니다.
위와 다르게, String이나 참조 변수형은 초기화를 하지 않을 경우 "null"을 출력합니다.
String의 경우 new String();과 같이 생성자를 사용하지 않고, 쌍따옴표 만으로 정의가 가능합니다.
3. 배열 그냥 출력해보기
다음과 같이 배열을 그냥 출력해 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class Main{
public static void main(String[] args) {
byte []byteArray = new byte[1];
short []shortArray = new short[1];
int []intArray = new int[1];
long []longArray = new long[1];
float []floatArray = new float[1];
double []doubleArray = new double[1];
char []charArray = new char[1];
boolean []booleanArray = new boolean[1];
System.out.println("byteArray[0]="+byteArray);
System.out.println("shortArray[0]="+shortArray);
System.out.println("intArray[0]="+intArray);
System.out.println("longArray[0]="+longArray);
System.out.println("floatArray[0]="+floatArray);
System.out.println("doubleArray[0]="+doubleArray);
System.out.println("charArray[0]="+charArray);
System.out.println("booleanArray[0]="+booleanArray);
}
}
|
|
맨 앞의 '['은 배열을 뜻합니다. 대괄호 뒤에는 해당 타입을 대표하는 문자가 출력됩니다. 하지만 long의 배열과 boolean의 배열만이 각각 J와 Z로 되어 있습니다. 왜냐하면 long 타입을 L로 해 버리면 참조 자료형의 배열과 구분이 안 되기 때문에 남아 있는 알파벳 중에서 J를 사용하기로 한것이고 boolean의 B는 이미 byte 타입이 선점했기 때문에 Z를 사용한 것입니다.
4. 배열을 선언하는 또 다른 방법
지금까지의 방법 외에도 중괄호를 사용하면 한번에 배열을 선언할 수 있습니다. 주의할 점으로는 중괄호를 사용하여 초기화를 할 때에는 반드시 한번에 변수 선언 및 초기화가 이루어져야만 한다는 것 입니다.
1
2
3
4
5
6
7
|
public class Main{
public static void main(String[] args) {
int [] lottoNumbers = {5,12,23,25,38,41,2};
}
}
|
|
보통 "절대 변경되지 않는 값"을 지정할 때 이렇게 중괄호로 선언하여 사용합니다. 예를 들어 "월"을 나타내는 단어를 나열하는 경우가 여기에 속합니다.
5. 2차원 배열
2차원 이상의 배열은 웬만하면 사용하지 않는 것을 권장합니다. 왜냐하면 본인이 코드를 작성할 때에는 이해하고기억하면서 작성했지만, 다른 사람이 코드를 볼 때에는 아주 이해하기 힘들 수도 있기 때문입니다.
1
2
3
4
5
6
7
8
9
|
public class Main{
public static void main(String[] args) {
int [][]twoDim1;
int []twoDim2[];
int twoDim3[][];
twoDim1 = new int[2][3];
twoDim2 = new int[2][3];
twoDim3 = new int[2][3];
}
}
|
|
위의 코드와 같이 2차원 배열을 선언하는 방법은 여러가지 입니다. 하지만, 1차원 배열처럼 타입과 배열 변수명 사이에 대괄호들을 넣는 것을 권장합니다.
2차원 배열은 다음과 같이 선언할 수도 있습니다.
1
2
3
4
5
6
7
8
9
|
public class Main{
public static void main(String[] args) {
int [][]twoDim1 = new int[2][];
int [][]twoDim2 = new int[][]; //x
int [][]twoDim3 = new int[][2]; //x
}
}
|
|
1차원 배열의 크기만 지정하고, 2차원 배열의 크기를 지정하지 않을 수도 있습니다. 하지만 1차원 배열은 빈 공간으로 놔두고, 2차원 배열만 지정하거나, 두 배열의 공간의 크기를 모두 지정하면 안됩니다.
또한 첫번째 방법으로 배열을 선언했을때 twoDim1[0]배열의 크기는 반드시 정해줘야 합니다. 이렇게 1차원 배열을 선언한 다음에는 2차원 배열을 다음과 같이 선언해 주면 됩니다.
1
2
3
4
5
6
7
8
9
10
|
public class Main{
public static void main(String[] args) {
int [][]twoDim1 = new int[2][];
twoDim1[0] = new int[3];
twoDim1[1] = new int[2];
}
}
|
|
이 방식을 사용하면 2차원 배열의 공간의 크기를 서로 다르게 지정할 수 있습니다.
또한 앞절에서 배운 중괄호를 이용한 배열 선언을 2차원 배열에서도 사용할 수도 있습니다.
1
2
3
4
5
6
7
|
public class Main{
public static void main(String[] args) {
int [][]twoDim = {{1,2,3}, {4,5,6}};
}
}
|
|
6. 배열의 길이
자바에서 배열의 길이를 알아내는 방법은 배열 이름에 .length를 붙여 주면 됩니다.
1
2
3
4
5
6
7
8
9
10
|
public class Main{
public static void main(String[] args) {
int [] lottoNumbers = {5,12,23,25,38,41,2};
int lottoNumbersLength = lottoNumbers.length;
System.out.println(lottoNumbersLength);
}
}
|
|
다음 코드를 실행하면 lottoNumbers 배열의 길이가 7이라는 결과를 알 수 있습니다.
2차원 배열의 길이는 어떻게 확인할 수 있을까요?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Main{
public static void main(String[] args) {
int [][] twoDim = {{1,2,3}, {4,5,6}};
System.out.println(twoDim.length);
System.out.println(twoDim[0].length);
}
}
|
|
첫번째 출력값은 2, 두번째 출력값은 3임을 확인할 수 있습니다. 첫번째 결과는 1차원 배열의 크기가 2이기 때문에 2라는 결과값이 나왔습니다. twoDim[0].length의 결과는 3이 나왔는데, 이는 2차원 배열의 크기는 3이기 때문입니다. 이렇게 1차원 배열의 크기를 출력하려면 대괄호 없이 .length를 붙이면 되고, 2차원 배열의 크기를 출력하려면 각 1차원 배열의 위치를 대괄호에 명시한 후 .length를 붙이면 됩니다.
이러한 배열의 길이를 이용하여 배열을 순회할 때 다음과 같은 방법을 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Main{
public static void main(String[] args) {
int [][] twoDim = {{1,2,3}, {4,5,6}};
for(int i=0;i<twoDim.length;i++) {
for(int j=0;j<twoDim[i].length;j++) {
System.out.println(twoDim[i][j]);
}
}
}
}
|
|
이렇게 하면 배열의 크기가 가변적이라고 할지라도 정확하게 데이터를 출력해 줄 수 있습니다. 하지만 이렇게 .length를 사용하여 for루프가 수행될 때마다 길이를 얻어오는 것은 성능적으로 좋지 않습니다. 다음과 같이 별도의 크기를 알아내는 변수를 할당하여 사용하는 것이 가장 효과적입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class Main{
public static void main(String[] args) {
int [][] twoDim = {{1,2,3}, {4,5,6}};
int twoDimLength = twoDim.length;
for(int i=0;i<twoDimLength;i++) {
int twoDim1Length = twoDim[i].length;
for(int j=0;j<twoDim1Length;j++) {
System.out.println(twoDim[i][j]);
}
}
}
}
|
|
7. 배열을 위한 for 루프
자바에서 제공되는 Collection이라는 자료구조를 처리할 때 for 루프를 보다 쉽게 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
|
public class Main{
public static void main(String[] args) {
for(타입이름 임시변수명 : 반복대상객체){
}
}
}
|
|
예시를 하나 들어봅시다.
1
2
3
4
5
6
7
8
9
10
11
|
public class Main{
public static void main(String[] args) {
int []lottoNumbers = {1,2,3,4,5,6,7};
for(int temp : lottoNumbers){
System.out.println(temp);
}
}
}
|
|
다음과 같이 로또 넘버를 저장하고 있는 배열을 순회한다면, 따로 길이를 구하지 않더라도 쉽게 for문을 수행할 수 있습니다.
2차원 배열에서는 어떻게 사용할까요?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Main{
public static void main(String[] args) {
int [][] twoDim = {{1,2,3}, {4,5,6}};
int twoDimLength = twoDim.length;
for(int [] tempArray: twoDim) {
for(int temp: tempArray) {
System.out.println(temp);
}
}
}
}
|
|
첫번째 for 루프 안의 소괄호를 살펴보면, twoDim이라는 배열의 1차원 값은 배열입니다. 따라서 int[] tempArray로 지정해 두었습니다.
두번째 for문을 살펴보면, tempArray 배열의 1차원 값이 int 타입이기 때문에 int temp라고 지정했습니다.
이렇게 사용했을 때의 단점은 위치를 모른다는 것입니다. 따라서 위치를 확인하려면 임시변수를 두어서 위치를 확인해야합니다.
'Java' 카테고리의 다른 글
[Java] 8. Pass by Value, Pass by reference (0) | 2019.03.03 |
---|---|
[Java] 7. 참조 자료형 (0) | 2019.03.03 |
[Java] 5. switch문 (0) | 2019.03.01 |
[Java] 4. 자바에서의 연산 순서 (0) | 2019.02.25 |
[Java] 3. 자바의 자료형 (0) | 2019.02.25 |