이제 배열을 배워볼 차례이다. Day-7에서 작성하였던 코드는 배열이 없어 불편하고 길게 코드를 작성할 수 밖에 없었으며 배열을 배우고 나면 배열을 이용해 관리 할 수 있는 값들이 많아진다.
먼저 1차원 배열을 배워보도록 하자
같은 값들을 한번에 저장하기 위해 사용하면서 동시에 사용 할때는 자료형
변환을 통해 특정 주소의 index만 불러와서 자료 변환이 가능하다.
코드를 작성할 때 같은 변수들이 반복적으로 나오는 경우가 더러 있다. 가장 좋은 것은 미리 작성 전에 같은 값들을 예상하고 사용하는 것이지만 예상치 못한 변수들이 많이 존재하기에 같은 타입 변수들이 여러번 선언되면 배열에 저장하여 저장공간을 아끼도록 하자.
배열은 index로 이루어져 있고 보통 index는 {index0, index1, ...}로 선언된다.
그렇다면 왜 1부터가 아닌 0부터 시작하게 되었을까?
때는 바야흐로 C언어에서 시작한다.
C언어에서는 Array + 0번째 방부터 참조, 즉 이동하지 않은 상태가 0번째가 된다. 여기에 생겨난 값을 참조하기위해 0번째 참조하면서 +1, +2 순서데로 주소값을 참조한다.
(값이 아니라 주소값을 참조.. 주소값에 값이 담기는 것이다.)
*Array+0 은 배열의 0번째를 참조하라는 뜻임.
(별쓰고 배열명 + 0) C언어에서 이렇게 사용하다가 후생언어인 JAVA에서는 불편함을 개선하여 Array[0] 이렇게 사용하는 것이다.
배열은 기본적으로 주소값을 참조한다. 앞서 말했듯이 배열을 만들게 되면 배열의 길이에 따라 각 방에는 주소값이 만들어진다.
물론 때에 따라서 주소값이 아닌 강제적으로 값을 참조하게 만들 수 있다.
이것이 뒤에 나오는 equals 메서드이다. equals가 있다는 것만 알아두고 넘어가자.
index0 에는 주소값1, index1에는 주소값2
즉 배열을 만들기위해 초기화하면 주소값이 생기고 우리는 이 주소값 마다 Value를 입력하게 되는 것이다.
배열을 선언하게 되면 컴퓨터 RAM의 heap영역에 선언되고 이는 new를 만나거나 프로그램이 종료되기 전까지 유효하다.
String [] arName = new String[3]; //배열이 0,1,2 index길이만큼 생김
String arName [] = {"강민", "혜화", "용만"};
//배열이 3개의 값을 넣었으니 index 0, 1, 2가 생김
String [] arName; //아직 길이는 모르고 나중에 길이와 값을 초기화 하기 위해 선언함.
부동산의 건물주가 되었다는 가정으로 월세를 받고 건물에서 나오는 총월세와 평균 월세를 알고 싶다고 생각해보자
우리가 소유하고 있는 임대물건은 3개가 있다.
그러면 우리에게 필요한 것은 각 방의 갯수와 그 방에 값을 담아 총 합을 구하고 총 합에서 방의 갯수만큼 나누면 평균 월세가 나온다.
나는 여기서 콘솔창을 활용하여 각 방의 월세를 입력 받을 것이고 총 합과 평균을 내어서 다시 콘솔창에다가 결과를 보여 줄 것이다.
import java.util.Scanner;
public class ArVilla {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
...생략...
Scanner sc = new Scann.....
int [] ho = int [3];
..생략...
int [] ho = int [3];
for(i=0; i<ho.length; i++){
//i는 0부터 반복이니 i+1을 넣었다.
System.out.println(i+1+"번 방의 월세를 입력하세요");
ho[i] = sc.nextInt();
}
..생략...
int [] ho = int [3];
int sum = 0;
for(i=0; i<ho.length; i++){
System.out.println(i+1+"번 방의 월세를 입력하세요");
ho[i] = sc.nextInt();
sum += ho[i];
}
..생략...
int [] ho = int [3];
int sum = 0;
double aver = 0.0;
for(i=0; i<ho.length; i++){
...생략...
}
aver = Double.parseDouble(String.format("%.2f", (double)sum/ho.length));
System.out.println("총 월세 : " + sum + "\n원" + "평균 월세 : " + aver + "원");
package day08;
import java.util.Scanner;
public class ArVilla {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [] ho = new int[3];
int sum = 0;
double aver = 0.0;
for (int i = 0; i < ho.length; i++) {
System.out.println(i+1+"번 방의 월세를 입력하세요");
ho[i] = sc.nextInt();
sum += ho[i];
}
//평균은 총 월세에서 나누기 ho.length만큼이다.
aver = Double.parseDouble(String.format("%.2f", (double)sum/ho.length));
System.out.println("총 월세 : " + sum + "\n원" + "평균 월세 : " + aver + "원");
}
}
String.format는 서식문자를 사용하여 실수의 소숫점자리수를 원하는 자리수로 변화(format)시키고 문자열타입으로 바꾸어준다.
사용 방법은 String.format("%.2f", 실수자료); 처럼 사용하며 %f는 실수를 말하고 .2는 소숫점 2자리를 말한다, 소숫점 한자리는 %.1f와 같이 변경하여 사용하면 된다.
먼저 매장을 관리하는 입장에서 각 매장들의 매출액을 받아오고 매출액의 총합과 평균매출을 구한다.
또한 잘하는 매장을 best로 선정하여 출력해보고 싶다.
매장을 관리하는 프로그램 또한 콘솔창에서 직접 소통하는 방식으로 만들 것이며, 매장은 3개의 매장으로 관리한다.
먼저 3개의 매장의 매출액을 입력 받아야되니 매출액을 3번 받기 위해 for구문을 사용하고 반복은 매장 수만큼 하면 되겠다.
매출액을 받아 총 합을 누적함수로 만들고 총합을 매장수만큼 나누어 평균을 구한다. 평균은 마찬가지로 소숫점 2번째자리까지 설정하기위해 String.format과 Double.parseDouble을 이용한다.
그리고 인센티브 매장을 누적시키기 위해 매장이름도 배열로 만들면 되겠다. 인센티브 매장은 평균보다 큰 값을 적으면 된다.
인센티브 매장이 없을 경우도 더러 있으니 best에 기본 초깃값으로 인센티브 없음이라 하고 cnt도 추가하여 cnt가 1이면 best를 초기화시켜서 그 다음 누적함수를 적용하면 되겠다.
public static void main(String[] args) {
int [] arIncome = new int [3];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [] arIncome = new int [3];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [] arIncome = new int [3];
int sum = 0;
for (int i = 0; i < arIncome.length; i++) {
System.out.println(arName[i] + "의 매출액을 적으세요");
arIncome[i] += sc.nextInt();
sum += arIncome[i];
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
..................생략........................
arIncome[i] += sc.nextInt();
sum = arIncome[i];
}
aver = Double.parseDouble(String.format("%.2f", (double)sum/arIncome.length));
}
....생략...
aver = Double.parseDouble(String.format("%.2f", (double)sum/arIncome.length));
System.out.println("총 매출 : " + sum + "백만원\n" + "평균 매출 : "+aver+"백만원");
String best = "";
for (int j = 0; j < arName.length; j++) {
if(arIncome[j]>aver) {
best += arName[j];
}
}
결과는 배열명들이 그저 나열하게 된다. 만약 여기에 인센티브 매장이 없다면 결과 값이 비어있는 상태 될것이다.
String best = "인센티브 매장 없음";
int cnt = 0;
for (int j = 0; j < arName.length; j++) {
System.out.println(arName[j]+"의 매출 : " + arIncome[j]+"백만원");
if(arIncome[j]>aver) {
cnt++;
if(cnt ==1) {
best = "";
}
best += j == arIncome.length -1 ? arName[j] : arName[j] + ", ";
}
}
System.out.println("인센티브 매장 : " + best);
여기서 추가적으로 인센티브 매장이 출력될때 마지막 매장명도 콤마가 붙으니 삼항연산자를 사용하여 마지막 매장에는 콤마가 붙지 않게 하였다.
arName이 아닌 arIncome을 사용한 이유는 arName은 계속 길이가 3이고 arIncome의 길이는 조건을 만족하는 갯수가 if조건식에 의해 됨으로 인센티브 매장의 갯수만큼 변화한다.
7.지금까지 작성한 코드
package day08;
import java.util.Scanner;
//강남, 코엑스, 영등포점의 각 지점의 매출액, 총매출, 평균매출, 단위는 100만단위를 받는다.
public class arShop {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [] arIncome = new int [3];
String [] arName = {"강남점", "코엑스점", "영등포점"};
int sum = 0;
double aver = 0.0;
String best = "인센티브 매장 없음";
int cnt = 0;
for (int i = 0; i < arIncome.length; i++) {
System.out.println(arName[i] + "의 매출액을 적으세요");
arIncome[i] += sc.nextInt();
sum += arIncome[i];
}
aver = Double.parseDouble(String.format("%.2f", (double)sum/arIncome.length));
System.out.println("총 매출 : " + sum + "백만원\n" + "평균 매출 : "+aver+"백만원");
for (int j = 0; j < arName.length; j++) {
System.out.println(arName[j]+"의 매출 : " + arIncome[j]+"백만원");
if(arIncome[j]>aver) {
cnt++;
if(cnt ==1) {
best = "";
}
best += j == arIncome.length -1 ? arName[j] : arName[j] + ", ";
}
}
System.out.println("인센티브 매장 : " + best);
}
}