본문 바로가기

Study/Java

[java] Input, Output 실습

과제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