과제1>키보드로 부터 입력한 데이터를 DataOutputStream을
이용하여 다음 데이터를 stu.dat 파일에 기록하자.
* 데이터는 이름(UTF), 국어(int), 영어(int), 수학(int), 과학(int) 순이다.
입력>홍길동 80 75 65 50
public static void main(String[] args) throws Exception{
//1. 키보드를 입력한다.
byte buf[] = new byte[100];
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name;
int kor, mat, eng, sci;
System.out.println("이름 입력 :");
name = br.readLine();
System.out.println("국어 입력 :");
kor = Integer.parseInt(br.readLine());
System.out.println("수학 입력 :");
mat= Integer.parseInt(br.readLine());
System.out.println("영어 입력 :");
eng = Integer.parseInt(br.readLine());
System.out.println("과학 입력 :");
sci = Integer.parseInt(br.readLine());
//2. 스트림 생성
DataOutputStream dos = new DataOutputStream(new FileOutputStream("test.dat"));
//3. 생성한 스트림에 utf와 int로 파일에 저장
dos.writeUTF(name);
dos.writeInt(kor);
dos.writeInt(mat);
dos.writeInt(eng);
dos.writeInt(sci);
//4. 스트림 닫기
dos.close();
}
과제2>DataInputStream을 이용하여 stu.dat 파일의 데이터를
읽어와서 Student 클래스의 객체로 출력하자.
class Student{
String name;
int kor;
int eng;
int mat;
int sci;
}
실행결과>홍길동 80 75 65 50
Student.java
//3. 메소드로 학생 객체 생성
class Student {
String name;
int kor;
int eng;
int mat;
int sci;
}
DataOutput_Test.java
public class DataOutput_Test {
public static void main(String[] args) throws Exception {
Student s = new Student();
//1. 스트림 생성
DataInputStream dis = new DataInputStream(new FileInputStream("test.dat"));
//2. 데이터 가져오기
s.name = dis.readUTF();
s.kor = dis.readInt();
s.mat = dis.readInt();
s.eng = dis.readInt();
s.sci = dis.readInt();
//3. 객체생성
//4. 메소드를 써서 화면에 출력
System.out.println("이름 : "+s.name+" 국어: "+s.kor+" 수학: "+s.mat+" 영어: "+s.eng+" 과학: "+s.sci);
//5. 스트림 닫기
dis.close();
}
}
과제3> BankSystem.java를 기초로 MyBank.java, Customer.java, Account.java 만들기
BankSystem.java
public class BankSystem {
private MyBank myBank;
//MyBank 호출
public BankSystem() {
myBank = new MyBank();
showMenu();
}
//메뉴와 기능 작성
public void showMenu() {
String menu = null;
String ID;
String name;
long balance;
do {
System.out.println("**** 메뉴를 입력하세요 ****");
System.out.println("* 1 --- 고객 등록 *");
System.out.println("* 2 --- 고객 보기 *");
System.out.println("* 3 --- 고객 전체 보기 *");
System.out.println("* 4 --- 고객 예금 출금 *");
System.out.println("* 5 --- 고객 예금 입금 *");
System.out.println("* q --- 끝내기 *");
System.out.println("*******************************");
System.out.println(">>");
menu = readFromKeyboard();
//고객등록 - ID,name, 잔고를 키보드로 입력받는다.
//잔고는 Long형으로 받고, myBank의 addCustomer로 삽입
if (menu.equals("1")) {
System.out.println("ID를 입력하세요 : ");
ID = readFromKeyboard();
System.out.println("이름을 입력하세요 : ");
name = readFromKeyboard();
System.out.println("잔고를 입력하세요 : ");
balance = Long.parseLong(readFromKeyboard());
myBank.addCustomer(ID, name, balance);
} //if "1"-end
//고객보기 - ID만 입력받아서 myBank의 getCustomer에서 일치하는 ID를 찾는다.
//일치하는 ID가 있으면 고객의 정보에 대해 출력한다.
else if (menu.equals("2")) {
System.out.print("고객 ID를 입력하세요 : ");
ID = readFromKeyboard();
Customer cust = myBank.getCustomer(ID);
if (cust != null) {
System.out.println(cust.getID()+" : "+cust.getName()+" : "+cust.getAccount().getBalance());
} else {
System.out.println("등록된 고객이 없습니다.");
}//if (cust != null) -end
} //else if("2") -end
//고객전체보기 - myBank의 getAllCustomer를 호출한다.
//for문을돌려 고객 수가 있는 만큼만 출력되게 한다.
else if (menu.equals("3")) {
Customer[] allCust = myBank.getAllCustomers();
for(int i=0;i<allCust.length;i++) {
System.out.println(allCust[i].getID()+" : "+allCust[i].getName()+" : "+allCust[i].getAccount().getBalance());
}//for-end
}//else if("3")-end
//고객예금출금 - ID를 입력받아서 ID를 확인한 후, 출금할 액수를 Long형으로 입력받는다.
//Customer의 getAccount를 사용해서 정상출금되면 출금되었단 메시지와 액수를 출력한다.
else if(menu.equals("4")) {
System.out.println("고객 ID를 입력하세요 : ");
ID = readFromKeyboard();
Customer cust = myBank.getCustomer(ID);
if (cust == null) {
System.out.println("\n등록된 고객이 아닙니다.");
} else {
System.out.print("출금액을 입력하세요 : ");
balance = Long.parseLong(readFromKeyboard());
if (cust.getAccount().withdraw(balance) == true) {
System.out.print("정상적으로 출금되었습니다.");
System.out.print("출금 후 잔고는 : "+cust.getAccount().getBalance()+"\n");
} else {
System.out.println("잔고가 부족합니다.\n");
}//if (cust.getAccount().withdraw(balance) == true)-end
}//if (cust == null) -end
}//else if(menu.equals("4"))-end
//고객예금입금 - ID를 확인한 후, 입금액을 Long형으로 입력받는다.
//Account클래스의 desposit으로 입금액을 받고, 정상적으로 입금되었단 메시지와 입금액을 출력한다.
else if(menu.equals("5")) {
System.out.println("고객 ID를 입력하세요 : ");
ID = readFromKeyboard();
Customer cust = myBank.getCustomer(ID);
if(cust == null) {
System.out.println("\n등록된 고객이 아닙니다!!!");
} else {
System.out.print("입금액을 입력하세요 : ");
balance = Long.parseLong(readFromKeyboard());
cust.getAccount().deposit(balance);
System.out.print("정상적으로 입금되었습니다.");
System.out.print("입금 후 잔고는 : "+cust.getAccount().getBalance()+"\n");
}//if(cust == null)-end
}//else if(menu.equals("5"))-end
System.out.println();
}//do - end
while(!menu.equals("q"));
}//showMenu()-end
//키보드 입력을 받는다.
public String readFromKeyboard() {
String input = null;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
input = br.readLine();
} catch(Exception e) { }
return input;
} //readFromKeyboard()-end
//메인실행
public static void main(String[] args) {
BankSystem bankSystem = new BankSystem();
} //main-end
}//banksystem-end
MyBank.java
package BankSystem.hee;
public class MyBank{
//myBank가 Customer.java의 메소드들을 배열로써 접근한다.
Customer[] customers;
int customerNum;
//customers의 배열 수를 잡아준다.
public MyBank() {
customers = new Customer[20];
}
//고객등록하는 메소드, 아이디, 이름, 금액을 입력받는다. 고객의 수를 알기 위해서 배열 수 대신 customerNum을 넣어주었다. 그러면 addCustomer를 사용할 때마다 자동적으로 숫자가 올라가 10명을 입력했다면 10의 값을 갖고 있게 된다.
public void addCustomer(String ID, String name, long balance) {
//후치 증감자라서 배열0에서부터 customer가 들어간다. 그다음은 1부터 차차 삽입된다.
customers[customerNum++] = new Customer(ID, name, balance);
}
public int getCustomersNum() {
return customerNum;
}
//해당되는 customer객체를 리턴한다. customerNum이 고객의 수를 갖고 있어서 고객 수만큼만 for문을 돌려준다. 일치하는 아이디가 있으면 그에 해당하는 고객정보를 돌려준다.
public Customer getCustomer(String ID) {
Customer cust = null;
for (int i=0;i<customerNum;i++) {
if(customers[i].getID().equals(ID)) {
cust = customers[i];
}
}
return cust;
}
//고객 전체보기 메소드이다. 고객 수만큼 배열을 생성해주고 System.arraycopy라는 메소드로 고객 수만큼 생성한 배열의 고객 정보를 복사한다.
public Customer[] getAllCustomers() {
Customer[] cust1 = new Customer[customerNum];
//System.arraycopy(원본배열, 원본이시작할위치, 복사할배열, 복사가시작될위치, 복사할수);
System.arraycopy(customers, 0, cust1, 0, customerNum);
return cust1;
}
}
// private Customer[] customers;
// private static int customerNum;
//
// public void addCustomer(String ID, String name, long balance) {
// customers[20] = new Customer(ID, name, balance);
// customerNum++;
// }
// public int getCustomersNum() {
// return customerNum;
// }
// //등록된 고객을 아이디로 찾는다.
// public Customer getCustomer(String ID) {
// return customers[20];
// }
// public Customer[] getAllCustomers() {
// //return customers[10];
// }
Customer.java
public class Customer {
private String ID;
private String name;
private Account account;
public Customer(String ID, String name, long balance) {
account = new Account(ID, balance);
this.ID = ID;
this.name = name;
}
public void setAccount(Account account) {
this.account = account;
}
public Account getAccount() {
return account;
}
public String getID() {
return ID;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Account.java
public class Account {
private String ID;
private long balance;
public Account(String ID, long balance) {
this.ID = ID;
this.balance = balance;
}
//고객예금입금
public void deposit(long amt) {
balance += amt;
}
//고객예금출금 - 출금이 성공한다면 리턴값으로 true를 돌려준다.
성공하지 않으면 false 리턴.
public boolean withdraw(long amt) {
if (balance > amt) {
balance -= amt;
return true;
} else
return false;
}
public String getID() {
return ID;
}
public long getBalance() {
return balance;
}
}
객체 직렬화 예제
TestSerializable.java
//객체가 직렬화를 할 수 있는지 확인
//이 클래스(또는 객체)를 주고 받고 하겠다는 뜻.
public class TestSerializable implements Serializable {
String name;
int age;
String password;
public TestSerializable(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
}
SerializableMyObject.java
public class SerializableMyObject {
//직렬화 선언
TestSerializable ts;
public static void main(String[] args) {
SerializableMyObject smo = new SerializableMyObject();
try {
smo.writeMyObject();
smo.ts = null;
smo.readMyObject();
} catch(Exception e) {
System.out.println(e.getMessage());
}
System.out.println(smo.ts.name);
System.out.println(smo.ts.age);
System.out.println(smo.ts.password);
}
private void readMyObject() throws Exception{
//파일을 연다.
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myObject.ser"));
//파일을 읽어 들여서 ts에 저장
ts = (TestSerializable)ois.readObject();
//파일을 닫는다.
ois.close();
}
private void writeMyObject() throws Exception {
//파일에 쓸 인자들
ts = new TestSerializable("홍길동", 20, "동길홍");
//데이터를 입력할 파일을 연다.
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("myObject.ser"));
//파일에 ts에 들어가 있는 인자들을 쓴다.
oos.writeObject(ts);
//파일을 닫는다.
oos.close();
}
}
과제4> BankSystem.java를 arrayList로 바꾸자.
BankSystem.java
public class BankSystem {
private MyBank myBank;
public BankSystem() {
myBank = new MyBank();
showMenu();
}
public void showMenu() {
String menu = null;
String ID;
String name;
long balance;
do {
System.out.println("**** 메뉴를 입력하세요 ****");
System.out.println("* 1 --- 고객 등록 *");
System.out.println("* 2 --- 고객 보기 *");
System.out.println("* 3 --- 고객 전체 보기 *");
System.out.println("* 4 --- 고객 예금 출금 *");
System.out.println("* 5 --- 고객 예금 입금 *");
System.out.println("* q --- 끝내기 *");
System.out.println("*******************************");
System.out.print(">>");
menu = readFromKeyboard();
if (menu.equals("1")) {
System.out.print("ID를 입력하세요 :");
ID = readFromKeyboard();
System.out.print("이름을 입력하세요 :");
name = readFromKeyboard();
System.out.print("잔고를 입력하세요 :");
balance = Long.parseLong(readFromKeyboard());
myBank.addCustomer(ID, name, balance);
} //if "1"-end
else if (menu.equals("2")) {
System.out.print("고객 ID를 입력하세요 :");
ID = readFromKeyboard();
Customer cust = myBank.getCustomer(ID);
if (cust != null) {
System.out.println(cust.getID()+" : "+cust.getName()
+" : "+cust.getAccount().getBalance());
} else {
System.out.println("등록된 고객이 없습니다.");
}//if (cust != null) -end
} //else if("2") -end
else if (menu.equals("3")) {
ArrayList<Customer> allCust = myBank.getAllCustomers();
for(int i=0;i<allCust.size();i++) {
System.out.println(allCust.get(i).getID()+" : "
+allCust.get(i).getName()+" : "+allCust.get(i).getAccount().getBalance());
}//for-end
}//else if("3")-end
else if(menu.equals("4")) {
System.out.println("고객 ID를 입력하세요 :");
ID = readFromKeyboard();
Customer cust = myBank.getCustomer(ID);
if (cust == null) {
System.out.println("\n등록된 고객이 아닙니다.");
} else {
System.out.print("출금액을 입력하세요 :");
balance = Long.parseLong(readFromKeyboard());
if (cust.getAccount().withdraw(balance) == true) {
System.out.print("정상적으로 출금되었습니다.");
System.out.print("출금 후 잔고는 : "+cust.getAccount().getBalance()+"\n");
} else {
System.out.println("잔고가 부족합니다.\n");
}//if (cust.getAccount().withdraw(balance) == true)-end
}//if (cust == null) -end
}//else if(menu.equals("4"))-end
else if(menu.equals("5")) {
System.out.println("고객 ID를 입력하세요 :");
ID = readFromKeyboard();
Customer cust = myBank.getCustomer(ID);
if(cust == null) {
System.out.println("\n등록된 고객이 아닙니다!!!");
} else {
System.out.print("입금액을 입력하세요 :");
balance = Long.parseLong(readFromKeyboard());
cust.getAccount().deposit(balance);
System.out.print("정상적으로 입금되었습니다.");
System.out.print("입금 후 잔고는 : "+cust.getAccount().getBalance()+"\n");
}//if(cust == null)-end
}//else if(menu.equals("5"))-end
System.out.println();
}//do - end
while(!menu.equals("q"));
}//showMenu()-end
public String readFromKeyboard() {
String input = null;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
input = br.readLine();
} catch(Exception e) { }
return input;
} //readFromKeyboard()-end
public static void main(String[] args) {
BankSystem bankSystem = new BankSystem();
} //main-end
}//banksystem-end
MyBank.java
public class MyBank {
ArrayList<Customer> customers;
int customerNum;
public MyBank() {
customers = new ArrayList<Customer>();
}
public void addCustomer(String ID, String name, long balance) {
//후치 증감자라서 배열0에서부터 customer가 들어간다. 그다음은 1부터 차차 삽입된다.
Customer cu = new Customer(ID, name, balance);
customers.add(cu);
customerNum++;
}
public int getCustomersNum() {
return customerNum;
}
//해당되는 customer객체를 리턴
public Customer getCustomer(String ID){
Customer cust = null;
//customerNum이 고객의 수를 갖고 있기 때문에..
for (int i=0;i<customerNum;i++) {
if(customers.get(i).getID().equals(ID)) {
cust = customers.get(i);
}
}
return cust;
}
public ArrayList<Customer> getAllCustomers() {
return customers;
}
}
과제5> 키보드로부터 이름, 국어, 영어, 수학, 과학 점수를
입력받아 Student객체를 생성한 후 ObjectOutputStream을
이용하여 저장해 보자.(student.dat)
과제6>과제1 문제에서 생성된 파일 'student.dat'로 부터 객체들을 읽어와서 평균의 내림차순으로 정렬해보자.
과제5,6을 같이함
objectStudent.java
public class objectStudent implements Serializable{
String name;
int kor, eng, mat, sci,avg;
public objectStudent(){};
public objectStudent(String name, int kor, int eng, int mat, int sci) {
this.name = name;
this.kor = kor;
this.eng = eng;
this.mat = mat;
this.sci = sci;
this.avg=(this.kor+this.eng+this.mat+this.sci)/4;
}
}
objectStudent_Exam.java
public class objectStudent_Exam {
public static objectStudent[] os; //객체 직렬화
private int len;
private String eName;
private int eKor, eEng, eMat, eSci;
public void writeStudent() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.ser"));
System.out.print("입력할 사람의 수는 몇 명입니까?");
len = Integer.parseInt(br.readLine());
os = new objectStudent[len];
for(int i=0;i<len;i++) {
System.out.print("학생"+(i+1)+"의 이름입력 :");
eName = br.readLine();
System.out.print("국어입력 :");
eKor = Integer.parseInt(br.readLine());
System.out.print("영어입력 :");
eEng =Integer.parseInt(br.readLine());
System.out.println("수학입력 :");
eMat =Integer.parseInt(br.readLine());
System.out.println("과학입력 :");
eSci = Integer.parseInt(br.readLine());
os[i] = new objectStudent(eName, eKor, eEng, eMat, eSci);
oos.writeObject(os[i]);
}
System.out.println("입력이 끝났습니다.");
oos.close();
}
public void readStudent() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.ser"));
for(int i=0;i<len;i++) {
os[i] = (objectStudent)ois.readObject();
}
for(int i=0;i<(len-1);i++) {
objectStudent temp = new objectStudent();
for(int j=i+1;j<len;j++) {
if(os[i].avg < os[j].avg) {
temp = os[i];
os[i] = os[j];
os[j] = temp;
}
}
}
for(int i=0;i<len;i++) {
System.out.println("이름:"+os[i].name+" 평균:"+os[i].avg);
}
ois.close();
}
public static void main(String[] args) throws Exception{
objectStudent_Exam ose = new objectStudent_Exam();
ose.writeStudent();
ose.readStudent();
}
}
과제7>baseball 게임 만들기
BaseballGame.java
public class BaseballGame {
static String readKeyboard() {
String input = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
input = br.readLine();
} catch (Exception e) {
e.getMessage();
}
return input;
}
public static void main(String[] args) {
int[] numsInput = new int[3];
int strike=0;
int ball = 0;
NumberManager nm = new NumberManager();
for(int i=0;i<3;i++){
System.out.print(nm.numsHidden[i]+" ");
}
do{
System.out.println("세자리를 입력하세요");
try{
String inputStr = readKeyboard();
numsInput[0]=Integer.parseInt(inputStr.substring(0, 1));
numsInput[1]=Integer.parseInt(inputStr.substring(1, 2));
numsInput[2]=Integer.parseInt(inputStr.substring(2, 3));
}catch(Exception e){}
strike=nm.countStrike(numsInput);
ball = nm.countBall(numsInput);
}while(strike<3);
System.out.print("숫자는 ");
for(int i=0;i<3;i++){
System.out.print(nm.numsHidden[i]);
}
System.out.println(" 입니다. 게임이 끝났습니다.");
}
}
NumberManager.java
//기능부분 클래스
public class NumberManager {
int[] numsHidden = new int[9];
int temp, x, y;
public NumberManager() {
for(int i=0;i<9;i++) {
numsHidden[i] = i+1;
}
for(int i=0;i<14;i++) {
x = (int)(Math.random()*9);
y = (int)(Math.random()*9);
temp = numsHidden[x];
numsHidden[x] = numsHidden[y];
numsHidden[y] = temp;
}
}
// 같은 숫자 존재
public int countStrike (int[] numsInput) {
int a=0;
for(int i=0;i<3;i++) {
if (numsHidden[i] == numsInput[i]) {
a++;
}
}
System.out.println(a+"Strike!!");
return a;
}
//같은 자리 존재
public int countBall(int[] numsInput) {
int b=0;
for(int i=0;i<3;i++) {
//if(numsHidden[i] == numsInput[(i+1)%3]) {
// b++;
//}else if(numsHidden[i] == numsInput[(i+1)%3]) {
// b++;
//}
for(int j=0;j<3;j++) {
if(numsHidden[i] == numsInput[j] && numsHidden[i] != numsInput[i]) {
b++;
}
}
}
System.out.println(b+"Ball!");
return b;
}
}
'Study > Java' 카테고리의 다른 글
[java] 스레드, 소켓 실습 (0) | 2019.05.15 |
---|---|
[java] 스레드, 소켓 (0) | 2019.05.15 |
[java] Input, Output (0) | 2019.05.15 |
[java] 클래스와 자료구조 실습 (0) | 2019.05.15 |
[java] 클래스와 자료구조 (0) | 2019.05.15 |