자바 입출력 질문

조회수 1683회

EmployeeDB.java

import java.awt.; import java.awt.event.; import java.io.*;

public class EmployeeDB extends Frame implements ActionListener { static final int NONE = 0; static final int ADD = 1; static final int TOTAL = 2; static final int SEARCH = 3; static final int REMOVE = 4; static final int ESC = 5; Panel left, bottom; LabeledTextField name, number, dept, phone; TextArea display; Button addB, totalB, searchB, removeB, escB, exitB; Table table; int action; int count;

 public EmployeeDB() {
      setLayout(new BorderLayout());
     action = NONE;
     left = new Panel();
      bottom = new Panel();
      display = new TextArea();
      display.setEditable(false);
      name = new LabeledTextField("이 름");
      name.setEditable(false);
          number = new LabeledTextField("사 번");
          number.setEditable(false);
          dept = new LabeledTextField("부 서");
          dept.setEditable(false);
          phone = new LabeledTextField("전 화");
          phone.setEditable(false);
          left.setLayout(new GridLayout(4,1));
          left.setSize(400, 300);
          left.add(name);
          left.add(number);
          left.add(dept);
          left.add(phone);

          addB = new Button("추 가");
          addB.addActionListener(this);
          addB.setActionCommand("add");
          totalB = new Button("전체 보기");
          totalB.addActionListener(this);
          totalB.setActionCommand("total");
          searchB = new Button("검 색");
          searchB.addActionListener(this);
          searchB.setActionCommand("search");
          removeB = new Button("삭 제");
          removeB.addActionListener(this);
          removeB.setActionCommand("remove");
          escB = new Button("취 소");
          escB.addActionListener(this);
          escB.setActionCommand("esc");
          exitB = new Button("종 료");
          exitB.addActionListener(this);
          exitB.setActionCommand("exit");
          exitB.setBackground(Color.red);
          bottom.setLayout(new GridLayout(1,6));
          bottom.add(addB);
          bottom.add(totalB);
          bottom.add(searchB);
          bottom.add(removeB);
          bottom.add(escB);
          bottom.add(exitB);

          add("Center", display);
          add("West", left);
          add("South", bottom);

          table = new Table();
      }

      public void initialize() {
          action = NONE;
          addB.setEnabled(true);
          totalB.setEnabled(true);
          searchB.setEnabled(true);
          removeB.setEnabled(true);
          name.setText("");
          number.setText("");
          dept.setText("");
          phone.setText("");
          name.setEditable(false);
          number.setEditable(false);
          dept.setEditable(false);
          phone.setEditable(false);
      }

      public void actionPerformed(ActionEvent e) {
          int    index = 0;
          String cmd = e.getActionCommand();
          String nameString, num, part, tel;
          boolean found = false;
          String  msg = "";

          nameString = name.getText().trim();
          count = nameString.length();

         if(cmd.equals("add")) {
             if(action != ADD) {
                 action = ADD;
                 name.setEditable(true);
                 number.setEditable(true);
                 dept.setEditable(true);
                 phone.setEditable(true);
                 totalB.setEnabled(true);
                 searchB.setEnabled(true);
                 removeB.setEnabled(true);
                 return;
             }

             if(nameString == null || nameString.length() == 0)
                 return;
             num  = number.getText().trim();
             if(num == null || num.length() == 0)
                 return;
             part = dept.getText().trim();
             if(part == null || part.length() == 0)
                 return;
             tel = phone.getText().trim();

             display.setText(nameString + num + part + tel);
             table.add(nameString, num, part, tel);
             display.append("\n 등록을 성공적으로 마쳤습니다.");
             initialize();
         } else if(cmd.equals("total")) {
             action = TOTAL;
             initialize();
             index = table.getIndex();
             display.setText("\n 검색 건수 : 총 " + Integer.toString(index+1)+ " 건\n");
             display.append("\n============================================");
             display.append("\n 순번  \t성명   \t사번   \t부서명    \t전화번호 ");
             display.append("\n--------------------------------------------\n\n");
             if(index < 0) {
                 display.append(" 등록된 자료가 없습니다. \n");
                 return;
             }
             for(int i = 0; i <= index; i++) {
                 Record rec = table.readRec(i);
                 msg = " " + Integer.toString(i+1) + "  \t ";
                 msg +=  rec.getName() + " \t";
                 msg +=  Integer.toString(rec.getNum()) + " \t";
                 msg +=  rec.getPart() + " \t";
                 msg +=  rec.getTel() + "\n";
                 display.append(msg);
             }
         } else if(cmd.equals("search")) {
             if(action != SEARCH) {
                 action = SEARCH;
                name.setEditable(true);
                 addB.setEnabled(false);
                 totalB.setEnabled(false);
                 removeB.setEnabled(false);
                 return;
             }
             Record  rec;
             index = table.getIndex();
             nameString = name.getText().trim();
             if(nameString == null || nameString.length() == 0)
                 return;
             display.setText("\n ## 개인 조회 ###########\n");
             display.append("\n============================================");
             display.append("\n 순번  \t성명   \t사번   \t부서명  \t전화번호 ");
             display.append("\n--------------------------------------------\n\n");
             for(int i = 0; i <= index; i++) {
                 rec = table.readRec(i);
                 if(nameString.equals(table.readName(i, nameString.length()))) {
                     found = true;
                 }
                 if(found) {
                     msg = " " + Integer.toString(i+1) + "  \t ";
                     msg +=  rec.getName() + " \t";
                     msg +=  Integer.toString(rec.getNum()) + " \t";
                     msg +=  rec.getPart() + " \t";
                     msg +=  rec.getTel() + "\n";
                     display.append(msg);
                     msg = "";
                     break;
                 }
             }
             if (!found) {
                 display.setText(" 조회하신 성명이나 사번의  직원이 없습니다...");
             }
             initialize();
         } else if(cmd.equals("remove")) {
             if(action != REMOVE) {
                 action = REMOVE;
                 name.setEditable(true);
                 addB.setEnabled(false);
                 totalB.setEnabled(false);
                 searchB.setEnabled(false);
                 return;
             }
             index = table.getIndex();
             nameString = name.getText().trim();
             if(nameString == null || nameString.length() == 0)
                 return;
             display.setText("\n ## 삭제 ###########\n");
             display.append("\n============================================");
             display.append("\n 순번  \t성명   \t사번   \t부서명  \t전화번호 ");
             display.append("\n--------------------------------------------\n\n");
             for(int i = 0; i <= index; i++) {
                 Record rec = table.readRec(i);
                 if(nameString.equals(table.readName(i, nameString.length()))) {
                     found = true;
                 }
                 if(found) {
                     msg  = rec.getName();
                     msg += Integer.toString(rec.getNum());
                     msg += rec.getPart();
                     msg += rec.getTel();
                     display.append(msg);
                     msg = "";
                     found = true;
                     display.append("\n 위의 자료를 삭제하였습니다....");
                     for(int j=i+1; j <= index; j++) {
                         rec = table.readRec(j);
                         table.writeRec(rec.getName(),rec.getNum(),rec.getPart(),rec.getTel(),j-1);
                     }
                     table.remove(--index);
                     break;
                 }
             }
             if(!found) {
                 display.append("조회하신 성명의  직원이 없습니다...");
             }
             initialize();
         } else if(cmd.equals("esc")) {
             action = NONE;
             initialize();
         } else if(cmd.equals("exit")) {
             table.close();
             setVisible(false);
             dispose();
             System.exit(0);
         }
     }



     class Table {
         private RandomAccessFile myRAFile;
         private int recordCount;
         private int recordLength = 50;
         private int recordOffset = 4;

         public Table() {
             try {
                 myRAFile = new RandomAccessFile("employee.db", "rw");
                 if(myRAFile.length() ==0) {
                     recordCount = -1;
                 } else {
                     recordCount = myRAFile.readInt();
                 }
             } catch(IOException e) {
                 System.out.println("Can't access employee.dat");
             }
         }


         public int getIndex() {
             return recordCount;
         }

         public void add(String name, String num, String part, String tel) {
             writeRec(name, Integer.parseInt(num), part, tel, ++recordCount);
         }

         public void close() {
             try {
                 myRAFile.close();
             } catch(IOException ioe) {
                 System.out.println("IOException during close file");
             }
         }

         public Record readRec(int index) {
             String name="", part="", tel="" ;
             int    num = -1 ;

             try {
                 myRAFile.seek(index * recordLength + recordOffset);
                 for(int i = 0; i < 5;i++)  {
                     name += myRAFile.readChar();
                 }
                 num = myRAFile.readInt();
                 for(int i = 0; i < 6;i++) {
                     part += myRAFile.readChar();
                 }
                 for(int i = 0; i < 8;i++)  {
                     tel  += myRAFile.readChar();
                 }

             } catch(IOException ioe) {
                 System.out.println("IOException during read file..");
             }
             return (new Record(name, num, part, tel));
         }

        public String readName(int index, int len) {
             String name="";
             try {
                 myRAFile.seek(index * recordLength + recordOffset);
                 for(int i = 0; i < len;i++)  {
                     name += myRAFile.readChar();
                 }
             } catch (IOException ioe) {
                 System.out.println("IOException :"+ioe.toString());
             }
             return (name);
         }


         public void remove(int i) {
             recordCount = i;
         }


         public void writeRec(String name, int num, String part, String tel, int index) {
          int len = 0;

             try {
                 myRAFile.seek(index * recordLength + recordOffset);
                 len = name.length();
                 for(int i =0;i < 5;i++) {
                     myRAFile.writeChar((i < len ? name.charAt(i) : ' '));
                 }
                 myRAFile.writeInt(num);

                 len = part.length();
                 for(int i =0;i < 6;i++) {
                     myRAFile.writeChar((i < len ? part.charAt(i) : ' '));
                 }

                 len = tel.length();
                 for(int i =0;i < 8;i++) {
                     myRAFile.writeChar((i < len ? tel.charAt(i) : ' '));
                 }
                 myRAFile.seek(0);
                 myRAFile.writeInt(recordCount);
             } catch(IOException ioe) {
                 System.out.println("IOException while writing..");
             }
         }

     }


     class Record {
         private  String  name;
         private  int     num;
         private  String  part;
         private  String  tel;

         public Record(String na, int n, String p, String t) {
             name  = na;
             num   = n;
             part  = p;
             tel   = t;
         }

         public String getName() {
             return(name);
         }

         public int getNum() {
             return(num);
         }

         public String getPart() {
             return(part);
         }

         public String getTel() {
             return(tel);
         }
     }

     public static void main(String agrs[]) {
         EmployeeDB  db = new EmployeeDB();
         db.setSize(550, 300);
         db.setVisible(true);
     }
 }

LabeledTextField.java

import java.awt.*;

   public class LabeledTextField extends Panel{
       private  Label     label;
       private  TextField field;
       private  String    labelPosition;
       private  String   fieldPosition;

       public LabeledTextField(String labelString) {
          this(labelString, "1%, 5%, 25%, 95%", "27%, 5%, 98%, 95%");
      }


      public LabeledTextField(String labelString, String labelPosition, String fieldPosition) {
          super();
          setLayout(new FlowLayout());
          //Plsition Layout은 자바 클래스 내부에 있는 레이아웃이 아니라 수
          this.labelPosition = labelPosition;
          this.fieldPosition = fieldPosition;
          label = new Label(labelString);
          field = new TextField(20);
          add(labelPosition, label);
          add(fieldPosition, field);
      }

      public String getText() {
          return field.getText();
      }

      public void setText(String m) {
          field.setText(m);
      }

      public void setEditable(boolean t) {
          boolean able = field.isEditable();
          if(t != able)
              field.setEditable(t);
      }

      public static void main(String args[]) {
          Frame f = new Frame();
          LabeledTextField lt = new LabeledTextField("Name:");
          f.add("South", lt);
          f.setSize(400, 200);
          f.setVisible(true);
      }
  }

이 코드를 수정하고 싶습니다... 이 코드를 실행했을 때, 삭제와 검색할 경우 맨 앞글자만 입력해도 이게 실행됩니다. 그런데 전부 적었을 때만 삭제되고 검색할 수 있도록 수정하고 싶어요..ㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  •  if(nameString.equals(table.readName(i, nameString.length()))) 
    {
                         found = true;
    }
    
    

    먼저, 테이블 상에 "홍길동1", "홍길동2"이라는 사람이 순서대로 입력되었다고 가정하겠습니다.

    검색창에 "홍"을 입력하면 nameString에 "홍"이 저장됩니다.

    그럼 일단 nameString.length() 는 1이 되겠죠.

    그렇게 되면 table.readName(i, nameString.length())는 table.readName(i, 1)이 되고, 각 name 필드의 1바이트씩만 읽어오겠죠.

    그러다가 "홍길동1"의 "홍"을 가져온다면, nameString.equals(table.readName(i, nameString.length()))이 True가 되겠죠?"홍"과 "홍"을 비교한 거니까요. 그래서 if(found)이하의 코드가 실행되구요.

    name 필드 전체를 가져오고싶으면 table.readName()함수를 수정해야겠네요. 메소드 파라미터를 i 하나만 쓰시고, 항상 5바이트씩 읽어오면 되겠네요.(writeRec()메소드를 보니 name 필드가 5바이트네요.)

    그래서 최종적으로, 최소한의 수정으로 고친다면

     if(nameString.equals(table.readName(i, nameString.length()))) 
    {
                         found = true;
    }
    

    이 부분을

     if(nameString.equals(table.readName(i, 5).trim())) 
    {
                         found = true;
    }
    

    로 고치면 되지 않을까 합니다. 끝에 trim()을 쓴 이유는 writeRec()메소드로 name필드에 이름을 저장할 때, 입력한 이름이 5글자보다 작으면 뒤에는 공백으로 채워줬기 때문입니다.

    (참고로 제가 자바 컴파일러가 현재 없어서 테스트해보지는 못했습니다.)

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 안녕하세요 정말 정말 감사드리고요 ㅠㅠㅠㅠㅠ 아니 진짜 ㅠㅠㅠㅠㅠㅠ 전대호님 자바 천재 아니신가요? 진짜 실행되는 거 보고 너무 놀랐습니다.. 네 오류 없이 너무너무 잘 되어요.. 어떻게 코드만 쓱 보시고 수정하실 수 있으시지? 솔직히 코드도 워낙 긴지라 기대도 그리 안했는데 정말 감사드리고 ㅠㅠㅠ 긴 코드 봐주시느라 정말 고생하셨습니다. 정말 감사합니다 ㅠㅠ! 알 수 없는 사용자 2017.11.26 19:19
    • 더군다나 자세한 설명까지.. 진짜 너무 감사드리고요... 긴 코드 읽으시느라 정말 수고 많으셨어요.. 아니 근데 저걸 진짜 어떻ㄱ ㅔ수정하셨지..? 심지어 최소한의 수정이야.. 와....... 와... 저 이분야로 오면서.. 이 분야가 천재는 많긴 하지 ㅇㅇ 했는데 진짜 이렇게 접하게 되니까 너무 대단하시고 신기하네요.. 정말 감사합니다 ㅠㅠㅠ 알 수 없는 사용자 2017.11.26 19:21
    • ㅎㅎ;아니에요 버그하나 찾는거보다 이걸 짜신게 더 대단한거죵.. 알 수 없는 사용자 2017.11.26 19:34

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)