티스토리 뷰


0. 상황

- 미니 전화번호부 작성

- 텍스트 파일 안에 들어있는 이름, 전화번호 데이터를 읽기

- 읽은 데이터를 콘솔창에 출력하기

- 단, 도메인 객체 내에 있는 toString override 한 클래스를 이용하기

- 컬렉션 객체를 이용하여 데이터 담기 (arrayList)


1. 개요

1) PhoneBook.text

 - 현재 텍스트 파일로 저장된 데이터

 - "사용자", "전화번호"로 구성된 형태


tel1,01012311234
tel2,01023412234
tel3,01033470773
tel4,01044564321
tel5,01055435677
 
cs



2) PhoneItem.java

 - 전화번호부에 쓰이는 사용자 및 전화번호 데이터를 사용하기 위한 클래스

 - 도메인 객체(VO)


package phoneBook;
 
public class PhoneItem {
    //field
    private String name;
    private String telNum;
    
    //constructor method
    public PhoneItem() {    
    }
 
    public PhoneItem(String name, String telNum) {
        super();
        this.name = name;
        this.telNum = telNum;
    }
 
    //getter, setter
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getTelNum() {
        return telNum;
    }
 
    public void setTelNum(String telNum) {
        this.telNum = telNum;
    }
 
    //toString override
    @Override
    public String toString() {
        return "PhoneItem [name=" + name + ", telNum=" + telNum + "]";
    }
    
}//end of class
 
cs



3) Properties.java

 - 데이터 저장소

 - 한 곳에 데이터를 몰아서 관리


package phoneBook;
 
public class Properties {
    
    static String menu_EX1 = "====== 미니 전화번호부 ======\n"
            + "1. 전화번호부 전체보기\n"
            + "2. 전화번호부 입력하기\n"
            + "3. 전화번호부 지우기\n"
            + "4. 전화번호부 수정하기\n "
            + "5. 전화번호부 종료하기\n "
            +"======================\n";
    
    static String menu2_name = "===== 전화번호 입력모드 =====\n"
            + "이름 입력 후 엔터를 누르세요\n ";
    static String menu2_phone = "전화번호 입력 후 엔터를 누르세요\n ";
    static String menu2_add = "입력이 완료되었습니다\n "
            + "메뉴를 선택하세요\n ";
    static String menu2_duplicate = "동일한 이름과 전화번호가 존재합니다\n "
            + "입력에 실패하였습니다\n "
            + "메뉴를 선택하세요\n ";
    static String menu2_duplicate2 = "전화번호는 다르지만 같은 이름이 존재합니다\n "
            + "그래도 입력하시겠습니까? (y/n)\n ";
    static String menu2_no = "입력을 취소하였습니다\n "
            + "메뉴를 선택하세요\n ";
 
    static String filePath = "C:/workspace/MiniPhoneBook/src/phoneBook/phonebook.txt";
    static String filePathTest = "C:/workspace/MiniPhoneBook/src/phoneBook/phonebook_test.txt";
}
 
cs

 


4) ArrayListTest1.java

 - main method가 포함된 자바 파일 (실행부)

 - 파일을 읽어서 arrayList 객체에 담는 클래스: readFileAddList

 - 읽은 파일을 콘솔창에 출력하는 클래스: printPhoneList


package phoneBook;
 
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.util.ArrayList;
 
public class ArrayListTest1_190309 {
    
    //PhoneItem 형식만 담을 수 있는 arraylist 객체 생성
    static ArrayList<PhoneItem> phonelist = new ArrayList<PhoneItem>();
    
    //목적: 텍스트 파일을 읽어서 phonelist 배열에 담기
    public static void readFileAddList(String filePath) {
        //파일을 읽을 때는 예외처리(throws exception도 가능)가 필수
        try {
            DataInputStream dis = new DataInputStream(new FileInputStream(filePath));
            
            while(true) {
                String text = dis.readLine();            //텍스트 파일 내 데이터를 한 줄 씪 읽음
                
                //무한 반복 현상을 막기 위해 텍스트 내 데이터가 없으면 끝내도록
                if(text == null) {
                    break;
                }
                
                String[] strArray = text.split(",");     //comma를 기준으로 자르기: 잘라야 원하는 데이터 추출이 가능하니까
//                System.out.println("strArray 값내 첫번째 값 확인: "+strArray[0]);
//                System.out.println("strArray 값내 두번째 값 확인: "+strArray[1]);
//                System.out.println("strArray 값내 세번째 값 확인: "+strArray[2]);    //데이터가 없으므로 ArrayIndexOutOfBoundsException 발생 
                
                //split으로 자른 데이터 arraylist에 담기(이 작업에서 헤맸다! 반드시 재확인)
                //1. phonelist를 그냥 쓸 수 있는 이유 필드에서 static으로 지정
                //2. arraylist 형식의 phonelist 변수에 넣기 위해 add 함수 사용
                //3. add 함수 내에 PhoneItem 인스턴스를 생성해야 가져다 사용할 수 있다는 점도 포인트다
                phonelist.add(new PhoneItem(strArray[0], strArray[1]));
            }
            
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    //목적: phonelist 내용 출력하기
    public static void printPhoneList() {
        //enhanced for loop
        for (PhoneItem phoneItem : phonelist) {
            System.out.println(phoneItem);
        }
    }
    
    //main method
    public static void main(String[] args) {
        
        System.out.println("main method start");
        readFileAddList(Properties.filePath);
        printPhoneList();
        System.out.println("main method end");
        
        
    }//end of main
    
}//end of class
 
cs



4-1) 자세히 알아보기

 (1) 텍스트 파일 내의 데이터 접근하기

  - DataInputStream 클래스를 이용

  - new 연산자를 이용하되 new 연산자를 여러 번 이용해야하는 점을 유의

  - 파일을 읽거나 쓸 때는 try ~ catch 문을 이용하거나 throws exception 을 통해 예외처리를 해줘야 함


try {
     DataInputStream dis = new DataInputStream(new FileInputStream(filePath));
        
    }catch(Exception e) {
        e.printStackTrace();
    }
}
 
cs



 (2) 텍스트 파일 내의 데이터 읽기

  - DataInputStream 클래스의 read() 메서드를 이용하면 한 글자 씩 읽을 수 있다

  - 텍스트의 양이 많다면 매우 비효율적

  - readLine() 메서드를 이용하면 한 줄 씩 읽을 수 있음

  - 반복문을 이용하여 파일 내의 데이터를 한 방에 읽기 시도했다는 점도 인지하고 있어야 함

  - while(true){ } : 무한 반복 현상이 일어날 수 있는 곳

  - null 체크: 텍스트 파일 내 데이터를 차례로 읽어서( readLine() ) 다음 줄에 데이터가 없다면 무한 루프 탈출


try {
      DataInputStream dis = new DataInputStream(new FileInputStream(filePath));
            
        while(true) {
            String text = dis.readLine();            //텍스트 파일 내 데이터를 한 줄 씪 읽음
            
            //무한 반복 현상을 막기 위해 텍스트 내 데이터가 없으면 끝내도록
            if(text == null) {
                break;
            }
        }
        
    }catch(Exception e) {
        e.printStackTrace();
    }
}
 
cs



 (3) 읽어온 데이터를 구분하여 arrayList 객체(배열 객체)에 담기

  - split() 메서드를 이용하여 원하는 데이터 자르기: comma를 CSV로 삼기 (구분자로 삼음)

  - arrayList (컬렉션 형식)의 변수 phonelist에 split() 메서드로 구분한 데이터 담기 (add 함수 사용)

  - new 연산자로 PhoneItem 인스턴스(도메인 객체)를 생성해야 add 함수로 값을 담을 수 있음


try {
      DataInputStream dis = new DataInputStream(new FileInputStream(filePath));
            
        while(true) {
            String text = dis.readLine();            //텍스트 파일 내 데이터를 한 줄 씪 읽음
            
            //무한 반복 현상을 막기 위해 텍스트 내 데이터가 없으면 끝내도록
            if(text == null) {
                break;
            }
            
            String[] strArray = text.split(",");     //comma를 기준으로 자르기
            
            //split으로 자른 데이터 arraylist에 담기(이 작업에서 헤맸다! 반드시 재확인)
            //1. phonelist를 그냥 쓸 수 있는 이유 필드에서 static으로 지정
            //2. arraylist 형식의 phonelist 변수에 넣기 위해 add 함수 사용
            //3. add 함수 내에 PhoneItem 인스턴스를 생성해야 가져다 쓸 수 있다는 점도 포인트
            phonelist.add(new PhoneItem(strArray[0], strArray[1]));
        }
        
    }catch(Exception e) {
        e.printStackTrace();
    }
}
 
cs




 (4) phonelist에 담은 데이터를 콘솔창에 출력하기

  - 반복문을 이용하여 처음부터 끝까지 데이터를 콘솔창에 출력하기


public static void printPhoneList() {
    //enhanced for loop
    for (PhoneItem phoneItem : phonelist) {
        System.out.println(phoneItem);
    }
}
 
cs



댓글