본문 바로가기

JAVA/기초 프로그래밍

야구선수 등록 프로그램(답안)

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
// 세줄짜리를 한줄로 줄여줌

설명사항

 

 


File

FileProc 기본생성자는 주로 외부에서 파일을 받아오는 편으로 입력값String이 있다

public FileProc_me(String filename) {
           file = new File("d:/tmp/"+filename+"txt");
}

loadData 생성자는 문자열을 리턴하므로 String[]형이고 배열을 생성시 먼저 null로 초기화 시켜준 후

//data 의갯수를 조사

//data를 할당

//배열 저장(재 초기화 해줘야 포인터가 맨 앞에 가있으므로 저장시 bufferedReader를 초기화해준다

//return 배열명

saveData는 외부에서 들어온 것이기 때문에 매개변수 배열로 받아주면 된다.


Dao

dao.loadData는 선언부에.

프로그램 종료시 System.exit(0);를 적고 입력받으면 자동종료

파일 저장/로딩코드는 file 클래스에서, 함수 내보내기 불러오기는 DAO 에서.

 

ex] DAO 기본생성자에 fp로("팀명, 프로젝트명")설정.
 public MemberDao_me( ) { 
           fp = new FileProc_me("baseball"); 
           fp.createFile(); 
 }

saveData 함수는

//등번호/이름.... 순서로 파일에 저장 할 때 중간에 토큰 '-'을 삽입한다

//데이터가 몇개인지부터 파악하고 필요없는 빈칸을 제거하고 human[i].toString()으로 datas[i]에 넣어준다

  (toString()은 super.toString() + "-" + win + "-" + lose + "-" + defence; 값)

 마지막에 

 fp.saveData(datas);

loadData 함수는

//파일에서 불러올 때 무조건 문자열로 되어있기 때문에 문자열로 불러와야함(ex, String datas[] = fp.loadData();) 

//분류가 Pit과 Bt로 되어있기 때문에 등번호<2000면 Pit으로 분류.

(물론 먼저 Integeer.parseInt(data[0])을 통해 숫자로 변환해줘야 함.)

//객체 생성 후 datas를 human[]에 동적할당하여 값을 저장.


기타

1. Human, Batter, Pitcher은 모두 끌어다 쓸 거여서 getter,setter셋팅, 기본생성자, this. , (toString-> 나중에 출력을 위한것: 오버라이딩 주의)까지 생성해준다

-> 자식클래스의 this. 변수에 Human this.를 추가

-> 자식클래스의 toString()출력부분 앞에 super.toString()을 추가. = Human값까지 출력

(ex, Human [number=4, name=3, age=5, height=3.0] Batter [batcount=4, hit=5, hitAvg=5.0])

 

2. 나는 데이터 불러오기와 저장까지는 못했음

 

3. 배열은 부모클래스의 배열로 잡아서 대입

(상속을 받았을 땐 부모클래스의 인스턴스로 자식 클래스를 묶을 수 있음 -> pit[], bt[]가 아닌 human[];)

 

4. setter, getter 사용을 위해

Batter_me bt = new Batter_me(); 와 같이 자식클래스 객체 생성

 

5. 주의 할 것으로는

선수의 등번호는 일반적으로 입력받지 않음,

투수인지 / 타자인지 먼저 입력받아 나눠서 정보 수령

 

6. 삭제 시

allClean()이라는 메서드를 각각 자식클래스에 생성하여 호출하여 사용함

 

7. 정해진 배열에 입력하기 위해 findIndex를 통해 빈곳을 찾아 대입함

 

 

 

Main

package main;

import java.util.Scanner;

import dao.MemberDao;

public class MainClass {

	public static void main(String[] args) {	
		Scanner sc = new Scanner(System.in);
		
		MemberDao dao = new MemberDao();
				
		// menu 구성	== front end -> View
		while(true) {
			
			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. 방어율 Ranking ");
			System.out.println("8. 타율 Ranking ");
			
			System.out.println("10. 프로그램 종료 ");
			
			System.out.print("메뉴 번호 입력 >>> ");
			int choice = sc.nextInt();
			
			switch( choice ) {
				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.saveData();
					break;
				case 7:
					break;
				case 8:
					dao.batterHitRanking();
					break;
										
				case 10:
					System.out.println("프로그램을 종료합니다");
					System.exit(0);					
					break;			
			}			
		}		
	}
}

 

 

 


 

 

 

D.A.O


// Data Access Object	= model == back end
public class MemberDao {
	
	Scanner sc = new Scanner(System.in);
	
	// 배열
	//private Pitcher pitcher[];
	//private Batter batter[];
	private Human human[] = new Human[20]; // 변수 20개 생성
	
	private int memberNumber;
	private int memberCount;
	
	FileProc fp;
	
	public MemberDao() {
		fp = new FileProc("baseball"); 
		fp.createFile();
		
		// human = new Human[20];	// 변수 20개 생성
		/*
		human[0] = new Pitcher(1000, "홍길동", 24, 172.1, 10, 3, 0.12);
		human[1] = new Batter(2001, "일지매", 21, 182.4, 25, 12, 0.345);
		human[2] = new Batter(2002, "정수동", 26, 174.2, 18, 5, 0.253);
		*/
		// human = new Human();	// 객체 생성
		
		this.loadData();
		
		int lastIndexNum = 0;
		for (int i = 0; i < human.length; i++) {
			if(human[i] != null) {
				lastIndexNum = i;
			}
		}
		
		if(lastIndexNum > 0) {
			memberNumber = 1000 + (human[lastIndexNum].getNumber() % 1000 + 1);
			memberCount = lastIndexNum + 1;
		}else {
			memberNumber = 1000;
			memberCount = 0;
		}		
	}	
	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();
		
		Human h = null;	
		// 투수	1000 ~ 
		if(pos == 1) {
			// win
			System.out.print("승 = ");
			int win = sc.nextInt();
			
			// lose
			System.out.print("패 = ");
			int lose = sc.nextInt();
			
			// defense
			System.out.print("방어율 = ");
			double defence = sc.nextDouble();
			
			h = 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 = sc.nextInt();
			bat.setBatcount(batcount);
						
			// 안타수
			System.out.print("안타수 = ");
			int hit = sc.nextInt();
			bat.setHit(hit);
			
			// 타율
			System.out.print("타율 = ");
			double hitAvg = sc.nextDouble();
			bat.setHitAvg(hitAvg);
			
			h = bat;
		}		
		
		human[memberCount] = h;
		memberNumber++;
		memberCount++;		
	}	
	public void delete() {
		
		System.out.print("삭제하고 싶은 선수명 입력 = ");
		String name = sc.next();
		
		if(name.equals("")) {
			System.out.println("이름을 정확히 입력해 주십시오.");
			return;		// continue
		}
		int findIndex = search(name);
		if(findIndex == -1) {
			System.out.println("선수 명단에 없습니다. 삭제할 수 없습니다");
			return;
		}
		// 삭제
		if(human[findIndex] instanceof Pitcher) {
			Pitcher p = (Pitcher)human[findIndex];
			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[findIndex] instanceof Batter) {
			Batter b = (Batter)human[findIndex];
			b.allClean();
		}		
	}	
	public void select() {		
		System.out.print("검색하고 싶은 선수명 = ");
		String name = sc.next();
		
		int findIndex = search(name);
		if(findIndex == -1) {
			System.out.println("선수 명단에 없습니다.");
		}
		else {
			System.out.println("번호:" + human[findIndex].getNumber());
			System.out.println("이름:" + human[findIndex].getName());
			System.out.println("나이:" + human[findIndex].getAge());
			System.out.println("신장:" + human[findIndex].getHeight());
			
			if(human[findIndex] instanceof Pitcher) {
				System.out.println("승리:" + ((Pitcher)human[findIndex]).getWin() );
				System.out.println("패전:" + ((Pitcher)human[findIndex]).getLose() );
				System.out.println("방어율:" + ((Pitcher)human[findIndex]).getDefence() );
			}
			else if(human[findIndex] instanceof Batter) {
				System.out.println("타수:" + ((Batter)human[findIndex]).getBatcount() );
				System.out.println("안타수:" + ((Batter)human[findIndex]).getHit() );
				System.out.println("타율:" + ((Batter)human[findIndex]).getHitAvg() );
			}
		}		
	}	
	public void update() {		
		System.out.print("수정하고 싶은 선수명 = ");
		String name = sc.next();
		
		int findIndex = search(name);
		if(findIndex == -1) {
			System.out.println("선수 명단에 없습니다.");
			return;
		}
		
		if(human[findIndex] instanceof Pitcher) {
			System.out.print("승 = ");
			int win = sc.nextInt();
			
			System.out.print("패 = ");
			int lose = sc.nextInt();
			
			System.out.print("방어율 = ");
			double defence = sc.nextDouble();
			
			Pitcher pit = (Pitcher)human[findIndex];
			pit.setWin(win);
			pit.setLose(lose);
			pit.setDefence(defence);			
		}
		else if(human[findIndex] instanceof Batter) {
			System.out.print("타수 = ");
			int batcount = sc.nextInt();
			
			System.out.print("안타수 = ");
			int hit = sc.nextInt();
			
			System.out.print("타율 = ");
			double hitAvg = sc.nextDouble();
			
			Batter bat = (Batter)human[findIndex];
			bat.setBatcount(batcount);
			bat.setHit(hit);
			bat.setHitAvg(hitAvg);			
		}		
	}
	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 int search(String name) {
		int index = -1;
		
		for (int i = 0; i < human.length; i++) {
			if(human[i] != null) {
				if(name.equals(human[i].getName())) {
					index = i;
					break;
				}
			}
		}
		return index;
	}
	public void saveData() {
		// 1001-홍길동-24-178.1-10-3-0.12
		int len = 0;		
		for (int i = 0; i < human.length; i++) {
			if(human[i] != null) {
				len++;
			}
		}		
		String datas[] = new String[len];		
		for (int i = 0; i < datas.length; i++) {
			datas[i] = human[i].toString();
		}
		fp.saveData(datas);		
	}
	
	public void loadData() {
		String datas[] = fp.loadData();
		/*
			datas : Pitcher, Batter		-> Human[]
					객체 생성
					값을 저장
		*/
		for (int i = 0; i < datas.length; i++) {
			// datas[0 ~ n-1]	
			// datas[0] => 1000-홍길동-24-178.1-10-2-0.12
			// datas[1] => 2001-일지매-21-181.1-21-11-0.34
			// datas[2] => 1002-정수동-26-182.4-11-4-0.24
			
			String data[] = datas[i].split("-");
			
			int title = Integer.parseInt(data[0]);
			if(title < 2000) {		// 투수				
				human[i] = 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]) );
			}
			else {
				human[i] = 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]) );
			}				
		}		
	}
	// 타율 순위 출력 1 ~ n
	public void batterHitRanking() {
		// 타자만을 수집한 배열
		Human chuman[] = positionSelect(2); 
		
		// 확인용
		System.out.println("타자만으로 출력용 -----");
		for (int i = 0; i < chuman.length; i++) {
			System.out.println(chuman[i].toString());
		}
		
		// 내림차순 정렬
		Human obj = null;
		for (int i = 0; i < chuman.length - 1; i++) {
			for (int j = i + 1; j < chuman.length; j++) {
				Batter b1 = (Batter)chuman[i];
				Batter b2 = (Batter)chuman[j];
				if(b1.getHitAvg() < b2.getHitAvg()) {
					obj = chuman[i];
					chuman[i] = chuman[j];
					chuman[j] = obj;
				}
			}
		}
		
		// 결과 출력
		System.out.println("정렬 후 타자만으로 결과 출력용 -----");
	/*	for (int i = 0; i < chuman.length; i++) {
			System.out.println(chuman[i].toString());
		}*/
		
		for (Human h : chuman) {	// foreach 문
			System.out.println(h.toString());
		}
	}
	
	// 방어율 순위 출력 1 ~ n
	public void pitcherDefenseRanking() {
		// 투수만을 수집한 배열
		// 올림차순 정렬
		// 출력
	}
	
	// 타자/투수 만을 산출할 수 있는 함수. 1:투수 2:타자   
	public Human[] positionSelect(int num) {
		int count = 0;
		
		// 우선 몇명인지 카운터
		for (int i = 0; i < human.length; i++) {
			if(human[i] != null) {
				if(num == 1) {
					if(human[i].getNumber() < 2000) {
						count++;
					}
				}
				else {
					if(human[i].getNumber() >= 2000) {
						count++;
					}					
				}
			}
		}
		// 명수에 맞게 할당
		Human choiceHuman[] = new Human[count];
		
		// 데이터의 수집
		int m = 0;
		for (int i = 0; i < human.length; i++) {
			if(human[i] != null) {
				if(num == 1) {
					if(human[i].getNumber() < 2000) {
						choiceHuman[m] = human[i];
						m++;
					}
				}
				else {
					if(human[i].getNumber() >= 2000) {
						choiceHuman[m] = human[i];
						m++;
					}					
				}
			}
		}
		return choiceHuman;
	}
}

 

 


 

 

Human

package dto;

// Data Transfer Object, Value Object 
public class Human {

	private int number;	// sequence number
	private String name;
	private int age;
	private double height;
	
	public Human() {
	}

	public Human(int number, String name, int age, double height) {
		super();
		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 number + "-" + name + "-" + age + "-" + height;
	}
}

 

 

 


 

 

Pitcher

package dto;

public class Pitcher extends Human {

	private int win;
	private int lose;
	private double defence;	// 0.0 ~ 10.0
	
	public Pitcher() {
	}

	public Pitcher(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;
		
		//this.setNumber(number);
		//this.setName(name);
	}

	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() + "-" + win + "-" + lose + "-" + defence;
	}
}

 

 


 

Batter


public class Batter extends Human {

	private int batcount;
	private int hit;
	private double hitAvg;	// 0.0 ~ 1.0
	
	public Batter() {
		// TODO Auto-generated constructor stub
	}

	public Batter(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;
	}

	@Override
	public String toString() {
		return super.toString() + "-" + batcount + "-" + hit + "-" + hitAvg;
	}
	
	public void allClean() {
		setNumber(0);
		setName("");
		setAge(0);
		setHeight(0.0);
		setBatcount(0);
		setHit(0);
		setHitAvg(0.0);		
	}
}

 

 


 

File

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 FileProc {

	private File file;
	
	public FileProc(String filename) {
		file = new File("d:\\tmp\\" + filename + ".txt");
	}
	
	public void createFile() {
		try {
			if(file.createNewFile()) {
				System.out.println("파일 생성 성공!");
			}else {
				System.out.println("파일 생성 실패");
			}
		} catch (IOException e) {			
			e.printStackTrace();
		}
	}
	
	public String[] loadData() {
		
		String datas[] = null;
		
		try {
			BufferedReader br = new BufferedReader(new FileReader(file));
		
			// data의 갯수를 조사 -> 배열		list를 사용하면, 이 처리는 필요없음 
			int count = 0;
			String str = "";
			
			while( (str = br.readLine()) != null ) {
				count++;				
			} 
			br.close();
			
			// datas를 할당
			datas = new String[count];
			System.out.println("datas.length = " + datas.length);
			
			// 배열 저장
			int w = 0;
			br = new BufferedReader(new FileReader(file));
			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;
	}
	
	public void saveData(String[] datas) {
		
		try {
			PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
			
			for (int i = 0; i < datas.length; i++) {
				pw.println(datas[i]);
			}			
			pw.close();
			
		} catch (IOException e) {			
			e.printStackTrace();
		}		
		
		System.out.println("파일에 저장되었습니다");
	}
}

'JAVA > 기초 프로그래밍' 카테고리의 다른 글

ArrayList 와 LinkedList  (0) 2020.06.09
interface//인터페이스 NameCard  (0) 2020.06.09
야구선수 등록 프로그램(Me)  (0) 2020.06.05
Calendar 캘린더 Class  (0) 2020.06.03
객체//베팅게임  (0) 2020.06.02