728x90
이번 과제는 제일 힘들었다.
객체에 대해 급급하게 알아가던 중 정리가 안된상태에서 시작하였다.
하지만 모두 해결~!
DAO
Data Access Object의 약자로, 데이터베이스의 데이터에 접근하기 위해 생성하는 객체이다.
데이터베이스에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용한다.
간단하게, DB에 접속하여 데이터의 CRUD(생성, 읽기, 갱신, 삭제) 작업을 시행하는 클래스이다.
JSP 및 Servlet 페이지 내에 로직을 기술하여 사용할 수 있지만, 코드의 간결화 및 모듈화, 유지보수 등의 목적을 위해 별도의 DAO 클래스를 생성하여 사용하는 것이 좋다.
한 줄 요약 : DAO는 DB를 사용하여 데이터의 조회 및 조작하는 기능을 전담하는 오브젝트이다.
DTO
Data Transfer Object의 약자로, 계층간 데이터 교환을 위한 자바빈즈를 뜻한다.
또한 DTO는 VO(Value Object)와 용어를 혼용해서 많이 사용하는데, VO는 읽기만 가능한 read only 속성을 가져 DTO와의 차이점이 존재한다.
일반적으로 DTO는 로직을 가지고 있지 않은 순수한 데이터의 객체이며 객체의 속성과 그 속성의 접근을 위한 getter 및 setter 메소드만을 가지고 있다.
한 줄 요약 : DTO는 VO와 혼용하여 사용하며, 순수한 데이터의 객체이다.
MainClass
package main;
import java.util.Scanner;
import dao.BaseballDao;
public class MainClass {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BaseballDao dao = new BaseballDao();
while(true) {
System.out.println("menu ---------------------------");
System.out.println("1.선수추가");
System.out.println("2.선수삭제");
System.out.println("3.선수검색");
System.out.println("4.선수수정");
System.out.println("5.선수출력");
System.out.println("6.선수저장");
System.out.println("7.종료");
System.out.print(">>>>> ");
int work = sc.nextInt();
switch(work) {
case 1:
dao.insert();
break;
case 2:
dao.delete();
break;
case 3:
dao.select();
break;
case 4:
dao.update();
break;
case 5:
dao.allprint();
break;
case 6:
dao.dataSave();
break;
case 7:
System.exit(0);
break;
}
}
}
}
BaseballDao
package dao;
import java.util.Arrays;
import java.util.Scanner;
import dto.BatterDto;
import dto.HumanDto;
import dto.PitcherDto;
import file.DataProc;
public class BaseballDao {
Scanner sc = new Scanner(System.in);
// PitcherDto pit[] = new PitcherDto[30];
// BatterDto bat[] = new BatterDto[30];
//멤버변수
private HumanDto human[] = new HumanDto[30]; //30개로 지정
private int memberNum; //타자, 투수 지정 번호
private int memberCount; //늘어나는 번호
private DataProc dp;
public BaseballDao() {
dp = new DataProc("lions");//DataProc을 불러와서 파일 생성
dp.createFile();
dataLoad();
int lastIndexNumber = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null) {
lastIndexNumber = i;
}
}
if(lastIndexNumber > 0) {
memberNum = 1001 + ( human[lastIndexNumber].getNumber() % 1000 );
memberCount = lastIndexNumber + 1;
}else {
memberNum = 1001;
memberCount = 0; // human[] 관리하기 위한 변수
}
/*
human[0] = new PitcherDto(1001, "홍길동", 24, 180, 10, 2, 0.23);
human[1] = new BatterDto(2002, "일지매", 21, 182, 15, 3, 0.25);
human[2] = new PitcherDto(1003, "홍길동", 26, 175, 12, 4, 0.33);
*/
}
public void insert() {
// 투수/타자 ?
System.out.print("투수(1)/타자(2) = ");
int pos = sc.nextInt();
// human
System.out.print("이름 = ");
String name = sc.next();
System.out.print("나이 = ");
int age = sc.nextInt();
System.out.print("신장 = ");
double height = sc.nextDouble();
HumanDto hu = null;
if(pos == 1) { // 투수
System.out.print("승 = ");
int win = sc.nextInt();
System.out.print("패 = ");
int lose = sc.nextInt();
System.out.print("방어율 = ");
double defence = sc.nextDouble();
hu = new PitcherDto(memberNum, name, age, height, win, lose, defence);
}
else { // 타자
System.out.print("타수 = ");
int batcount = sc.nextInt();
System.out.print("안타수 = ");
int hit = sc.nextInt();
System.out.print("타율 = ");
double hitAvg = sc.nextDouble();
hu = new BatterDto(memberNum + 1000, name, age, height, batcount, hit, hitAvg);
}
human[memberCount] = hu;
memberNum++; // 선수 등록 번호
memberCount++; // 관리 배열의 index
}
public void delete() {
System.out.print("삭제하고 싶은 선수명 = ");
String name = sc.next();
int index = search(name.trim()); // "이병규 " != "이병규"
if(index == -1) {
System.out.println("선수명단에 없습니다");
return;
}
if(human[index] instanceof PitcherDto) {
PitcherDto p = (PitcherDto)human[index];
p.setNumber(0);
p.setName("");
p.setAge(0);
p.setHeight(0.0);
p.setWin(0);
p.setLose(0);
p.setDefence(0.0);
}
else if(human[index] instanceof BatterDto) {
BatterDto b = (BatterDto)human[index];
b.delete();
}
}
public void select() {
System.out.print("검색하고 싶은 선수명 = ");
String name = sc.next();
int count = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null && !human[i].getName().equals("")) {
if(name.equals(human[i].getName())) {
count++;
}
}
}
if(count < 1) {
System.out.println("검색한 선수는 없습니다");
return;
}
HumanDto man[] = new HumanDto[count];
int n = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null && !human[i].getName().equals("")) {
if(name.equals(human[i].getName())) {
man[n] = human[i];
n++;
}
}
}
// 검색된 선수명단
for (int i = 0; i < man.length; i++) {
System.out.println(man[i].toString());
}
}
public void update() {
System.out.print("수정하고 싶은 선수명 = ");
String name = sc.next();
int index = search(name.trim());
if(index == -1) {
System.out.println("선수명단에 없습니다");
return;
}
if(human[index] instanceof PitcherDto) {
System.out.print("방어율 = ");
double defence = sc.nextDouble();
PitcherDto p = (PitcherDto)human[index];
p.setDefence(defence);
}
else if(human[index] instanceof BatterDto) {
System.out.print("타율 = ");
double hitAvg = sc.nextDouble();
BatterDto b = (BatterDto)human[index];
b.setHitAvg(hitAvg);
}
System.out.println("성공적으로 수정되었습니다");
}
public int search(String name) {
int index = -1;
for (int i = 0; i < human.length; i++) {
if(human[i] != null && !human[i].getName().equals("")) {
if(name.equals(human[i].getName())) {
index = i;
break;
}
}
}
return index;
}
public void allprint() {
for (int i = 0; i < human.length; i++) {
if(human[i] != null && !human[i].getName().equals("")) {
System.out.println(human[i].toString());
}
}
}
public void dataSave() {
// 1001-홍길동-24-180-10-2-
int len = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null && !human[i].getName().equals("")) {
len++;
}
}
String datas[] = new String[len];
int w = 0;
for (int i = 0; i < human.length; i++) {
if(human[i] != null && !human[i].getName().equals("")) {
datas[w] = human[i].alldata();
w++;
}
}
for (int i = 0; i < datas.length; i++) {
System.out.println(datas[i]);
}
dp.fileSave(datas);
}
public void dataLoad() {
String datas[] = dp.fileLoad();
for (int i = 0; i < datas.length; i++) {
/*
1001-홍길동-24-180.0-10-2-0.23
2002-일지매-21-182.0-15-3-0.25
1003-홍길동-26-175.0-12-4-0.33
*/
String data[] = datas[i].split("-");
int pos = Integer.parseInt(data[0]);
if(pos < 2000) { // 투수
human[i] = new PitcherDto( Integer.parseInt(data[0]),
data[1],
Integer.parseInt(data[2]),
Double.parseDouble(data[3]),
Integer.parseInt(data[2]),
Integer.parseInt(data[2]),
Double.parseDouble(data[3]));
}
else { // 타자
human[i] = new BatterDto( Integer.parseInt(data[0]),
data[1],
Integer.parseInt(data[2]),
Double.parseDouble(data[3]),
Integer.parseInt(data[2]),
Integer.parseInt(data[2]),
Double.parseDouble(data[3]));
}
}
}
}
HunmanDto
package dto;
public class HumanDto {
private int number;
private String name;
private int age;
private double height;
public HumanDto() {
}
public HumanDto(int number, String name, int age, double height) {
this.number = number;
this.name = name;
this.age = age;
this.height = height;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return "Human [number=" + number + ", name=" + name + ", age=" + age + ", height=" + height + "]";
}
public String alldata() {
return "";
}
}
PitcherDto
package dto;
public class PitcherDto extends HumanDto {
private int win;
private int lose;
private double defence;
public PitcherDto() {
}
public PitcherDto(int number, String name, int age, double height,
int win, int lose, double defence) {
super(number, name, age, height);
this.win = win;
this.lose = lose;
this.defence = defence;
}
public int getWin() {
return win;
}
public void setWin(int win) {
this.win = win;
}
public int getLose() {
return lose;
}
public void setLose(int lose) {
this.lose = lose;
}
public double getDefence() {
return defence;
}
public void setDefence(double defence) {
this.defence = defence;
}
@Override
public String toString() {
return super.toString() + " Pitcher [win=" + win + ", lose=" + lose + ", defence=" + defence + "]";
}
@Override
public String alldata() {
return getNumber() + "-" + getName() + "-" + getAge() + "-" + getHeight()
+ "-" + win + "-" + lose + "-" + defence;
}
}
BatterDto
package dto;
public class BatterDto extends HumanDto {
private int batcount;
private int hit;
private double hitAvg;
public BatterDto() {
}
public BatterDto(int number, String name, int age, double height,
int batcount, int hit, double hitAvg) {
super(number, name, age, height);
this.batcount = batcount;
this.hit = hit;
this.hitAvg = hitAvg;
}
public int getBatcount() {
return batcount;
}
public void setBatcount(int batcount) {
this.batcount = batcount;
}
public int getHit() {
return hit;
}
public void setHit(int hit) {
this.hit = hit;
}
public double getHitAvg() {
return hitAvg;
}
public void setHitAvg(double hitAvg) {
this.hitAvg = hitAvg;
}
public void delete() {
setNumber(0);
setName("");
setAge(0);
setHeight(0.0);
setBatcount(0);
setHit(0);
setHitAvg(0.0);
}
@Override
public String toString() {
return super.toString() + " BatterDto [batcount=" + batcount + ", hit=" + hit + ", hitAvg=" + hitAvg + "]";
}
@Override
public String alldata() {
return getNumber() + "-" + getName() + "-" + getAge() + "-" + getHeight()
+ "-" + batcount + "-" + hit + "-" + hitAvg;
}
}
DataProc
package file;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class DataProc {
private File file;
public DataProc(String filename) {
file = new File("c:\\tmp\\" + filename + ".txt");
//파일 이름과 저장 경로를 설정해준다.
//파일 명은 Dao를 통해 설정해준다.
}
// file 생성
//createFile 메소드 작성
/*try/catch를 이용하여 파일이 존재하지 않거나 파일을 읽어 올 수 없을때 예외처리를 설정 한다.
*/
public void createFile() {
try {
if(file.createNewFile()) {
System.out.println("파일 생성 성공!");
}else {
System.out.println("파일 생성 실패");
}//try
}catch (IOException e) {
e.printStackTrace();
}
}
// file load
public String[] fileLoad() {// txt 파일 읽기라고 생각하면 된다.
String datas[] = null;
try {
BufferedReader br = new BufferedReader(new FileReader(file));
// data 총수를 구한다
int count = 0;
String str = "";
while((str = br.readLine()) != null) {
count++;
}
br.close();
// datas 할당
datas = new String[count];
// data를 취합 -> datas
br = new BufferedReader(new FileReader(file));
int w = 0;
while((str = br.readLine()) != null) {
datas[w] = str;
w++;
}
br.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return datas;
}
// file save
//
//
public void fileSave(String[] datas) {
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
//FileWriter는 파일에 쓰는 기능
//BufferdWriter : 버퍼를 이용하여 줄 단위로 작성
//박스를 사용해서 짐을 한번에 옮기는 방식이 버퍼를 사용하는 방식이라고 생각하면 된다.
//PrintWriter : 문자 출력 스트림
// 1001-홍길동-24-180-10-2-
for (int i = 0; i < datas.length; i++) {
pw.println(datas[i]);
}
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("파일에 저장되었습니다");
}
}
728x90
'JAVA' 카테고리의 다른 글
16일차//[java] 컬렉션 프레임워크 (0) | 2021.02.01 |
---|---|
16일차//[java] Generic (0) | 2021.02.01 |
16일차// [java] File 객체 (0) | 2021.02.01 |
오류와 예외 (0) | 2021.02.01 |
Address book / method사용 (0) | 2021.02.01 |