JAVA Day-8
배열
이제 배열을 배워볼 차례이다. Day-7에서 작성하였던 코드는 배열이 없어 불편하고 길게 코드를 작성할 수 밖에 없었으며 배열을 배우고 나면 배열을 이용해 관리 할 수 있는 값들이 많아진다.
먼저 1차원 배열을 배워보도록 하자
배열이란 무엇인가?
배열은 같은 타입의 값들을 한번에 저장하기 위함
같은 값들을 한번에 저장하기 위해 사용하면서 동시에 사용 할때는 자료형
변환을 통해 특정 주소의 index만 불러와서 자료 변환이 가능하다.
같은 타입의 변수들이 여러번 선언 되었을 때 배열을 생각하자.
코드를 작성할 때 같은 변수들이 반복적으로 나오는 경우가 더러 있다. 가장 좋은 것은 미리 작성 전에 같은 값들을 예상하고 사용하는 것이지만 예상치 못한 변수들이 많이 존재하기에 같은 타입 변수들이 여러번 선언되면 배열에 저장하여 저장공간을 아끼도록 하자.
왜 index는 0부터 시작할까?
배열은 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를 만나거나 프로그램이 종료되기 전까지 유효하다.
배열의 선언 방법
- 자료형 [] 배열명 = new 자료형[길이];
String [] arName = new String[3]; //배열이 0,1,2 index길이만큼 생김
- 자료형 배열명[] = {값1, 값2, ... };
String arName [] = {"강민", "혜화", "용만"};
//배열이 3개의 값을 넣었으니 index 0, 1, 2가 생김
- 자료형 [] 배열명;
String [] arName; //아직 길이는 모르고 나중에 길이와 값을 초기화 하기 위해 선언함.
배열을 이용하여 부동산 관리하기
어떻게 만들지 고민하기.
부동산의 건물주가 되었다는 가정으로 월세를 받고 건물에서 나오는 총월세와 평균 월세를 알고 싶다고 생각해보자
우리가 소유하고 있는 임대물건은 3개가 있다.
그러면 우리에게 필요한 것은 각 방의 갯수와 그 방에 값을 담아 총 합을 구하고 총 합에서 방의 갯수만큼 나누면 평균 월세가 나온다.
나는 여기서 콘솔창을 활용하여 각 방의 월세를 입력 받을 것이고 총 합과 평균을 내어서 다시 콘솔창에다가 결과를 보여 줄 것이다.
어떤 코드를 왜 쓸지 생각해보기
- 콘솔창을 활용할 것이니 Scanner메서드의 System.in을 활용하고 그 값들은 next에다가 담으면 될 것이다.
- 각 호실이 3개이니 똑같이 반복될 것이고 이것을 배열로 만들어 저장할 것이다.
- 그리고 for문을 활용하여 각 방들의 입력을 방의 갯수만큼 반복시킬 것이다.
- 또한 평균은 Double 실수형이나 소숫점 2번째 자리까지 출력할 것이다.
작성해보기
- 먼저 앞어 메인클래스에서 작업하고 따로 메서드를 만들지 않아도 될 것 같다. 우리는 콘솔창으로 대화하는 형식으로 만들 예정임으로 Scanner함수를 먼저 만들자(자동완성으로 import까지 확인)
import java.util.Scanner;
public class ArVilla {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
- 다음 임대물건 호실이라 가정하고 ho를 사용하겠다. ho를 배열이 3개인 1차원 배열을 선언하자 호실이 받는 값들은 정수로 받을 것이다.
...생략...
Scanner sc = new Scann.....
int [] ho = int [3];
- 각 값들을 정수로 받을 것이니 sc.nextInt();를 사용할 것이고 ho[i]마다 호실 수 만큼 반복시켜서 받으면 되겠다.
또한 받기만 하면 어떤 값을 넣을지 모르니 print하여 어떤 값을 넣어야 되는지 알려주자
..생략...
int [] ho = int [3];
for(i=0; i<ho.length; i++){
//i는 0부터 반복이니 i+1을 넣었다.
System.out.println(i+1+"번 방의 월세를 입력하세요");
ho[i] = sc.nextInt();
}
- 이제 그 받은 값들의 합을 구해야 됨으로 초기화 먼저 해주자
변수명은 sum으로 하고 정수타입으로 받으면 되겠다.
또한 총 합을 받을때에는 누적함수로 받으면 된다.
..생략...
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];
}
- 총 합을 구했으니 평균을 구해보자 평균은 방의 갯수로 for구문 밖에서 사용하면되겠다.
평균은 실수형으로 계산이 되니 실수로 초기화 해주고 소숫점 2번째자리까지만 출력하기 위해서는 String.format메서드를 이용해야된다, 이때 주의사항으로 String.format은 문자열로 변환시켜서 원하는 소숫점까지 표현해주므로 다시 실수형으로 변환하는 것을 잊지말자.
..생략...
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];
}
- 매출액을 콘솔창에서 받아오기 위해 Scanner를 만들자
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [] arIncome = new int [3];
}
- for구문을 사용하자, 배열의 길이만큼 반복시켜서 값을 입력 받으면 되겠다. 또한 각 배열마다 매출액을 받을 것이고 이를 누적시킬 것이다.
누적시킬때 그 값은 sum이라는 저장공간을 만들어 저장 할 것이다.
그리고 어떤 매장의 매출액을 적는지 사용자에게 알려주기 위해 매장이름을 초기화하자, 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];
}
}
- 이제 평균을 구해보자 평균은 for구문 밖에서 작성되면 되고 먼저 sum에서 배열 길이만큼 나누면 평균이 구해진다. 이 값은 실수임으로 오류를 방지하기 위해 실수형으로 변환시켜주고 변환 값을 다시 String.format을 이용하여 소숫점 2자리수로 만들어 줄 것이다.
이 값은 문자열이니 다시 Double.parseDouble메서드를 이용해서 실수형으로 변환 시켜주자. 그리고 이값을 aver이라는 저장공간에 담을 것이다.
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));
}
- 출력을 해주는 print를 작성해보자
....생략...
aver = Double.parseDouble(String.format("%.2f", (double)sum/arIncome.length));
System.out.println("총 매출 : " + sum + "백만원\n" + "평균 매출 : "+aver+"백만원");
- 이제 마지막으로 인센트브 매장을 출력해줘야한다.
인센티브매장은 평균보다 클때 값을 만족시킨다. 다만 매장이름을 반복해서 문자열로 담아줘야 어떤 매장이 인센티브 매장인지 직관적으로 알 수 있다. 먼저 for구문을 활용하여 매장 이름만큼 반복시키고 if조건문으로 평균보다 클때 그 값을 만족하는 식을 만들어보자
String best = "";
for (int j = 0; j < arName.length; j++) {
if(arIncome[j]>aver) {
best += arName[j];
}
}
결과는 배열명들이 그저 나열하게 된다. 만약 여기에 인센티브 매장이 없다면 결과 값이 비어있는 상태 될것이다.
- 그러면 best의 초깃값을 인센티브 매장이 없음 이라고 선언하고 if조건문에 참일 때 cnt를 증가시키고 이때 cnt가 1이면 best를 다시 ""으로 초기화하여 비워주고 그 다음 값을 누적시키면 어떻까?
인센티브 매장이 없으면 cnt가 증가되지 않고 cnt가 증가되지 않으면 best는 초기화 되지 않아 기존 초깃값을 출력하게 될 것이다.
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);
}
}
Author And Source
이 문제에 관하여(JAVA Day-8), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@km2535/JAVA-Day-8저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)