본문 바로가기

JAVA/쓸만한 코드

싱글톤//야구 멤버

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는 원래것 사용