함수를 사용 하는 이유 ?
코드를 나눠서 만들기 위해. 코드의 재사용, 집중화, 인터페이스역할(간접적 사용)
참조변수사용시 null 발생
변수가 값을 가지고 있는 상태에서 써야한다.
코드를 작성한 후에 함수로 코드를 나누는 작업 : Bottom -> up
함수로 코드를 작성하고 그것을 구현하는 작업 Top->Dowon
Top : 업무적인 내용, down (알고리즘, 오픈소스)
데이터를 얻는부분과 출력하는것의 분리
print메소드는 콘솔출력을 위한것.
데이터를 얻는것과 출력을 함께 두면 콘솔출력으로만 써야한다. ->재사용률이 떨어진다.
결합도를 낮추기 위해 분리시킨다.
최대값을 얻는 메소드와 출력하는 메소드를 분리
load함수 만들기
load안에서 공간을(new String[count][])를 만들어서 rows값을 전달.
메소드의 결과값을 반환해야하므로 rows의 자료형인 String[][]를 메소드상단에 적어준다.
함수가 끝나면 함수 안에있는 변수들은 다 사라진다. (지역화된 변수가 사라진다)
사라지면서 반환하기 위해 rows = load(rows,count); rows에 담아준다.
package ex5.fnc;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class Program3MultiArray4 {
public static void main(String[] args) throws IOException {
int count = 0;
String[][] rows = null;
// ---------------------------------------------------------
// 레코드 개수를 알아내는 코드
count = getCount();
// --------------------------------------------------------
// rows = new String[count][];
// 레코드를 로드하는 코드
rows = load(rows, count); //rows:참조변수 / count:값변수
// ---------------------------------------------------------
// 레코드를 출력하는 코드
printCovid19List(rows, count);
// ---------------------------------------------------------
// 검사진행자 누적수를 얻는 코드
int total = getTotal(rows, count);// f3누르면 메소드로이동
System.out.println(total);
System.out.println();
// ---------------------------------------------------------
// 1.일별 가장 많은 검사진행수는? 몇입니꽈~
printMax(rows, count);
// 2.감사진행수가 가장 많았던 날짜는?
printB(rows, count);
// ---------------------------------------------------------
// 확진자 수가 늘어난 일자와 수를 출력하시오.
printA(rows, count);
// 확진자 수가 늘어난 일자와 수를 다음 배열에 담아주시오.
String[][] results;
int resultCount = 0;
{
// 확진자 수가 달라질 때마다 resultCount를 증가시킴으로써 증가되는 일자 수를 구하는 코드
int old = 0; // 현재 확진자 수
for (int i = 0; i < count; i++) {
// i 번째 행의 확진자 수
int current = Integer.parseInt(rows[i][1]);
// i 번재 확진자(current)와 이전 확진자수(old)가 다르다면
if (old != current) {
// 확진자 수가 달라지는 일자의 수를 증가
resultCount++;
old = current;
}
}
System.out.println(resultCount);
results = new String[resultCount][];
String date = "";
int diff = 0;
old = 0; // 현재 확진자 수
int index = 0;
for (int i = 0; i < count; i++) {
int current = Integer.parseInt(rows[i][1]);
if (old != current) {
diff = current - old;
date = rows[i][0];
// 코로나19 데이터 행을 저장하기 위한 배열
String[] row = new String[2];
row[0] = date; // date
row[1] = String.valueOf(diff); // diff
results[index++] = row;
old = current;
}
}
System.out.println("작업완료");
}
}//main메소드 끝
static void printCovid19List(String[][] rows, int count) {
System.out.println("// 레코드를 출력하는 코드------------------------");
for (int j = 0; j < count; j++) {
for (int i = 0; i < 10; i++) {
System.out.printf("%s", rows[j][i]);
if (i < 10 - 1)
System.out.printf(",");
}
System.out.println();
} // 큰for문끝
}// printCovid19List()끝
// --------------------------------------------------------
static int getTotal(String[][] rows, int count) {
int total = 0;
for (int i = 0; i < count; i++)
total += Integer.parseInt(rows[i][3]);
return total;
}
// ---------------------------------------------------------
// 크로스방향으로 단순히 나누기만 한 코드
// 좀 더 개선해 볼 수 있는 여지가 있는가 ?
// 함수의 4가지 특징 중에서 재사용을 생각해보면 ?
static int getMax(String[][] rows, int count) {
int max = 0;
int current;
for (int i = 0; i < count; i++) {
current = Integer.parseInt(rows[i][3]);
if (current > max)
max = current;
}
return max;
}
// ---------------------------------------------------------
static void printMax(String[][] rows, int count) {
int max = getMax(rows, count);// 메소드의 리턴값이 max에 담긴다.
System.out.printf("max: %d\n", max); // <-콘솔출력을 위한것, 데이터얻는것과 출력을 함께두면 전체적으로 콘솔출력용으로만써야된다.
System.out.println();
}
// ---------------------------------------------------------
// 확진자 수가 늘어난 일자와 수를 출력하시오.
static void printA(String[][] rows, int count) {
String date = "";
int diff = 0;
int old = 0; // 현재 확진자 수
int index = 0;
for (int i = 0; i < count; i++) {
int current = Integer.parseInt(rows[i][1]);
if (old != current) {
diff = current - old;
date = rows[i][0];
old = current;
System.out.printf("일자와 수%d : %s, %d\n", index++ + 1, date, diff);
}
}
}
// ---------------------------------------------------------
// 레코드를 로드하는 코드
static String[][] load(String[][] rows, int count) throws IOException {
rows = new String[count][];
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
String line;
fscan.nextLine();
for (int i = 0; i < count; i++) {
line = fscan.nextLine();
rows[i] = line.split(",");
}
fscan.close();
fis.close();
return rows;
}
// ---------------------------------------------------------
// 2.검사진행수가 가장 많았던 날짜는?
static String getDate(String[][] rows, int count) {
String date = "";
int idx = 0;
int max = getMax(rows, count);
for (int i = 0; i < count; i++)
if (max == Integer.parseInt(rows[i][3])) {
idx = i;
break;
}
date = rows[idx][0];
return date;
}
// ---------------------------------------------------------
// 2.검사진행수가 가장 많았던 날짜는? 출력
static void printB(String[][] rows, int count) {
String date = getDate(rows, count);
System.out.printf("%s", date);
System.out.println();
}
// ---------------------------------------------------------
static int getCount() throws IOException {
int count = 0;
FileInputStream fis = new FileInputStream("res/corona.csv");
Scanner fscan = new Scanner(fis);
// while 반복을 하면서 count++ 연산을 한다. 마지막 줄을 만날 때까지
while (fscan.hasNextLine()) {
fscan.nextLine();
count++;
}
fscan.close();
fis.close();
count--;//반환값필요
return count;
}
}//class끝
'2021 Newlecture > JAVA' 카테고리의 다른 글
객체지향 프로그래밍 / this / static메소드 / 인스턴스메소드/ 생성자 / Getter&Setter (0) | 2021.03.27 |
---|---|
캡슐화 / 접근지시자 / Getter 함수 (0) | 2021.03.25 |
jar파일 생성/ 외부 jar파일 추가하기 (0) | 2021.03.24 |
집중화 / 실행코드의 재사용 / 구조체(데이터관리) (0) | 2021.03.24 |
코드정리 / 함수와 인터페이스 / 메소드생성 / 메소드호출 (0) | 2021.03.22 |
메소드생성 (0) | 2021.03.22 |
배열을 바로출력 vs 변수로 출력 (구조체) (0) | 2021.03.19 |
참조형배열 / 객체생성 / 배열의 참조변수가 null 값 참조할때 (0) | 2021.03.19 |