0311 Review

KDU·2022년 3월 11일

자바공부

목록 보기
17/17

I/O Stream은

열면 꼭 닫아줘야 한다. 연결이 되어 있는 상태에서는 다른 파일이나 접근하고자 하는 대상이 접근할수가 없기 때문에 수많은 문제가 생길 수 있다. 열었던 순서의 역순으로 닫아줘야 오류가 나는걸 막을 수 있다는 점도 잊지 말자.

잘못된 입력을 막기 위해 Try-Catch문을 사용할 때

Scanner를 사용하는 반복문을 써야 한다면, catch문에서 Scanner를 초기화해줘야 한다. 그렇지 않으면 System.in 클래스에서 더이상 값을 받을 수 없는 상태가 되어 무한루프에 빠지게 된다.

int age = 0;
while(true) {
	try {
		System.out.println("4. 나이를 입력하세요");
		age = s.nextInt();
		break;
	} catch(InputMismatchException e) {
		s = new Scanner(System.in);
		System.out.println("정상적인 나이를 입력하세요");
	}
}

CRUD project - (Arraylist, File)

멤버 리스트를 쉽게 저장할 수 있도록 ArrayList를 활용했고, 각 데이터의 분류가 쉽도록 list를 출력해야 할 때 .csv파일로 저장하도록 했다.

//멤버 Value Object
package study0311.crudfile;

import java.io.Serializable;

public class MemberVO  implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 8703985010418615479L;
	
	private String id;
	private String pw;
	private String name;
	private int age;
	
	public MemberVO() {}
	
	public MemberVO(String id, String pw, String name, int age) {
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.age = age;
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}

	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;
	}

	@Override
	public String toString() {
		return id + "," + pw + "," + name + "," + age;
	}
}
//액션 인터페이스
package study0311.crudfile;

import java.util.Scanner;

public interface Action {
	void excute(Scanner s);
}
//서비스 클래스
package study0311.crudfile;

import java.util.Scanner;

public class MemberService {

	void process(Action a, Scanner s) {
		a.excute(s);
	}
}
//메인클래스
package study0311.crudfile;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MemberMain {
	
	static List<MemberVO> mbv = new ArrayList<MemberVO>();

	public static void main(String[] args) {

		Scanner s = new Scanner(System.in);
		MemberService ms = new MemberService();
		ms.process(new ActionSave(), s);
		ms.process(new ActionRead(), s);

		while(true) {
			System.out.printf("\n\n\n\n\n\n\n\n\n\n");
			System.out.println("CRUD Project(ArrayList-File)");
			System.out.println("");
			System.out.println("1. Create");
			System.out.println("2. user lists");
			System.out.println("3. Update user info");
			System.out.println("4. Delete user");
			System.out.println("5. Make user file(.CSV)");
			System.out.println("6. Quit");

			String command = s.next();
			switch(command) {
			case "1" :
				ms.process(new ActionCreate() , s);
				break;
			case "2" :
				ms.process(new Actionlist(), s);
				break;
			case "3" :
				ms.process(new ActionUpdate(), s);
				break;
			case "4" :
				ms.process(new ActionDelete(), s);
				break;
			case "5" :
				ms.process(new ActionCSV(), s);
				break;
			case "6" :
				ms.process(new ActionSave(), s);
				System.out.println("프로그램을 종료합니다.");
				s.close();
				return;
			default :
				break;
			}
		}
	}
}
//계정 생성 (Create)
package study0311.crudfile;

import java.util.InputMismatchException;
import java.util.Scanner;

public class ActionCreate implements Action{

	@Override
	public void excute(Scanner s) {

		System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
		System.out.println("[ 계정 생성 ]");
		String id = null;
		boolean idCheck = true;
		while(idCheck) {
			System.out.println("1. 아이디를 입력하세요");
			id = s.next();
			idCheck = false;					
			for(MemberVO mv : MemberMain.mbv) {
				if(id.equals(mv.getId())) {
					System.out.println("중복되는 ID입니다.");
					idCheck = true;
					break;
				}
			}
		}
		System.out.println("2. 비밀번호를 입력하세요");
		String pw = s.next();
		System.out.println("3. 이름을 입력하세요");
		String name = s.next();
		int age = 0;
		while(true) {
			try {
				System.out.println("4. 나이를 입력하세요");
				age = s.nextInt();
				break;
			} catch(InputMismatchException e) {
				s = new Scanner(System.in);
				System.out.println("정상적인 나이를 입력하세요");
			}
		}
		MemberVO m = new MemberVO(id, pw, name, age);
		MemberMain.mbv.add(m);
	}
}
//멤버 목록 (Read)
package study0311.crudfile;

import java.util.List;
import java.util.Scanner;

public class Actionlist implements Action{

	@Override
	public void excute(Scanner s) {
		List<MemberVO> m = MemberMain.mbv;
		
		System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
		System.out.println("[ 회원 목록 ]");
		System.out.println("총 회원수 : " + m.size());
		
		for(MemberVO mv : m) {
			System.out.printf("[ ID : %s ] PW : '%s', Name : '%s', Age : '%s'\n",mv.getId(),mv.getPw(),mv.getName(),mv.getAge());
		}
		
		System.out.println("메인으로 이동하시려면 아무 키나 입력하세요");
		s.next();		
	}
}
//계정 수정 (Update)
package study0311.crudfile;

import java.util.List;
import java.util.Scanner;

public class ActionUpdate implements Action{

	@Override
	public void excute(Scanner s) {
		List<MemberVO> m = MemberMain.mbv;

		while(true) {
			System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
			System.out.println("3. Update user info");
			System.out.println("수정할 계정의 ID를 입력하세요");
			String id = s.next();
			System.out.println("수정할 계정의 PW를 입력하세요");
			String pw = s.next();

			for(MemberVO mv : m) {
				if(id.equals(mv.getId()) && pw.equals(mv.getPw())) {
					while(true) {
						System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
						System.out.println("[ 수정할 정보를 선택하세요 ]");
						System.out.println("1. 비밀번호");
						System.out.println("2. 이름");
						System.out.println("3. 나이");
						System.out.println("4. 나가기");
						String pick = s.next();
						switch(pick) {
						case "1":
							System.out.println("새로운 비밀번호를 입력하세요");
							String cPw = s.next();
							mv.setPw(cPw);
							break;
						case "2":
							System.out.println("새로운 이름을 입력하세요");
							String cName = s.next();
							mv.setName(cName);
							break;
						case "3":
							System.out.println("새로운 나이를 입력하세요");
							int cAge = s.nextInt();
							mv.setAge(cAge);
							break;
						default :
							return;
						}
					}
				}
			}
			System.out.println("존재하지 않는 계정입니다. 메인으로 가려면 아무 키나 누르세요");
			s.next();
			return;
		}
	}
}
//계정 삭제 (Delete)
package study0311.crudfile;

import java.util.List;
import java.util.Scanner;

public class ActionDelete implements Action{

	@Override
	public void excute(Scanner s) {
		while(true) {
			List<MemberVO> m = MemberMain.mbv;
			System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
			System.out.println("4. Delete user");
			System.out.println("삭제할 계정의 ID를 입력하세요");
			String id = s.next();
			System.out.println("삭제할 계정의 PW를 입력하세요");
			String pw = s.next();
			
			int checkNum = 0;
			for(MemberVO mv : m) {
				if(id.equals(mv.getId()) && pw.equals(mv.getPw())) {
					m.remove(checkNum);
					System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
					System.out.printf("ID : %s 가 삭제되었습니다.\n",mv.getId());
					System.out.println("1. 추가로 삭제");
					System.out.println("2. 메인으로 가기");
					String pick = s.next();
					switch(pick) {
					case "1":
						checkNum = 0;
						break;
					default :
						return;
					}
					break;
				} else {
					checkNum++;
				}
			}
			if(checkNum == m.size() && checkNum != 0) {
				System.out.println("존재하지 않는 계정입니다. 메인으로 가려면 아무 키나 누르세요");
				s.next();
				return;				
			} else if(checkNum == m.size() && checkNum == 0) {
				System.out.println("계정이 하나도 없습니다. 메인으로 가려면 아무 키나 누르세요");
				s.next();
				return;
			}
		}
	}
}
//프로그램 시작,종료시에 .info파일로 멤버 리스트 저장
package study0311.crudfile;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import java.util.Scanner;

public class ActionSave implements Action{

	@Override
	public void excute(Scanner s) {
		
		List<MemberVO> m = MemberMain.mbv;
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;
		
		try {
			fos = new FileOutputStream("userInfo.info");
			oos = new ObjectOutputStream(fos);
			oos.writeObject(m);
		} catch (IOException e) {
			System.out.println(e.toString());
		} finally {
			try {
				oos.close();
				fos.close();
			} catch (IOException e) {
				System.out.println(e.toString());
			}
		}
	}
}
//멤버 리스트 .csv파일화
package study0311.crudfile;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class ActionCSV implements Action{

	@Override
	public void excute(Scanner s) {
		
		FileWriter fw = null;
		BufferedWriter bw = null;
		
		try {
			fw = new FileWriter("users.csv");
			bw = new BufferedWriter(fw);
			fw.write("[ID],[PW],[NAME],[AGE]\n");
			for(MemberVO mv : MemberMain.mbv) {
				bw.write(mv.toString());
				bw.flush();
				bw.newLine();
			}
		} catch (IOException e) {
			System.out.println(e.toString());
		} finally {
			try {
				bw.close();
				fw.close();
			} catch (IOException e) {
				System.out.println(e.toString());
			}
		}
	}
}
profile
의문을 즐깁니다.

0개의 댓글