구리

TIL_210326_데이터 가공 관련 문제 본문

Java

TIL_210326_데이터 가공 관련 문제

guriguriguri 2021. 3. 28. 18:02

문제

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 과정 실행 후 설계도에 표시 하기 

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 파일 생성 프로젝트를 만드세요.

 

 

 

직접 짠 설계도 

큰 그림은 손으로 직접 그린 후 정리하면서 메모장에 정리하였다.

직접 작성한 코드

더보기
CrimeClass
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 실행시 결과