본문 바로가기
이론/JAVA

주소록 만들기 - 자바 스터디 3회차 과제

by 유세지 2017. 11. 17.

 이번 과제는 파일 입출력을 이용해 주소록을 만들어 보는 것이다. 원래대로라면 FileBufferedReader, BufferedWriter 등을 이용해서 할 생각이었는데, 일단은 Scanner와 PrintWriter만을 이용해서 해보려고 했다. 중간중간 데이터가 깨지고 Scanner가 예상한대로 작동하지 않는 등 몇가지 문제가 있었는데 어찌어찌 동작은 하게됐다. 더러운 부분들은 추후에 수정할 예정.


 이번 과제를 하면서 알게된 점이 있는데, Scanner sc = new Scanner(System.in) 과 같은 선언은 한 번만 해야 한다는 것. 하나의 프로세스에는 하나의 IO만 연결된다고 한다. System.in은 시스템으로부터 IO권한을 가져오는 것인데, 시스템은 프로세스한테 하나의 IO만 걸어줄 수 있다고..


 처음 시도했던 방법은 InputData에서 새로운 스캐너를 만들어 파일에 집어넣는 방식이었는데, InputData에서 스캐너를 close시켰더니 Main의 스캐너가 함께 죽어버리는 현상이 발생해서 막혀있던 차에 다행히 동아리 선배님이 위의 내용을 알려주셔서 계속 돌려 쓸 새로운 스캐너 클래스 Scanners.java를 만들어서 사용하게 되었다.


 프로그램을 돌리고 나면 프로젝트 폴더에 test.csv 파일이 귀엽게 생성되어있다.


* 프로젝트 구성






* Main.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.FileNotFoundException;
 
public class Main {
 
    public static void main(String[] args) {
        InputData ipd = new InputData();
        PrintData prd = new PrintData();
        ResetData rsd = new ResetData();
        Scanners scs = new Scanners();
        
        String i;
 
        System.out.println("** 주소록 프로그램을 실행합니다. **");
        while (true) {
            try {
                System.out.println("***************\n무엇을 하시겠습니까?\n" + "  1. 데이터 읽기\n" + "  2. 데이터 추가\n" + "  3. 데이터 초기화\n" + "  4. 종료\n***************");
                i = scs.getSc();
                switch (i) {
                case "1":
                    prd.printAddress();
                    break;
                case "2":
                    ipd.inputAddress();
                    break;
                case "3":
                    rsd.resetAddress();
                    break;
                case "4":
                    System.out.println("** 프로그램을 종료합니다. **");
                    scs.ScClose();;
                    System.exit(0);
                    break;
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            
        }
    }
}
cs




* User.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class User {
    
    private String id;
    private String name;
    private int age;
    
    public User(String id, String name, int age) {
        setId(id);
        setName(name);
        setAge(age);
    }
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    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;
    }
}
 
cs




* InputData.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
 
public class InputData {
    public void inputAddress() throws FileNotFoundException {
        
        User us = new User(nullnull0);
        Scanners scs = new Scanners();
        
        System.out.println("** 주소록에 데이터를 추가합니다. **\n아이디를 입력해주세요.");
        us.setId(scs.getSc());
        
        
        System.out.println("이름을 입력해주세요.");
        us.setName(scs.getSc());
        
        
        System.out.println("나이를 입력해주세요.");
        us.setAge(Integer.parseInt(scs.getSc()));
        
        File f = new File("test.csv");
        Scanner fileSc = new Scanner(f);
        String result = "";
        
        
        while (fileSc.hasNext()) {
            String temp = fileSc.nextLine();
            User us_original = new User(temp.split(", ")[0], temp.split(", ")[1], Integer.parseInt(temp.split(", ")[2]));
 
            result = result + us_original.getId() + ", " + us_original.getName() + ", " + us_original.getAge() + '\n';
        }
        fileSc.close();
        PrintWriter pw = new PrintWriter(f);
        
        try{
            pw.println(result + us.getId() + ", " + us.getName() + ", " + us.getAge());
            //System.out.println(result + us.getId() + ", " + us.getName() + ", " + us.getAge());
            pw.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("데이터를 입력했습니다.\n");              
    } 
}
cs




* PrintData.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
 
public class PrintData {
    public void printAddress() throws FileNotFoundException {
        System.out.println("** 주소록의 데이터를 출력합니다. **\n 아이디 / 이름 / 나이");
        
        File f = new File("test.csv");
        Scanner sc = new Scanner(f);
        String result = "";
        
        while (sc.hasNext()) {
            String temp = sc.nextLine();
            User us = new User(temp.split(", ")[0], temp.split(", ")[1], Integer.parseInt(temp.split(", ")[2]));
 
            result = result + us.getId() + ' ' + us.getName() + ' ' + us.getAge() + '\n';
        }
 
        sc.close();
        System.out.println(result + "\n** 파일을 불러왔습니다. **");
    }
 
}
 
cs



* ResetData.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
 
public class ResetData {
    public void resetAddress() throws FileNotFoundException {
        File f = new File("test.csv");
        PrintWriter pw = new PrintWriter(f);
 
        pw.println("HongGilDong, 홍길동, 18");
        pw.println("SimBongsa, 심봉사, 43");
        pw.println("SimChung, 심청, 17");
        pw.println("HengBu, 흥부, 31");
        pw.println("NolBu, 놀부, 33");
        pw.close();
        
        System.out.println("** 데이터가 초기화 되었습니다. **\n");
    }
}
cs



* Scanners.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Scanner;
 
public class Scanners {
    private Scanner sc = new Scanner(System.in);
 
    public String getSc() {
        return sc.nextLine();
    }
 
    public void setSc(Scanner sc) {
        this.sc = sc;
    }
    
    public void ScClose() {
        this.sc.close();
    }
}
 
cs





* 실행결과

*** 콘솔창



*** test.csv 파일


반응형

댓글