2차원은 면으로 구성되어 있다.
면은 여러 개의 선으로 구성된다.
즉, 2차원 배열 또한 여러 개의 1차원 배열로 구성될 수 있다.
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
int [][] arr = new int[10][10]; // 2차원 배열 명시
for(int j = 0 ; j < 10 ; j++) {
for(int k = 0 ; k < 10 ; k++) {
arr[j][k] = j * k;
}
}
for(int j = 0 ; j < 10 ; j++) {
for(int k = 0 ; k < 10 ; k++) {
System.out.print(arr[j][k] + "\t");
} System.out.println();
}
}
}
메모리 구조를 살펴보면 1차원 배열에서는 기본 자료형이 입력되어 있던 공간에 배열에 들어가 있는 것을 알 수 있다. 즉, 2차원 배열이란, "배열의 배열"이 된다
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
// 배열의 크기를 관리하는 변수 : ArrayNum
final int ArrayNum = 5;
// 클래스 배열 변수 : CE_Array
// 배열 변수 사이즈 지정( ArrayNum크기 만큼 배열 사이즈 지정 )
ClassExample[] CE_Array = new ClassExample[ArrayNum];
// 각 배열칸의 객체 초기화( new 객체 )
// 생성자를 통해 객체의 iIndex 변수 초기화
for(int j = 0 ; j < ArrayNum ; j++) {
CE_Array[j] = new ClassExample(j);
}
// 객체 사용( Print_iIndex 메소드 사용 )
for(int j = 0 ; j < ArrayNum ; j++) {
CE_Array[j].Print_iIndex();
}
}
}
class ClassExample {
int iIndex;
public ClassExample(int i) {
iIndex = i;
}
public void Print_iIndex() {
System.out.println(iIndex);
}
}
ClassExample은 멤버변수 iIndex와 Print_iIndex 메소드를 가지고 있다.
main 메소드에서 이 클래스를 활용하여 클래스 배열을 만들고 사용하고 있다
ArrayNum은 배열의 길이를 지정하는 상수이다.
배열을 사용할 때 반복문과 함께 사용하는 경우가 많아 위처럼 배열의 길이를 상수로 지정하는 것이 일반적이다.
변수의 사이즈를 변경해야 할 시, 상수의 숫자만 변경하여 배열 길이를 조정할 수 있기 때문에 소스코드의 유지보수에 또한 용이하다.
ClassExample[] CE_Array = new ClassExample[ArrayNum];
클래스 배열 변수를 선언하고 배열의 크기를 지정해줬지만 객체가 생성되는 것은 아니다!
클래스 배열 변수를 선언하며 new를 사용했지만, 이는 생성자는 콜하는 것이 아니기 때문에 객체를 생성하는 것 또한 아니다.
이 코드는 오직 배열의 크기를 지정해주는 역할만 수행하며
CE_Array[j] = new ClassExample(j);
객체는 이 코드에서 생성된다.
반복문과 함께 각 배열칸에 new ClassExample(j)를 사용하여 각 객체에 메모리를 할당한다.
둘 다 new를 사용하는 소스코드이지만 역할이 다르다.
for(int j = 0 ; j < ArrayNum ; j++) {
CE_Array[j].Print_iIndex();
}
위 코드는 배열에 생성된 객체의 메소드를 사용하는 소스코드이다. 일반적인 배열에서 데이터를 불러왔던 것 처럼
배열이름[인덱스] 형태로 사용되며 이 때 불러와진 데이터는 클래스이므로 .메소드를 붙여 사용할 수 있다.