JAVA Day-9

2차원 배열

지금까지 1차원 배열을 활용하여 배열을 사용하였다.
이제 2차원 배열을 배우고 이를 활용하는 방법을 배워보자

2차원 배열이란?

정방배열은 횡과 열의 갯수가 같은 것을 말한다.
비정방배열은 횡, 열의 개수가 다른 것을 말한다.

배열 안에 배열이 존재함
RAM에서의 모습

쉽게 이해하기 위한 모습

접근 법 : arrData[0]일 경우 +0의 배열에 접근
arrData[0][2]일 경우 3의 값에 접근
arrData[2][1]일 경우 8의 값에 접근

2차원 배열은 배열에 2번 접근해야 값에 접근이 가능하다.
1번 접근하여 배열 자체를 수정하는 것 또한 가능하다
ex) int arrData[0] = arData;

2차원 배열의 선언

선언 방법.

자료형 [][] 배열명 = 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]

작성해보기

  1. 우리는 아직 메서드를 활용하지 않기에 바로 메인메서드에서 작성해보도록 하겠다.
    메인 메서드에 2차원 배열을 만들도록 하자
    2차원 배열은 생각해보기처럼 만들면 되겠다.

    여기서 정수를 사용하는 이유는 매출액은 정수로 표현하기 때문이다.

int [][] arrIncome = new int [2][3];
  1. 다음 우리는 각각 매출액을 입력 받아야되니 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];
			}
		}
  1. 이제 sum을 통해 총 매출액을 구했으니 총 매출액에 대한 평균액을 구해보도록 하자
    cLength와 rLength를 곱한만큼을 나누어야 총 매출액의 평균을 구할 수 있다. 또한 실수형으로 소숫점자리를 만들고 2번째 자리수로 변환시킨 다음 다시 실수형으로 만들자.
avg = Double.parseDouble(String.format("%.2f", (double)sum/(rLength*cLength)));
  1. 또한 우리는 연령별 매출액과 지점별 총 매출액을 구해야 된다.
    연령별 매출액을 구하기위해 먼저 연령별 매출액의 배열을 만들자.

    연령별은 강남~송파매장까지 첫번째 배열의 합, 두번째 배열의 합을 각각 담으면 됨으로 배열의 길이를 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];
		}
	}
  1. 매장의 총 매출액 연령별, 매장별 총 매출액과 총 매출액의 평균까지 구했으니 이제 연령별 매출의 평균, 매장별 매출의 평균을 구해보자.

    연령별 매출액은 키즈와 성인의 매출을 구한값에서 성인에서 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));
		}
  1. 다음은 매장별 매출의 평균을 구해보자

    매장별 매출액은 강남, 서초, 송파 매출을 구한 값에서 강남에서 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));
		}
  1. 이제 결과를 띄우도록 하자 결과를 작성할때 그저 메시지로 띄우면 길이가 긴 코드가 작성되고 부분적으로 반복되는 구간이 눈에 많이 보일 것이다.
    지금까지 작성한 for반복문을 최대한 활용하여 result에 누적하여 담아주는 것이 코드를 줄이고 효율을 올릴 수 있을 것이다.
    먼저 result의 변수를 초기화해주자, 또한 매장 이름이 반복되니 매장이름도 배열로 담아내자. 배열이름도 2차원배열로 표현하면 될 것이다.

    성인은 강남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";
		}
	}
  1. 연령별 매출액도 결과를 띄워야하는데 결과는 첫번째 for문반복에서 총 매출을 담았으나 이름을 따로 만들어 표시하기위해 연령별 매출액의 for문에서 사용하였다. 또한 매출액도 길이가 2만큼 반복하니 평균 매출액과 같이 사용되어도 상관없다.

    여기서 연령별 매출액의 이름도 따로 배열로 선언하였다. 표시를 키즈매장, 성인매장을 하기 위함이다.

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";
		}
  1. 다음은 매장별 매출의 표시이다. 마찬가지로 매장별 이름을 표시하기 위해 다시 배열을 선언하였다. 기존은 강남K,강남A처럼 구분되어 있기에 각 지점별 표기에 부적절하였다. 배열의 선언은 6번처럼 길이가 3인 1차원배열로 선언한다.
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";
	}
  1. 이제 총 매출액과 총 매출의 평균액을 누적시키고 띄워보자
 result += "총 매출액 " + sum + "백만원\n" + "평균 매출액 " + avg + "백만원\n";
 JOptionPane.showMessageDialog(null, result);
  1. 지금까지 작성한 코드이다.
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);

		
	}
}

좋은 웹페이지 즐겨찾기