🟨 목 차 🟨
1. 하나에 많은 것을 담을 수 있는 배열이라는게 있다는데?
2. 배열의 기본값
3. 배열을 선언하는 또 다른 방법
4. 별로 사용하지는 않지만, 알고 있어야 하는 2차원 배열
5. 배열의 길이는 어떻게 알 수 있을까 ?
6. 배열을 위한 for 루프
◼️ 1. 하나에 많은 것을 담을 수 있는 배열이라는게 있다는데? ◼️
지금까지는 기본 자료형에는 하나의 값만 넣을 수 있다. 그런데 int나 long을 하나만 만들어서 여러 개의 값을 넣어 둘 수는 없을까?
==> 한 변수에 여러 개의 값을 넣을 수 있는 것이 바로 배열이다.
배열 : 한 가지 타입에 대해서, 하나의 변수에 여러 개의 데이터를 넣을 수 있다.
[EX] : int [] lottoNumbers; int lottoNumbers[];
위에서 예시를 보게되면 대괄호를 열고 닫음으로써, 해당 변수가 배열이라는 것을 정의할 수 있다. 또한 대괄호 안에는 아무것도 써주면 안된다. [ 위의 예시를 보게 되면 보통 첫번째의 방법인 타입과 변수명 사이에 대괄호를 넣는 것을 권장한다. ]
선언한 배열은 몇 개 의 데이터가 들어가는 지 알 수가 없다.
==> 따라서 초기화를 해줘야한다. [ int [] lottoNumbers = new int[7]; ]
위의 초기화하는 것을 보면 new를 이용한 것을 알수 있다.
즉, 배열은 new를 사용하는 참조 자료형이다. ( 참고로, 꼭 new를 사용하여 정의해야 하는 방법만 있는게 아니다. 추후에 배운다.)
아래는 배열 선언 방법이다. (아래는 배열의 크기가 7이다. 배열은 0번부터 시작하기 때문에 0부터 6번까지 있다.)
int [] lottoNumbers;
lottoNumbers = new int[7];
아래는 선언한 배열에 값을 지정한 것이다.
lottoNubers[1] = 15;
배열의 잘못된 부분(존재하지 않는 배열 부분)에 값을 할당하면 컴파일할 때는 아무런 이상이 없지만, 실행할 때 ArrayIndexOutOfBoundsException이라는 오류가 발생하며 우리가 잘못 지정한 위치의 숫자가 뜰 것이다.
예를 들어 배열의 크기가 7인데, [7]에 값을 지정하면 ArrayIndexOutOfBoundsException: 7 이라는 오류가 뜰 것이다.
◼️ 2. 배열의 기본값 ◼️
기본 자료형 배열의 기본값은 각 자료형의 기본값과 동일하다.
지역 변수의 경우에는 초기화를 하지 않으면 사용이 불가능하다고 이야기를 했다. 하지만 배열에서는 지역 변수라고 할 지라도, 배열의 크기만 정해주면 문제가 발생하지 않는다.
다른 값들의 기본 자료형 배열의 기본값은 0이나 0.0 인데, boolean 경우 false이다.
모든 참조 자료형(String)은 초기화를 하지 않으면 null 값이다.
*null : 아무런 값도 설정되어 있지 않고 초기화도 되어 있지 않은 상태
◼️ 3. 배열을 선언하는 또 다른 방법 ◼️
위에서는 new ini[1]; 와 같이 new라는 예약어를 사용하고, 타입과 크기를 지정해서 배열을 선언했다. 그런데 중괄호를 사용하면 한번에 배열을 선언할 수도 있다.
[EX]
package Part7;
public class Arrayinitialize {
public static void main(String[] args) {
}
public void otherInit() {
int []lottoNumbers= {5,12,23,25,38,41,2};
int []lottoNumbers2; // 문법 오
lottoNumbers2= {5,12,23,25,38,41,2}; //
}
}
위의 코드에서 중괄호를 사용하는 방법에서는 변수 선언 및 초기화를 같이 해야만 한다. 말고 두줄에 걸쳐 변수 선언 후 초기화를 하는 방법은 오류가 난다.
보통 프로그래밍 언어를 배우는 사람들은 이 방법이 제일 쉬워서 이 방법만 쓸 것이다.
하지만, 모든 배열에 들어가는 값들이 처음부터 정할 수 있는 상황이 되지는 않는다. 배열에 들어가는 값이 계속 바뀔수도 있고 언제든지 변경이 가능하기 때문이다.
==> 그렇기에 보통 절대 변경되지 않는 값 을 지정할 때 중괄호로 선언하여 사용한다.
또한 12월달의 달을 사용할때는 변하지 않는 값이다. 그렇기에 메소드 내에서 선언하여 사용하는 것보다는, 클래스의 변수(static)로 선언하여 재활용하는 것이 좋다.
==> 이유는 달을 사용하려는 클래스의 객체를 생성할 때마다 moth라는 배열이 생성되기 떄문에 static(클래스 변수)으로 설정하여 재활용을 한다.
◼️ 4. 별로 사용하지는 않지만, 알고 있어야 하는 2차원 배열 ◼️
2차원, 3차원, 4차원 배열을 만들 수 있다. 이 책에서는 2차원 이상의 배열은 웬만하면 사용하지 않는것을 권장한다.
==> 본인이 코드를 작성할 때는 이해하고 기억하면서 작성했지만, 다른 사람이 그 코드를 볼 때에는 이해하기 힘들 수 있기 때문이다.
예제를 보며 이해를 해보자.
[EX]
package Part7;
public class ArrayTwoDimension {
public static void main(String[] args) {
}
public void twoDimensionArray() {
int [][]twoDim;
twoDim = new int[2][3];
}
}
위의 예저를 보듯이 2차원 배열을 나타낼 때에는 두개의 대괄호를 타입과 변수명 사이에 선언하면 된다. [꼭 대괄호를 타입과 변수명 사이에 선언 할 필요는 없다.]
int [] twoDim[]; , int twoDim[][]; ==> 이 두가지 선언법도 맞는 방법이다.
1차원 배열처럼 타입과 배열 변수명 사이에 대괄호들을 넣는 것을 권장한다.
1차원 배열에서는 twoDim[0]은 int 값이었다. 하지만, 2차원 배열에서는 twoDim[0]는 int 값이 아니라 배열이다.
==> 즉, twoDim[0][0]의 값이 int 값이다. [ 완전 중요]
위의 코드에서 2차원 배열의 크기는 2층으로 되어 있고, 한 층에 3개의 집이 있는 아파트 같은 공간이 만들어졌다.
==> 즉, 다시 말해서 총 공간의 개수는 1차원 2개 공간, 2차원 3개 공간이므로,
twoDim[0]이 3개의 공간을 가지고 있고, twoDim[1]도 3개의 공간을 가지기 때문에 2x3=6개 의 공간을 가지게 된다.
[ 배열은 0부터 시작하기 때문에 오해하지 말길 ]
2차원 배열을 선언할때 1차원의 크기만 지정하고, 2차원의 크기를 지정하지 않을 수도 있다. 하지만, 1차원 배열은 빈 공간으로 놔두고, 2차원 배열만 지정하거나, 두 배열의 공간의 크기를 모두 지정 안하면 안된다. [ twoDim=new int[2][]; ==> 맞는 방법]
==> 즉, twoDim=new int[][]; / twoDim=new int[][2]; 이 두 가지는 오류가 뜬다.
twoDim=new int[2][]; 에 대해서 twoDim[0] 배열의 크기는 어떻게 될까? 정해주지 않아도 되는 것일까?
==> 아니다. 반드시 정해줘야 한다. 즉 1차원 배열을 선언한 다음에는 2차원 배열을 다음과 같이 선언해주면 된다.
twoDim[0] = new int[3];
twoDim[1] = new int[2];
또한 중괄호를 이용한 배열 선언을 2차원 배열에서도 사용할 수 있다.
int [][]twoDim={{1,2,3,},{4,5,6}};
이렇게도 나타낼 수 있다.
int [][] twoDim=new int[2][3];
twoDim [0][0]=1;
twoDim [0][1]=2;
twoDim [0][2]=3;
twoDim [1][0]=4;
twoDim [1][1]=5;
twoDim [1][2]=6;
위에 있는 배열에 선언되어 있는 값을 출력하려면 어떻게 해야할까?
==> 가장 편한 방법은 for 루프를 사용하는 것이다. [ for 루프를 사용하기 전에 배열의 길이를 확인하는 방법을 알아야한다. ]
◼️ 5. 배열의 길이는 어떻게 알 수 있을까 ?◼️
자바에서 배열의 길이를 알아내는 방법은 아주 간단하다. 배열 이름에 .length를 붙여주면 된다.
package Part7;
public class ArrayLength {
public static void main(String[] args) {
ArrayLength exam = new ArrayLength();
exam.printArrayLength();
}
public void printArrayLength() {
int [] oneDim=new int[3];
int [][] twoDim= new int[4][2];
System.out.println(oneDim.length);
System.out.println(twoDim.length);
}
}
3
4
1차원 배열의 결과는 3으로 예상하기 쉬웠을 것이다.
2차원 배열의 길이의 경우에는 애매하게 1차원의 크기를 알려준다.
만약 2차원 배열의 크기를 알고 싶다면, 각 1차원 배열에 .length를 붙여야만 한다.
==> 즉, twoDim[0].length, twoDim[1].length 처럼 각 1차원 배열의 길이를 알려달라고 하면 된다.
또한 int twoDim0_0Length=twoDim[0][0] 를 사용하는것은 옳지 않다.
==> 왜냐하면 twoDim[0][0]는 배열 객체를 나타내느 것이 아니라 값이 들어있는 공간이다. [ []를 사용해야만 배열로 인식한다. ]즉, int와 같은 모든 기본 자료형에는 절대로 .length와 같이 점을 찍어서 기능을 호출하거나 게산을 할 수 없다. 즉 배열과 같이 참조 자료형에서만 점(.)을 찍을 수 있다.
배열의 크기를 알았으니 배열의 값을 출력해보도록 하자.
[EX]
package Part7;
public class ArrayLength {
public static void main(String[] args) {
ArrayLength exam = new ArrayLength();
// exam.printArrayLength();
exam.printArray();
}
public void printArrayLength() {
int [] oneDim=new int[3];
int [][] twoDim= new int[4][2];
System.out.println(oneDim.length);
System.out.println(twoDim.length);
}
public void printArray() {
int [][]twoDim= {{1,2,3,},{4,5,6}};
System.out.println("twoDim.length="+twoDim.length);
System.out.println("twoDim[0].length="+twoDim[0].length);
for(int oneLoop=0; oneLoop<2; oneLoop++) {
for(int twoLoop=0; twoLoop<3; twoLoop++) {
System.out.println("twoDim["+oneLoop+"]["+twoLoop+"]="
+twoDim[oneLoop][twoLoop]);
}
}
}
}
twoDim.length=2
twoDim[0].length=3
twoDim[0][0]=1
twoDim[0][1]=2
twoDim[0][2]=3
twoDim[1][0]=4
twoDim[1][1]=5
twoDim[1][2]=6
위의 코드를 보게 되면 2x3 총 6개의 공간밖에 없어서 일일이 출력 할 수 있겠지만, 데이터가 100개,1000개가 넘어가면 일일이 출력이 불가능하다.
==> 따라서 대부분 배열의 내용을 확인할 때에는 for 루프나 while문을 사용한다.
위의 코드에서 for 루프를 출력하는 것은 그리 좋은 방법은 아니다.
==> 왜냐하면 twoDim이라는 배열의 크기를 알고 있기 때문에 직접적으로 값을 넣어주었는데, 배열의 크기를 모를때는 length를 이용하여 배열의 크기를 직접 구하는 조건을 넣어주면 될 것이다. 아래의 경우 처럼 말이다.
for(int oneLoop=0; oneLoop<twoDim.length; oneLoop++) {
for(int twoLoop=0; twoLoop<twoDim[oneLoop].length; twoLoop++) {
System.out.println("twoDim["+oneLoop+"]["+twoLoop+"]="
+twoDim[oneLoop][twoLoop]);
}
}
이것보다 더 효율적으로 짜는 방법은 별도의 크기를 알아내는 변수를 할당하여 사용하는것이 가장 효과적이다. 아래의 경우처럼 말이다.
int twoDimlength=twoDim.length;
for(int oneLoop=0; oneLoop<twoDimlength; oneLoop++) {
int twoOneDimlength= twoDim[oneLoop].length;
for(int twoLoop=0; twoLoop<twoOneDimlength; twoLoop++) {
System.out.println("twoDim["+oneLoop+"]["+twoLoop+"]="
+twoDim[oneLoop][twoLoop]);
}
}
◼️ 6. 배열을 위한 for 루프 ◼️
앞에서 배운 for 루프를 보게 되면 아무리 성능을 위한다고 하더라도 for 루프 부분이 너무 복잡하다.
==> 배열에서 for 루프를 편하게 사용할 수 있도록, 다음 문법이 추가됐다.
for(타입이름 임시변수명 : 반복대상객체) {
}
위의 문법을 보게되면 for 루프 안에 세미콜론이 두 개 들어가는 구조가 아닌, 콜론(:) 하나만 들어가는 문법이다.
괄호 안에 콜론 앞에는 배열의 각 항목을 처리하기 위한 "타입이름"과 "임시 변수명"을 지정해준다.
그 다음 콜론 뒤에는 반복을 수행할 대상 객체(여기서는 배열)가 위치한다.
[ 여기서 객체 부분에는 뒤에서 배울 Collection의 일부 클래스를 사용할 수 있다. ]
[EX]
package Part7;
public class ArrayNewFor {
public static void main(String[] args) {
ArrayNewFor exam = new ArrayNewFor();
exam.newFor();
}
public void newFor() {
int [] oneDim=new int[] {1,2,3,4,5,6,7,8,9,10};
for(int data:oneDim) {
System.out.println(data);
}
}
}
여기서 for의 소괄호 안을 보게 되면 int data라고 있는데 , 이것은 oneDim 배열의 각 데이터를 임시에 담아둘 변수의 이름이다.
앞 부분서 배운 2차원 배열의 아래 코드를 콜론으로 다시 작성해보자.
int twoDimlength=twoDim.length;
for(int oneLoop=0; oneLoop<twoDimlength; oneLoop++) {
int twoOneDimlength= twoDim[oneLoop].length;
for(int twoLoop=0; twoLoop<twoOneDimlength; twoLoop++) {
System.out.println("twoDim["+oneLoop+"]["+twoLoop+"]="
+twoDim[oneLoop][twoLoop]);
}
}
아래 코드는 콜론을 사용하는 for 루프를 사용한 코드이다.
public void twoDimFor() {
int[][]twoDim= {{1,2,3},{4,5,6}};
for(int[] dimArray : twoDim) { //twoDim의 1차원 값은 배열이기 때문에 그냥 int dimArray가 아니라int[] dimArray로 지정해
for(int data : dimArray) { //dimArray의 1차원 값은 int이기 때문에 int data라고 썼다.
System.out.println(data);
}
}
}
첫번째 루프안의 소괄호에서 twoDim이라는 배열의 1차원 값은 배열이기 때문에 그냥 int dimArray가 아니라, int[] dimArray로 지정해주었다.
두번째 루프안의 소괄호에서는 dimArray의 1차원 값이 int 타입이기 때문에 int data라고 지정했다.
==> 배열의 값만을 처리할 필요가 있을 때는 이 문법을 사용하는 것이 편하나, 1차원 배열과 2차원 배열의 위치를 모른다는 것이다. 그래서 위치를 확인하기 위해서 임시변수를 두어야만 한다.
[EX]
public void twoDimForWithCounter() {
int[][]twoDim = {{1,2,3,},{4,5,6}};
int oneCounter=0;
for(int[] dimArray : twoDim) {
int twoCounter=0;
for(int data : dimArray){
System.out.println(data +" "+ oneCounter +" "+ twoCounter);
twoCounter++;
}
oneCounter++;
}
}
1 0 0
2 0 1
3 0 2
4 1 0
5 1 1
6 1 2
'JAVA > 자바의신 1' 카테고리의 다른 글
9장 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요 (0) | 2022.09.07 |
---|---|
8장 참조 자료형에 대해서 더 자세히 알아보자. (0) | 2022.09.06 |
6장 제가 조건을 좀 따져요(if ,for, while, continue, break) (0) | 2022.09.03 |
5장 계산을 하고 싶어요 (0) | 2022.09.03 |
4장 정보를 어디에 넣고 싶은데? (1) | 2022.09.02 |