지금까지 1차원 배열을 활용하여 배열을 사용하였다.
이제 2차원 배열을 배우고 이를 활용하는 방법을 배워보자
정방배열은 횡과 열의 갯수가 같은 것을 말한다.
비정방배열은 횡, 열의 개수가 다른 것을 말한다.
배열 안에 배열이 존재함
RAM에서의 모습
쉽게 이해하기 위한 모습
접근 법 : arrData[0]일 경우 +0의 배열에 접근
arrData[0][2]일 경우 3의 값에 접근
arrData[2][1]일 경우 8의 값에 접근
2차원 배열은 배열에 2번 접근해야 값에 접근이 가능하다.
1번 접근하여 배열 자체를 수정하는 것 또한 가능하다
ex) int arrData[0] = arData;
선언 방법.
자료형 [][] 배열명 = new 자료형[행][열];
자료형 [][] 배열명 = {
{값1, 값2...},
{값1, 값2...}
};
3차원 배열이란?
3면 4행 5열
4차원 배열이란?
2의 3면 4행 5열
문제. 나이키 매장의 지점별, 연령별 각 매출액을 구하고 지점, 연령별 총 매출액, 평균매출액, 총 매장의 총 매출액, 평균 매출액을 나타내는 코드를 만드시오.
지점은 3개(강남, 서초, 송파)이며 연령은 전연령, 키즈 매장으로 구분.
view단은 JOption으로 소통할 것이다.
이 매장은 총 3개, 연령이 구분되어 있는 것은 2개씩 총 6개의 배열을 만들어야 한다. 여기서 전연령과 키즈의 구분이 모호함으로 전연령을 성인으로 하겠다.
성인 강남, 서초, 송파와 키즈 강남, 서초, 송파로 나뉘어 각 매장의 매출을 구하는데 1차원에 연령을 담고 2차원에 매장을 배열로 담으면 될 것 같다.
시각적으로 표현하면 다음과 같다.
배열의 모습
강남A[0][0], 서초A[0][1], 송파A[0][2]
강남K[1][0], 서초K[1][1], 송파K[1][2]
여기서 정수를 사용하는 이유는 매출액은 정수로 표현하기 때문이다.
int [][] arrIncome = new int [2][3];
다음 우리는 각각 매출액을 입력 받아야되니 JOption.showinput을 사용 할 것이고 [i][j] 2차원 배열에 모든 값을 담아야되니 먼저 for구문을 i반복 만들고 for문안에 j반복 for문을 만들어 반복시키면 되겠다.
또한 반복문에서 반복횟수는 여러번 쓰일 것 같으니 변수로 저장하도록 하자
arrIncome에 값을 담을때 문자열로 되어있어서 오류가 난다. 정수형으로 변환시켜서 담도록 하자. 그리고 매출액을 모두 입력 받으면 합쳐야 되니 sum을 만들고 누적함수로 저장하도록 하자.
int rLength = arrIncome.length;
int cLength = arrIncome[0].length;
for (int i = 0; i < rLength; i++) {
for (int j = 0; j <cLength; j++) {
arrIncome[i][j] = Integer.parseInt(JOptionPane.showInputDialog(arrName[i][j]+menuMsg));
sum += arrIncome[i][j];
}
}
avg = Double.parseDouble(String.format("%.2f", (double)sum/(rLength*cLength)));
또한 우리는 연령별 매출액과 지점별 총 매출액을 구해야 된다.
연령별 매출액을 구하기위해 먼저 연령별 매출액의 배열을 만들자.
연령별은 강남~송파매장까지 첫번째 배열의 합, 두번째 배열의 합을 각각 담으면 됨으로 배열의 길이를 2로 1차원배열을 만들면 되겠다.
또한 그 배열에 값을 담기 위해서 i만큼 반복 시키면 되겠다.
배열의 이름 : arAsum
매장별은 강남의 성인,키즈의 합 / 서초의 성인,키즈의 합 / 송파의 성인,키즈의 합으로 나와야 됨으로 길이를 3인 1차원배열로 만들면 되고 그 배열을 담기위해 j만큼 반복시키면 되겠다.
배열의 이름 : arBsum
int [] arAsum = new int[2];
int [] arBsum = new int[3];
for (int i = 0; i < rLength; i++) {
result += "-------------------------\n";
for (int j = 0; j <cLength; j++) {
arrIncome[i][j] = Integer.parseInt(JOptionPane.showInputDialog(arrName[i][j]+menuMsg));
sum += arrIncome[i][j];
arAsum[i] += arrIncome[i][j];
arBsum[j] += arrIncome[i][j];
}
}
연령별 매출액은 키즈와 성인의 매출을 구한값에서 성인에서 3을 나누고 키즈에서 3을 나누어야 각각 키즈, 성인 매출의 평균을 구할 수 있다.
따라서 각각의 총 매출에서 길이가 3인 arBsum.length를 이용해 나누고 소숫점 2자리수표현과 실수로 변환까지 시켜서 값을 담도록 하자. 또한 이 값은 배열의 길이가 2만큼 들어가니 평균의 1차원배열을 따로 만들자
배열의 이름 : aAvg, 길이가 2만큼 반복
double [] aAvg = new double[2];
for (int i = 0; i < rLength; i++) {
aAvg[i] = Double.parseDouble(String.format("%.2f", (double)arAsum[i]/arBsum.length));
}
매장별 매출액은 강남, 서초, 송파 매출을 구한 값에서 강남에서 2, 서초에서 2, 송파에서 2를 각각 나누어야 각 매장별 평균매출액을 구할 수 있다. 따라서 각 매장별 매출액에서 길이가 2인 arAsum.length를 이용하여 평균매출액을 구하고 위와 동일하게 1차원배열을 담아 값을 저장하도록 하자
배열의 이름: bAvg, 길이가 3만큼 반복
double [] bAvg = new double[3];
for (int i = 0; i < cLength; i++) {
bAvg[i] = Double.parseDouble(String.format("%.2f", (double)arBsum[i]/arAsum.length));
}
성인은 강남A, 키즈는 강남K로 하자
또한 결과가 많으니 점선을 추가 누적 하도록 하자.
String [][] arrName = {{"강남K", "서초K", "송파K"},{"강남A","서초A","송파A"}};
for (int i = 0; i < rLength; i++) {
result += "-------------------------\n";
for (int j = 0; j <cLength; j++) {
arrIncome[i][j] = Integer.parseInt(JOptionPane.showInputDialog(arrName[i][j]+menuMsg));
sum += arrIncome[i][j];
arAsum[i] += arrIncome[i][j];
arBsum[j] += arrIncome[i][j];
result += arrName[i][j] + " 매출액" + arrIncome[i][j]+"백만원\n";
}
}
여기서 연령별 매출액의 이름도 따로 배열로 선언하였다. 표시를 키즈매장, 성인매장을 하기 위함이다.
String [] aName = {"키즈점", "성인점"};
for (int i = 0; i < rLength; i++) {
aAvg[i] = Double.parseDouble(String.format("%.2f", (double)arAsum[i]/arBsum.length));
result += aName[i]+" 총 매출액 " + arAsum[i] + "백만원\n";
result += aName[i] + " 평균 매출액 " + aAvg[i] + "백만원\n";
result += "-------------------------\n";
}
String [] bName = {"강남점", "서초점", "송파점"};
for (int i = 0; i < cLength; i++) {
bAvg[i] = Double.parseDouble(String.format("%.2f", (double)arBsum[i]/arAsum.length));
result += bName[i]+" 총 매출액 " + arBsum[i] + "백만원\n";
result += bName[i] + " 평균 매출액 " + bAvg[i] + "백만원\n";
result += "-------------------------\n";
}
result += "총 매출액 " + sum + "백만원\n" + "평균 매출액 " + avg + "백만원\n";
JOptionPane.showMessageDialog(null, result);
package myTest;
import javax.swing.JOptionPane;
//나이키 매장의 지점별, 연령별 각 매출액을 구하고 지점, 연령별 총 매출액, 평균 매출액, 총 매장의 매출액, 평균 매출액을 구하시오
public class ArrShop {
public static void main(String[] args) {
int [][] arrIncome = new int [2][3];
int rLength = arrIncome.length;
int cLength = arrIncome[0].length;
int sum = 0;
String menuMsg = "매출을 입력하세요";
String [][] arrName = {{"강남K", "서초K", "송파K"},{"강남A","서초A","송파A"}};
String [] aName = {"키즈점", "성인점"};
String [] bName = {"강남점", "서초점", "송파점"};
int [] arAsum = new int[2];
int [] arBsum = new int[3];
double [] aAvg = new double[2];
double [] bAvg = new double[3];
double avg = 0.0;
String result = "";
for (int i = 0; i < rLength; i++) {
result += "-------------------------\n";
for (int j = 0; j <cLength; j++) {
arrIncome[i][j] = Integer.parseInt(JOptionPane.showInputDialog(arrName[i][j]+menuMsg));
sum += arrIncome[i][j];
arAsum[i] += arrIncome[i][j];
arBsum[j] += arrIncome[i][j];
result += arrName[i][j] + " 매출액" + arrIncome[i][j]+"백만원\n";
}
}
result += "-------------------------\n";
avg = Double.parseDouble(String.format("%.2f", (double)sum/(rLength*cLength)));
//연령별 평균 매출액
for (int i = 0; i < rLength; i++) {
aAvg[i] = Double.parseDouble(String.format("%.2f", (double)arAsum[i]/arBsum.length));
result += aName[i]+" 총 매출액 " + arAsum[i] + "백만원\n";
result += aName[i] + " 평균 매출액 " + aAvg[i] + "백만원\n";
result += "-------------------------\n";
}
//지점별 평균 매출액
for (int i = 0; i < cLength; i++) {
bAvg[i] = Double.parseDouble(String.format("%.2f", (double)arBsum[i]/arAsum.length));
result += bName[i]+" 총 매출액 " + arBsum[i] + "백만원\n";
result += bName[i] + " 평균 매출액 " + bAvg[i] + "백만원\n";
result += "-------------------------\n";
}
result += "총 매출액 " + sum + "백만원\n" + "평균 매출액 " + avg + "백만원\n";
JOptionPane.showMessageDialog(null, result);
}
}