load를 제외 한 다른 insert, delete 등의 클래스는 모두 DaoImple을 상속받는다
*Dao 추상클래스 DaoImple
public interface DaoImpl {
public void process();
}
*싱글턴 : private로 sc 생성
기본생성자에 private을 붙임
getInstance 메서드는 static.
private으로 리스트, 변수 생성 시 getter를 생성해야 하므로 public으로 우선진행.
ArrayList<Human> 을 잡아도 되고 인스턴스List로 <Human>을 잡아도 됨
memberNumber는 싱글턴or Insert에 생성
public class SingletonCls {
private static SingletonCls sc = null;
public List<Human> list = null;
private SingletonCls() {
list = new ArrayList<Human>();
}
public static SingletonCls getInstance() {
if(sc == null) {
sc = new SingletonCls();
}
return sc;
}
}
*Insert
메서드마다 싱글턴 객체생성이 필요할 때 각 메서드안에 하도록 한다
(번호를 얻어와야 함으로 생성)
기본생성자 -
멤버넘버 셋팅
맨 마지막 번호 -> sc.list.get( sc.list.size() -1)).getNumber;
2000보다 크면 -1000 함 -> 새로 입력받을 때 타자는 +1000하여 받기때문
public class InsertClass implements DaoImpl {
Scanner scan = new Scanner(System.in);
private int memberNumber;
public InsertClass() {
SingletonCls sc = SingletonCls.getInstance();
memberNumber = sc.list.get( sc.list.size() - 1 ).getNumber();
if(memberNumber >= 2000) {
memberNumber = memberNumber - 1000;
}
memberNumber = memberNumber + 1;
}
@Override
public void process() {
SingletonCls sc = SingletonCls.getInstance();
// 투수/타자 ?
System.out.print("투수(1)/타자(2) = ");
int pos = scan.nextInt();
// human
System.out.print("이름 = ");
String name = scan.next();
System.out.print("나이 = ");
int age = scan.nextInt();
System.out.print("신장 = ");
double height = scan.nextDouble();
if(pos == 1) {
// win
System.out.print("승 = ");
int win = scan.nextInt();
// lose
System.out.print("패 = ");
int lose = scan.nextInt();
// defense
System.out.print("방어율 = ");
double defence = scan.nextDouble();
sc.list.add(new Pitcher(memberNumber, name, age, height, win, lose, defence));
}
// 타자 2000 ~
else if(pos == 2) {
Batter bat = new Batter();
// 선수 등록 번호
bat.setNumber(memberNumber + 1000);
bat.setName(name);
bat.setAge(age);
bat.setHeight(height);
// 타수
System.out.print("타수 = ");
int batcount = scan.nextInt();
bat.setBatcount(batcount);
// 안타수
System.out.print("안타수 = ");
int hit = scan.nextInt();
bat.setHit(hit);
// 타율
System.out.print("타율 = ");
double hitAvg = scan.nextDouble();
bat.setHitAvg(hitAvg);
sc.list.add(bat);
}
}
}
*delete
static 메서드를 이용하면 객체생성 안해도 됨. -> 자유롭게 불러쓸수 있음
->SelectClass.search(name)
(-> 이름 입력받아 싱글턴.리스트를 불러옴)
public class DeleteClass implements DaoImpl {
Scanner scan = new Scanner(System.in);
public DeleteClass() {
}
@Override
public void process() {
SingletonCls sc = SingletonCls.getInstance();
System.out.print("삭제하고 싶은 선수명 입력 = ");
String name = scan.next();
if(name.equals("")) {
System.out.println("이름을 정확히 입력해 주십시오.");
return; // continue
}
int findIndex = SelectClass.search(name);
if(findIndex == -1) {
System.out.println("선수 명단에 없습니다. 삭제할 수 없습니다");
return;
}
Human h = sc.list.remove(findIndex);
System.out.println(h.getName() + "의 데이터는 삭제되었습니다");
}
}
*select
search를 통해 검색 후 입력받음
public class SelectClass implements DaoImpl {
Scanner scan = new Scanner(System.in);
@Override
public void process() {
SingletonCls sc = SingletonCls.getInstance();
System.out.print("검색하고 싶은 선수명 = ");
String name = scan.next();
int findIndex = search(name);
if(findIndex == -1) {
System.out.println("선수 명단에 없습니다.");
}
else {
Human human = sc.list.get(findIndex);
System.out.println("번호:" + sc.list.get(findIndex).getNumber());
System.out.println("이름:" + human.getName());
System.out.println("나이:" + human.getAge());
System.out.println("신장:" + human.getHeight());
if(human instanceof Pitcher) {
System.out.println("승리:" + ((Pitcher)human).getWin() );
System.out.println("패전:" + ((Pitcher)human).getLose() );
System.out.println("방어율:" + ((Pitcher)human).getDefence() );
}
else if(human instanceof Batter){
System.out.println("타수:" + ((Batter)human).getBatcount() );
System.out.println("안타수:" + ((Batter)human).getHit() );
System.out.println("타율:" + ((Batter)human).getHitAvg() );
}
}
}
public static int search(String name) {
SingletonCls sc = SingletonCls.getInstance();
int index = -1;
for (int i = 0; i < sc.list.size(); i++) {
Human h = sc.list.get(i);
if(name.equals(h.getName())) {
index = i;
break;
}
}
return index;
}
}
*update
search를 통해 검색 후 수정
public class UpdateClass implements DaoImpl {
Scanner scan = new Scanner(System.in);
public UpdateClass() {
}
@Override
public void process() {
SingletonCls sc = SingletonCls.getInstance();
System.out.print("수정하고 싶은 선수명 = ");
String name = scan.next();
int findIndex = SelectClass.search(name);
if(findIndex == -1) {
System.out.println("선수 명단에 없습니다.");
return;
}
Human human = sc.list.get(findIndex);
if(human instanceof Pitcher) {
System.out.print("승 = ");
int win = scan.nextInt();
System.out.print("패 = ");
int lose = scan.nextInt();
System.out.print("방어율 = ");
double defence = scan.nextDouble();
Pitcher pit = (Pitcher)human;
pit.setWin(win);
pit.setLose(lose);
pit.setDefence(defence);
}
else if(human instanceof Batter) {
System.out.print("타수 = ");
int batcount = scan.nextInt();
System.out.print("안타수 = ");
int hit = scan.nextInt();
System.out.print("타율 = ");
double hitAvg = scan.nextDouble();
Batter bat = (Batter)human;
bat.setBatcount(batcount);
bat.setHit(hit);
bat.setHitAvg(hitAvg);
}
}
}
*Allprint
sc.list.get으로 출력
public class AllPrint implements DaoImpl {
public AllPrint() {
}
@Override
public void process() {
SingletonCls sc = SingletonCls.getInstance();
for (int i = 0; i < sc.list.size(); i++) {
Human human = sc.list.get(i);
System.out.println(human.toString());
}
}
}
*fileSave
file save 부분은 가져옴( 이름 정해놓기로 함)
save data 를 process부분에 대입
배열로 진행되서 배열 datas길이를 sc.list.size()로 바꿈.
sc.list.get(i)는 Human이므로 잡고
(Human h = sc.list.get(i))
후 h.toString 으로 출력
public class FileSaveClass implements DaoImpl {
File file = new File("d:\\tmp\\baseball.txt");
public FileSaveClass() {
}
@Override
public void process() {
SingletonCls sc = SingletonCls.getInstance();
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
for (int i = 0; i < sc.list.size(); i++) {
Human h = sc.list.get(i);
pw.println(h.toString());
}
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("파일에 저장되었습니다");
}
}
*fileLoad
file save 부분은 가져옴(이름 정해놓기로 함)
파일생성 실패로 나오는 이유는 -> 파일이 있기 때문에
기본생성자에서 호출되게 creatfile을 작성해 놓음
싱글턴 클래스 안 list에 넣어주기로 함
Dao부분에서 '-'을 제외했던 것처럼
(str -> 번호 - 이름 - 나이 - 신장 - ... 순으로 저장되어있음.)
맨 앞에 번호로 판단하므로 문자열을 str.slit("-")로 잘라준다
integer.parseInt(data[0])로 숫자로 바꿈.
번호 크기로 투수와 타자를 나눠 sc.list.add(pit/bt)로 list에 저장
(-> list에 직접저장했으므로 return필요 없음)
public class FileLoadClass {
File file = new File("d:\\tmp\\baseball.txt");
public FileLoadClass() {
createFile();
}
public void createFile() {
try {
if(file.createNewFile()) {
System.out.println("파일 생성 성공!");
}else {
System.out.println("파일 생성 실패");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void process() {
SingletonCls sc = SingletonCls.getInstance();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
// 배열 저장
String str;
while( (str = br.readLine()) != null ) {
// str -> 번호-이름-나이-신장-
// 문자열을 자른다
String data[] = str.split("-");
int number = Integer.parseInt(data[0]);
if(number < 2000) {
// 투수
Pitcher p = new Pitcher( Integer.parseInt(data[0]),
data[1],
Integer.parseInt(data[2]),
Double.parseDouble(data[3]),
Integer.parseInt(data[4]),
Integer.parseInt(data[5]),
Double.parseDouble(data[6]) );
sc.list.add(p);
}
else {
Batter b = new Batter( Integer.parseInt(data[0]),
data[1],
Integer.parseInt(data[2]),
Double.parseDouble(data[3]),
Integer.parseInt(data[4]),
Integer.parseInt(data[5]),
Double.parseDouble(data[6]) );
sc.list.add(b);
}
}
br.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
*main
public class mainClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
(new FileLoadClass()).process();
while(true) {
DaoImpl dao = null;
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("0. 프로그램 종료 ");
System.out.print("메뉴 번호 입력 >>> ");
int choice = scan.nextInt();
switch(choice) {
case 1:
dao = new InsertClass();
break;
case 2:
dao = new DeleteClass();
break;
case 3:
dao = new SelectClass();
break;
case 4:
dao = new UpdateClass();
break;
case 5:
dao = new AllPrint();
break;
case 6:
dao = new FileSaveClass();
break;
}
dao.process();
}
}
}
*Human, Pitcher, Batter는 원래것 사용
'JAVA > 쓸만한 코드' 카테고리의 다른 글
뷰클래스 셋팅 코드 (0) | 2020.06.12 |
---|---|
야구게임//memberNumber 코드 리스트/싱글톤 비교 (0) | 2020.06.10 |
Singleton//싱글톤//기본 코드 (0) | 2020.06.10 |
stack//스택// 원리 코드 (0) | 2020.06.10 |
Map//Baseball 야구멤버 (0) | 2020.06.09 |