일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JavaScript
- Recoil
- helm-chart
- 타입 단언
- zustand
- 명시적 타입 변환
- Headless 컴포넌트
- 프로세스
- AJIT
- task queue
- Microtask Queue
- Render Queue
- TypeScript
- 클라이언트 상태 관리 라이브러리
- jotai
- react
- Redux Toolkit
- CS
- prettier-plugin-tailwindcss
- 암묵적 타입 변환
- type assertion
- Sparkplug
- linux 배포판
- 주니어개발자
- useCallback
- Compound Component
- docker
- useLayoutEffect
- Custom Hook
- 좋은 PR
- Today
- Total
구리
TIL_210326_데이터 가공 관련 문제 본문
문제
1. 외국인이 가장 많이 거주하는 지역은 ?
2. 외국인보다 한국인이 많이 거주하는 지역은 ?
3. 나이가 많은 분을 위해 추천하고 싶은 지역과 그 이유는 ?
(단, 이 분은 민족주의 사관과 개인주의 성격을 가지고 있다)
위의 세 문제에 대한 결과과 나오는 새로운 html파일 프로젝트를 만드시오.
(바로 코딩하지 말고 꼭 설계 후 코딩 시작하기)
문제 풀기 전 설계 과정
1. 준비 작업 ( 외부 라이브러리 설정 및 어떤 결과물이 필요한지, 결과물에 어떤 값이 출력 되어야 하는지)
- 엑셀 읽기(jxl.jar) => 외부 라이브러리가 어디에 위치해 있는지 확인
- 이클립스에서 참조 (Build path=> Configuration path=>Libraries)
- ExcelReaderClass 이용하여 엑셀 파일 읽기
- 결과물 : ~~~~.html ==> PrintClass 필요
- 출력 결과 데이터 => 반드시 저장되어 있어야 함
- 파일 생성하는 건 맨 마지막에 작업
2. 원시 데이터 분석 및 문제 풀기 위해 필요한 데이터 정하기
원시 데이터 : population_in_Seoul_edit.xls
필요데이터 : 열 index(1 자치구,6 한국인,9 외국인), 행 index(4행부터 쭉)
(인구수 관련된 Population Class 생성 후 멤버변수로 선언 => 저장 변수 private)
( 멤버변수에 접근할 수 있도록 getter 메서드 생성)
(객체 생성시 데이터 전달 (추가 생성자 필요))
(추가 생성자의 매개변수로 엑셀 데이터 받아올때 문자열=> 숫자로 바꿔주는 메서드 필요)
전체 데이터 PopulationClass 객체들 저장 => PopulationDataClass (데이터가 얼마나 있는지 모르기에 ArrayList 사용)
3. 문제에 대한 결과를 어떤 방식으로 도출해낼지 설계
1. 외국인이 가장 많이 거주하는 지역은 ? => MethodClass (maxPop() {} )
열 index(9)의 수가 가장 많은 자치구
for() { if( ){ } }
2. 외국인보다 한국인이 많이 거주하는 지역은 ? => MethodClass
열 index(6 > 9)
for() { if( ){ } }
3. 나이가 많은 분을 위해 추천하는 지역과 그 이유는 ? => MethodClass
단, 이분은 민족주의 사관과 개인주의 성격을 가지고 있다.
열 index(6 한국인) 개인주의 => 가장 적은 지역
열 index(9 외국인) 민족주의 => 가장 적은 지역
열 index(6 한국인 + 9 외국인 ) => 가장 적은 지역
4. 큰 갈피가 잡히면 3에서 설계한 방식(메서드)들을 어떤 클래스에 설계할 지 정하기
5. 큰 크림 그리고 다시 정리하며 프로젝트 진행 순서대로 클래스간 흐름도 그리기
6. 5의 흐름도대로 코딩하며 하나씩 설계 완료할 때마다 표시하고 특정 데이터가 잘 저장되었는지 테스트 하기
직접 작성한 코드
PopClass
package com.bjy.data;
public class PopClass {
private String period = "";
private String area = "";
private int generation = 0;
private int pop = 0;
private int manPop = 0;
private int womenPop = 0;
private int krPop = 0;
private int krManPop = 0;
private int krWomenPop = 0;
private int foreignPop = 0;
private int foreignMenPop = 0;
private int foreingWomenPop = 0;
private String ppg = "";
private int oldPop = 0;
public PopClass() {
}
public PopClass(String period,String area, int generation, int krManPop, int KrWomenPop, int foreignMenPop, int foreignWomenPop, String ppg, int oldPop ) {
this.period = period;
this.area = area;
this.generation = generation;
this.pop = krManPop + KrWomenPop + foreignMenPop + foreignWomenPop;
this.manPop = krManPop + foreignMenPop;
this.womenPop = KrWomenPop + foreignWomenPop;
this.krPop = krManPop + KrWomenPop;
this.krManPop = krManPop;
this.krWomenPop = KrWomenPop;
this.foreignPop = foreignMenPop + foreignWomenPop;
this.foreignMenPop = foreignMenPop;
this.foreingWomenPop = foreignWomenPop;
this.ppg = ppg;
this.oldPop = oldPop;
}
public String getPeriod() {
return period;
}
public String getArea() {
return area;
}
public int getGeneration() {
return generation;
}
public int getPop() {
return pop;
}
public int getManPop() {
return manPop;
}
public int getWomenPop() {
return womenPop;
}
public int getKrPop() {
return krPop;
}
public int getKrManPop() {
return krManPop;
}
public int getKrWomenPop() {
return krWomenPop;
}
public int getForeignPop() {
return foreignPop;
}
public int getForeignMenPop() {
return foreignMenPop;
}
public int getForeingWomenPop() {
return foreingWomenPop;
}
public String getPpg() {
return ppg;
}
public int getOldPop() {
return oldPop;
}
}
DataClass
package com.bjy.data;
import java.util.ArrayList;
/** 한국인 수, 외국인 수, 고령자 인구수, 지역구 데이터를 다루는 클래스**/
public class DataClass {
/** 모든 구의 한국인 인구수, 외국인 인구수, 고령자 인구수 데이터를 저장하는 변수 **/
public static ArrayList<PopClass> popData = new ArrayList<PopClass>();
public static String[] head = { "기간", "자치구", "세대", "인구합계", "남자인구 합계", "여자인구합계", "한국인 인구 합계", "한국인남자인구 합계",
"한국인여자인구 합계", "외국인 인구 합계", "외국인남자인구 합계", "외국인여자인구 합계", "세대당인구", "65세이상고령자" };
public DataClass() {
}
}
ExcelReaderClass
package com.bjy.util;
import java.io.File;
import com.bjy.data.DataClass;
import com.bjy.data.PopClass;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
/** 엑셀파일 읽은 후 특정 타입의 객체 배열에 저장하는 클래스 **/
public class ExcelReaderClass {
public ExcelReaderClass() {
}
/** 엑셀 파일 불러 와 읽은 후 모든 지역구의 특정 데이터만 저장해주는 메서드**/
public static void loadExcel(String uri_excel) {
File f = null;
Workbook wb = null;
try {
f = new File(uri_excel);
wb = Workbook.getWorkbook(f);
Sheet s = wb.getSheet(0);
PopClass pop = null;
Cell[] cell = new Cell[9];
try {
for(int i=4;i<29;i++) {
cell[0] = s.getCell(0, i);
cell[1] = s.getCell(1, i);
cell[2] = s.getCell(2, i);
cell[3] = s.getCell(7, i);
cell[4] = s.getCell(8, i);
cell[5] = s.getCell(10, i);
cell[6] = s.getCell(11, i);
cell[7] = s.getCell(12, i);
cell[8] = s.getCell(13, i);
pop = new PopClass(cell[0].getContents(), cell[1].getContents(), Integer.parseInt(cell[2].getContents().replaceAll(",", "")), +
Integer.parseInt(cell[3].getContents().replaceAll(",", "")), Integer.parseInt(cell[4].getContents().replaceAll(",", "")), +
Integer.parseInt(cell[5].getContents().replaceAll(",", "")), Integer.parseInt(cell[6].getContents().replaceAll(",", "")), cell[7].getContents(), Integer.parseInt(cell[8].getContents().replaceAll(",", "")));
DataClass.popData.add(pop);
}
}catch (Exception e) {
System.out.println("데이터 읽기 완료" + e.getMessage());
}
}catch (Exception e) {
System.out.println("엑셀 파일 읽기 오류 ERR : " + e.getMessage());
}
}
}
MethodClass
package com.bjy.util;
import java.util.ArrayList;
import com.bjy.data.DataClass;
import com.bjy.data.PopClass;
public class MethodClass {
/** 외국인 가장 많이 사는 거주지 저장 변수**/
public static PopClass foreignArea = null;
/** 외국인보다 한국인이 많이 거주하는 지역 정보 저장하는 변수**/
public static ArrayList<PopClass> koreanArea = new ArrayList<PopClass>();
/** 위에 나와 있는 koreanArea에서 고령자가 가장 많이 사는 지역 정보 저장하는 변수 **/
public static PopClass oldArea = null;
public MethodClass() {
}
/** 외국인이 가장 많이 사는 지역 정보 찾아서 foreignArea에 저장하는 메서드**/
public static void findForeingArea() {
int big = 0;
int num = 0;
for(int i=0;i<DataClass.popData.size();i++) {
if(big<DataClass.popData.get(i).getForeignPop()) {
big = DataClass.popData.get(i).getForeignPop();
num = i;
}
}
foreignArea = DataClass.popData.get(num);
}
/** 외국인보다 한국인이 더 많이 사는 지역 정보 찾아서 koreanArea에 저장하는 메서드 **/
public static void fineKoreanArea() {
koreanArea.clear();
for(int i=0;i<DataClass.popData.size();i++) {
if(DataClass.popData.get(i).getForeignPop() < DataClass.popData.get(i).getKrPop())
koreanArea.add(DataClass.popData.get(i));
}
}
/** koreanArea 에서 고령자인구가 가장 많은 PopClass객체를 oldArea 변수에 저장하는 메서드**/
public static void findOldArea() {
int big = 0;
int num = 0;
for(int i=0;i<koreanArea.size();i++) {
if(big<koreanArea.get(i).getOldPop()) {
big = koreanArea.get(i).getOldPop();
num = i;
}
}
oldArea = koreanArea.get(num);
}
/** MethodClass의 static 변수에 담긴 데이터를 tags에 저장하여 반환하는 메서드**/
public static String makeTags() {
String tags = "";
tags += "<!doctype>";
tags += "<html>";
tags += "<head><title>population_in_Seoul</title></head>";
tags += "<body>";
tags = tags + "<table border='1'>";
tags += "<tr>";
tags += "<td> </td>";
for(int i=0;i<DataClass.head.length;i++) {
tags += "<td>" + DataClass.head[i] + "</td>";
}
tags += "</tr>";
tags += "<tr>";
tags += "<td> 외국인 최다 거주 지역</td>";
tags += "<td>" + foreignArea.getPeriod() +"</td>";
tags += "<td>" + foreignArea.getArea() +"</td>";
tags += "<td>" + foreignArea.getGeneration() +"</td>";
tags += "<td>" + foreignArea.getPop() +"</td>";
tags += "<td>" + foreignArea.getManPop() +"</td>";
tags += "<td>" + foreignArea.getWomenPop() +"</td>";
tags += "<td>" + foreignArea.getKrPop() +"</td>";
tags += "<td>" + foreignArea.getKrManPop() +"</td>";
tags += "<td>" + foreignArea.getKrWomenPop() +"</td>";
tags += "<td>" + foreignArea.getForeignPop() +"</td>";
tags += "<td>" + foreignArea.getForeignMenPop() +"</td>";
tags += "<td>" + foreignArea.getForeingWomenPop() +"</td>";
tags += "<td>" + foreignArea.getPpg() +"</td>";
tags += "<td>" + foreignArea.getOldPop() +"</td>";
tags += "</tr>";
for(int i=0;i<koreanArea.size();i++) {
tags += "<tr>";
tags += "<td> 외국인보다 한국인이 많이 거주하는 지역</td>";
tags += "<td>" + koreanArea.get(i).getPeriod() +"</td>";
tags += "<td>" + koreanArea.get(i).getArea() +"</td>";
tags += "<td>" + koreanArea.get(i).getGeneration() +"</td>";
tags += "<td>" + koreanArea.get(i).getPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getManPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getWomenPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getKrPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getKrManPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getKrWomenPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getForeignPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getForeignMenPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getForeingWomenPop() +"</td>";
tags += "<td>" + koreanArea.get(i).getPpg() +"</td>";
tags += "<td>" + koreanArea.get(i).getOldPop() +"</td>";
tags += "</tr>";
}
tags += "<tr>";
tags += "<td> 나이가 많은 분을 위한 추천 지역</td>";
tags += "<td>" +oldArea.getPeriod() +"</td>";
tags += "<td>" + oldArea.getArea() +"</td>";
tags += "<td>" + oldArea.getGeneration() +"</td>";
tags += "<td>" + oldArea.getPop() +"</td>";
tags += "<td>" + oldArea.getManPop() +"</td>";
tags += "<td>" + oldArea.getWomenPop() +"</td>";
tags += "<td>" + oldArea.getKrPop() +"</td>";
tags += "<td>" + oldArea.getKrManPop() +"</td>";
tags += "<td>" + oldArea.getKrWomenPop() +"</td>";
tags += "<td>" + oldArea.getForeignPop() +"</td>";
tags += "<td>" + oldArea.getForeignMenPop() +"</td>";
tags += "<td>" + oldArea.getForeingWomenPop() +"</td>";
tags += "<td>" + oldArea.getPpg() +"</td>";
tags += "<td>" + oldArea.getOldPop() +"</td>";
tags += "</tr>";
tags += "<tr>";
tags += "<td> 추천이유 : 민주주의 사관의 성격이기에 "
+ "외국인보다 한국인이 많으면서 <br>개인주의 성격이라 고령자 인구수가 적은 지역사회보단<br>"
+ "고령자 인구가 가장 많은 지역을 선택하였다</td>";
return tags;
}
}
PrintClass
package com.bjy.out;
import java.io.BufferedWriter;
import java.io.FileWriter;
public class PrintClass {
public PrintClass() {
}
/** 저장된 태그와 저장할 html 파일명을 받아서 새로운 html 파일을 생성하는 메서드 **/
public static void makeHTML(String tags, String uri_html) {
try {
FileWriter fw = new FileWriter(uri_html);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(tags);
bw.close();
fw.close();
}catch (Exception e) {
System.out.println("html 파일 생성 ERR : " + e.getMessage());
}
}
}
MainClass
package com.bjy;
import com.bjy.out.PrintClass;
import com.bjy.util.ExcelReaderClass;
import com.bjy.util.MethodClass;
public class MainClass {
public static void main(String[] args) {
String uri_excel = "c:/filetest/population_in_Seoul.xls";
ExcelReaderClass.loadExcel(uri_excel);
MethodClass.findForeingArea();
MethodClass.fineKoreanArea();
MethodClass.findOldArea();
String tags = MethodClass.makeTags();
String uri_html = "c:/filetest/백정연.html";
PrintClass.makeHTML(tags, uri_html);
}
}
직접 짠 코드 MainClass에서 실행시 html 결과물
문제 해설
PopClass
package com.bjy.data;
/**1:자치구 6:한국인 9:외국인 **/
public class PopClass {
private String local = "";
private int korNum = 0;
private int forNum = 0;
public PopClass() {
}
/** 오버라이딩 생성자 **/
public PopClass(String local, String korNum, String forNum) {
this.local = local;
this.korNum = Integer.parseInt(korNum);
this.forNum = Integer.parseInt(forNum);
}
/** private 멤버 변수에 접근할 수 있는 getter 메서드 **/
public String getLocal() {
return local;
}
public int getKorNum() {
return korNum;
}
public int getForNum() {
return forNum;
}
/** 객체 변수 저장된 값 확인 메서드**/
public void testToString() {
System.out.println(this.local + "," + this.korNum + "," + this.forNum);
}
}
DataClass
package com.bjy.data;
import java.util.ArrayList;
/** 한국인 수, 외국인 수, 고령자 인구수, 지역구 데이터를 다루는 클래스**/
public class DataClass {
/** 모든 구의 한국인 인구수, 외국인 인구수, 고령자 인구수 데이터를 저장하는 변수 **/
public static ArrayList<PopClass> populations = new ArrayList<PopClass>();
public DataClass() {
}
}
ExcelReaderClass
package com.bjy.util;
import java.io.File;
import com.bjy.data.DataClass;
import com.bjy.data.PopClass;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
/** 엑셀파일 읽은 후 특정 타입의 객체 배열에 저장하는 클래스 **/
public class ExcelReaderClass {
public ExcelReaderClass() {
}
/** 엑셀 파일 불러 와 읽은 후 모든 지역구의 특정 데이터만 저장해주는 메서드**/
public static void loadExcel(String uri_excel) {
File f = null;
Workbook wb = null;
try {
f = new File(uri_excel);
wb = Workbook.getWorkbook(f);
Sheet s = wb.getSheet(0);
// s.getRows() 데이터의 총 행의 갯수 읽는 메서드
// 이거 사용하면 굳이 while문으로 try-catch문 사용할 필요 X
// 1-자치구, 6-한국인, 9-외국인
// 한줄씩 읽어서 Population 객체에 저장
// 단 5행부터 데이터 읽기 (행index => 4부터 시작)
int rowIndex = 4;
PopClass pop = null;
// 행의 숫자 커지면 데이터에 값이 없으므로 null값이 읽혀지는데 PopClass에 매개변수로 int형에는 null이 올수 없어
// 그러면 프로그램 오류 발생하므로 try, catch문 만들어 데이터 읽기 완료 했다고 알려줘
try {
while(true) {
Cell cell1 = s.getCell(1, rowIndex);
Cell cell2 = s.getCell(6, rowIndex);
Cell cell3 = s.getCell(9, rowIndex);
pop = new PopClass(cell1.getContents(), cell2.getContents(), cell3.getContents());
// pop.testToString();
// 객체 데이터 확인 코드 : 코드 완성 후 삭제
DataClass.populations.add(pop);
rowIndex++;
}
}catch (Exception e) {
System.out.println("데이터 저장 오류 " + e.getMessage());
}
}catch (Exception e) {
System.out.println("엑셀 파일 읽기 오류 ERR : " + e.getMessage());
}
}
}
MethodClass
package com.bjy.util;
import java.util.ArrayList;
import com.bjy.data.DataClass;
import com.bjy.data.PopClass;
public class MethodClass {
public MethodClass() {
}
/** 외국인이 가장 많이 사는 지역 정보 찾아서 문자열 반환하는 메서드**/
public static String maxPop() {
int big = 0;
int index_Max = 0;
for(int i=0;i<DataClass.populations.size();i++) {
if(big<DataClass.populations.get(i).getForNum()) {
big = DataClass.populations.get(i).getForNum();
index_Max = i;
}
}
return DataClass.populations.get(index_Max).getLocal();
}
/** 외국인보다 한국인이 많이 사는 지역명 찾아서 반환하는 메서드**/
public static ArrayList<String> greatThenPop() {
ArrayList<PopClass> popList = DataClass.populations; // 데이터 담긴 변수명 길어서 따로 저장
ArrayList<String> localList = new ArrayList<String>(); // 특정 지역명 저장하는 변수
for(PopClass pop : popList) {
if(pop.getForNum() < pop.getKorNum()) {
localList.add(pop.getLocal());
}
}
return localList;
}
/** 나이가 많은 분을 위해 추천하는 지역명 찾아서 반환하는 메서드
* 외국인 + 한국인 수가 가장 적은 지역 추천 **/
public static String minPop() {
ArrayList<PopClass> popList = DataClass.populations;
String local = "";
int temp = 10000000;
int total = 0;
for(PopClass pop : popList) {
total = pop.getForNum() + pop.getKorNum();
if(temp> total) {
temp = total;
local = pop.getLocal();
}
}
return local;
}
}
PrintClass
package com.bjy.out;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class PrintClass {
public PrintClass() {
}
/** 저장된 태그와 저장할 html 파일명을 받아서 새로운 html 파일을 생성하는 메서드 **/
public static String makeTags(String q1, String local_MaxFor, String q2, ArrayList<String> localList, String q3, String local_Min ) {
String tags = "";
tags = tags + "<!doctype>"; // html5 선언
tags = tags + "<html>"; // html 시작
tags = tags + "<head><title>문제 및 결과</title></head>"; // 웹브라우저에 제목 달기
tags = tags + "<body>"; // 사용자 화면 시작
tags += q1 + "<br />";
tags += local_MaxFor + "<br/><br/>";
tags += q2 + "<br/>";
for(String s : localList) {
tags += s + " ";
}
tags += "<br/>";
tags += "<br/>";
tags += q3 + "<br/>";
tags += local_Min + "<br/>";
tags += "</body>"; // 사용자 화면 종료
tags += "</html>"; // html 종료
return tags;
}
/** 생성된 태그와 html 경로 및 파일명을 매개변수로 받아 실제 html 파일 생성하는 메서드 **/
public static void makeHTML(String uri_html, String tags) {
FileWriter fw = null;
try {
fw = new FileWriter(uri_html);
System.out.println("fw 쓰기 객체 생성 =>" + uri_html);
fw.write(tags);
System.out.println("fw.write(tags) : 태그 쓰기");
fw.close();
System.out.println("html 파일 생성 완료");
}catch(IOException e) {
System.out.println("html 파일 생성 오류" + e.getMessage());
}
}
}
MainClass
package com.bjy;
import java.util.ArrayList;
import com.bjy.out.PrintClass;
import com.bjy.util.ExcelReaderClass;
import com.bjy.util.MethodClass;
public class MainClass {
public static void main(String[] args) {
String uri_excel = "c:/filetest/population_in_Seoul_edit.xls";
ExcelReaderClass.loadExcel(uri_excel);
/** 1. 외국인이 가장 많이 거주하는 지역은 ? **/
String q1 = "1. 외국인이 가장 많이 거주하는 지역은 ?";
String local_MaxFor = MethodClass.maxPop();
// 결과 데이터 잘 저장되었는지 확인용
// System.out.println(local_MaxFor);
/** 2. 외국인보다 한국인이 많이 거주하는 지역은? **/
String q2 = "2. 외국인보다 한국인이 많이 거주하는 지역은?";
ArrayList<String> localList = MethodClass.greatThenPop();
// 결과 데이터 잘 저장되었는지 확인용
// for(String s : localList) {
// System.out.println(s);
// }
/** 3. 나이가 많은 분을 위해 추천하고 싶은 지역과 그 이유는 ?
* 열 index(6 한국인 + 9 외국인 ) => 가장 적은 지역 **/
String q3 = "3. 나이가 많은 분을 위해 추천하고 싶은 지역과 그 이유는 ?<br/> 단, 이분은 민족주의 사관과 "
+ "개인주의 성향을 가지고 있다.";
String local_Min = MethodClass.minPop();
// 결과 데이터 잘 저장되었는지 확인용
// System.out.println(local_Min);
/** 결과를 html로 출력하기 위한 태그 생성 **/
String tags = PrintClass.makeTags(q1, local_MaxFor, q2, localList, q3, local_Min);
// 결과 데이터 잘 저장되었는지 확인용
// System.out.println(tags);
/** 태그 이용하여 실제 html 파일 생성 **/
String uri_html = "c:/filetest/문제 및 결과.html";
PrintClass.makeHTML(uri_html, tags);
}
}
MainClass에서 실행시 html 결과물 화면
배운 점 및 느낀 점
- 문제를 제대로 읽자
문제를 잘못 이해하여 특정 지역구의 모든 데이터를 출력하느라 코드가 지저분하고 많이 길어졌다.
- 코드를 짤 때는 명확한 이유가 있어야 한다, 항상 why?라고 생각하며 작성하자
ExcelReaderClass에서 try-catch문을 왜 쓰는지 try-catch문이 먼저 와야 하는지 while 무한루프가 먼저 와야 하는지 생각하지 않고 그냥 코드를 짰었다. while문에서 더 이상 읽을 값이 없으면 null이 PopClass 객체의 매개변수로 들어가게 되는데 String 타입의 매개변수는 괜찮지만, int 타입의 매개변수의 경우에는 null값이 들어가면 오류가 발생하게 된다. 따라서 while문 밖에 try-catch 문으로 감싼 후 오류가 발생하면 데이터를 모두 읽었다고 표시해주어야 오류가 아닌 정상적으로 처리되었다는 것을 알 수 있다.
- 코드는 최대한 간결하고 필요한 위치에만 작성하기
위에 나와있는 것과 비슷한 맥락이다.
내가 코드를 짤 땐 문제 답에 대한 지역구의 정보를 MethodClass의 static 변수선언 후 저장해주었는데, 각 메서드마다 static 변수를 만들어줘야 해서 지저분하였고 메서드 내에서만 사용되는 정보라 클래스의 멤버변수로 선언하지 않고 메서드 지역변수로 더 좋은 코드였다고 느꼈다.
항상 코드를 짤 땐 왜 이 자리에 이런 코드를 작성해야 하는지 생각하고 작성해야겠다.
문제 2
1. 3대 중범죄가 가장 많이 발생하는 지역의 경찰서를 찾으세요 (3대 중범죄 : 살인 / 강도 / 강간 )
2. 범죄 검거가 가장 낮은 지역의 경찰서를 찾으세요 (범죄 : 살인 / 강도 / 강간 / 절도 / 폭력 )
위 두가지 문제와 답들을 나타낸 html 파일 생성 프로젝트를 만드세요.
직접 짠 설계도
직접 작성한 코드
package com.bjy.data;
public class CrimeClass {
private String name = "";
private int caseMurder = 0;
private int arrestMurder = 0;
private int caseRobber = 0;
private int arrestRobber = 0;
private int caseRape = 0;
private int arrestRape = 0;
private int arrestTheft = 0;
private int arrestViolence = 0;
public CrimeClass() {
}
public CrimeClass(String name, String caseMurder, String arrestMurder, String caseRobber, String arrestRobber, String caseRape, String arrestRape, String arrestTheft, String arrestViolence) {
this.name = name;
this.caseMurder = Integer.parseInt(caseMurder);
this.arrestMurder = Integer.parseInt(arrestMurder);
this.caseRobber = Integer.parseInt(caseRobber);
this.arrestRobber = Integer.parseInt(arrestRobber);
this.caseRape = Integer.parseInt(caseRape);
this.arrestRape = Integer.parseInt(arrestRape);
this.arrestTheft = Integer.parseInt(arrestTheft);
this.arrestViolence = Integer.parseInt(arrestViolence);
}
public String getName() {
return name;
}
public int getCaseMurder() {
return caseMurder;
}
public int getArrestMurder() {
return arrestMurder;
}
public int getCaseRobber() {
return caseRobber;
}
public int getArrestRobber() {
return arrestRobber;
}
public int getCaseRape() {
return caseRape;
}
public int getArrestRape() {
return arrestRape;
}
public int getArrestTheft() {
return arrestTheft;
}
public int getArrestViolence() {
return arrestViolence;
}
public String testToString() {
return this.name + this.arrestMurder + "";
}
}
DataClass
package com.bjy.data;
import java.util.ArrayList;
public class DataClass {
/** 엑셀로 읽어서 필요한 데이터만 저장할 변수 생성 (데이터가 몇개인지 모르니 ArrayList 배열로**/
public static ArrayList<CrimeClass> crimeData = new ArrayList<CrimeClass>();
public DataClass() {
}
}
ExcelReader 클래스
public class ExcelReader {
public ExcelReader() {
}
/** 엑셀 파일 읽어서 DataClass의 static 변수에 저장하는 메서드 **/
public static void loadExcel(String uri_data) {
File f= null;
Sheet s = null;
CrimeClass cc = null;
try {
f = new File(uri_data);
Workbook wb = Workbook.getWorkbook(f);
s = wb.getSheet(0);
int rowNum = 1;
try {
while(true) {
Cell cell1 = s.getCell(1, rowNum);
Cell cell2 = s.getCell(2, rowNum);
Cell cell3 = s.getCell(3, rowNum);
Cell cell4 = s.getCell(4, rowNum);
Cell cell5 = s.getCell(5, rowNum);
Cell cell6 = s.getCell(6, rowNum);
Cell cell7 = s.getCell(7, rowNum);
Cell cell8 = s.getCell(9, rowNum);
Cell cell9 = s.getCell(11, rowNum);
cc = new CrimeClass(cell1.getContents(), cell2.getContents(), cell3.getContents(), cell4.getContents(), cell5.getContents(), cell6.getContents(), cell7.getContents(), cell8.getContents(), cell9.getContents());
DataClass.crimeData.add(cc);
++rowNum;
}
}catch (Exception e) {
System.out.println("데이터 저장 완료 " + e.getMessage());
}
}catch(Exception e) {
System.out.println("데이터 읽기 오류 " + e.getMessage());
}
}
}
MethodClass
package com.bjy.util;
import java.util.ArrayList;
import com.bjy.data.CrimeClass;
import com.bjy.data.DataClass;
public class MethodClass {
public MethodClass() {
}
/** DataClass static 변수 배열들중 살인/강간/강도 발생수 가장 높은 관서명 반환 **/
public static String maxName() {
int big = 0;
int result_index = 0;
ArrayList<CrimeClass> crimeData = DataClass.crimeData;
for(int i=0;i<crimeData.size();i++) {
if(crimeData.get(i).getCaseMurder() + crimeData.get(i).getCaseRape() + crimeData.get(i).getCaseRobber() > big ) {
big = crimeData.get(i).getCaseMurder() + crimeData.get(i).getCaseRape() + crimeData.get(i).getCaseRobber();
result_index = i;
}
}
return crimeData.get(result_index).getName();
}
/** DataClass static 변수 배열들중 살인/강간/절도/폭력 검거 수 가장 낮은 관서명 반환 **/
public static String minName() {
int min = 1716; // DataClass.crimeData 배열의 첫번째 객체 살인/강간/절도/폭력 검거 수
int result_index = 0;
ArrayList<CrimeClass> crimeData = DataClass.crimeData;
for(int i=0;i<crimeData.size();i++) {
if(crimeData.get(i).getArrestMurder() + crimeData.get(i).getArrestRape() + crimeData.get(i).getArrestRobber() + crimeData.get(i).getArrestTheft() < min) {
min = crimeData.get(i).getArrestMurder() + crimeData.get(i).getArrestRape() + crimeData.get(i).getArrestRobber() + crimeData.get(i).getArrestTheft();
result_index = i;
}
}
return crimeData.get(result_index).getName();
}
}
PrintClass
package com.bjy.out;
import java.io.FileWriter;
import java.io.IOException;
public class PrintClass {
public PrintClass() {
}
/** 위 두개의 메서드를 통해 결과값, 질문들 String으로 매개변수 받아서 html 파일 출력 **/
public static String makeTags(String q1, String maxName, String q2, String minName) {
String tags = "";
tags = tags + "<!doctype>";
tags = tags + "<html>";
tags = tags + "<head><title>crime_in_Seoul</title></head>";
tags = tags + "<body>";
tags += q1 + "<br/>";
tags += maxName + "<br/><br/>";
tags += q2 + "<br/>";
tags += minName + "<br/><br/>";
tags += "</body>";
tags += "</html>";
return tags;
}
public static void makeHTML(String uri_html, String tags) {
FileWriter fw = null;
try {
fw = new FileWriter(uri_html);
System.out.println("fw 쓰기 객체 생성 =>" + uri_html);
fw.write(tags);
System.out.println("fw.wrte(tags) : 태그 작성");
fw.close();
System.out.println("파일 종료");
}catch (IOException e) {
System.out.println("html 파일 생성 오류" + e.getMessage());
}
}
}
MainClass
package com.bjy;
import com.bjy.data.CrimeClass;
import com.bjy.data.DataClass;
import com.bjy.out.PrintClass;
import com.bjy.util.ExcelReader;
import com.bjy.util.MethodClass;
public class MainClass {
public static void main(String[] args) {
String uri_data = "c:/filetest/crime_in_Seoul_include_gu_name.xls";
ExcelReader.loadExcel(uri_data);
// for(CrimeClass c : DataClass.crimeData) {
// System.out.println(c.testToString());
// }
String q1 = "3대 중범죄가 가장 많이 발생하는 지역의 경찰서를 출력하세요... (3대 중범죄 : 살인 / 강도 / 강간 )";
String maxName = MethodClass.maxName();
// System.out.println(maxName);
String q2 = "범죄 검거가 가장 낮은 지역의 경찰서를 출력하세요... (범죄 : 살인 / 강도 / 강간 / 절도 / 폭력 )";
String minName = MethodClass.minName();
// System.out.println(minName);
String tags = PrintClass.makeTags(q1, maxName, q2, minName);
// System.out.println(tags);
String uri_html = "c:/filetest/bjy.html";
PrintClass.makeHTML(uri_html, tags);
}
}
MainClass 실행시 결과
'Java' 카테고리의 다른 글
TIL_210331_Thread (스레드) (0) | 2021.03.31 |
---|---|
TIL_210330_Collection 인터페이스 (0) | 2021.03.30 |
TIL_210325_자바로 엑셀 파일 읽기, 데이터 다루기 관련 문제 (0) | 2021.03.25 |
TIL_210324_추상클래스, 라이브러리 추가, 엑셀파일 다루기 (0) | 2021.03.24 |
이클립스_자바 라이브러리 추가 (0) | 2021.03.24 |