티스토리 뷰
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 |
'분리수거 대기중' 카테고리의 다른 글
POJO(Plain Old Java Object) (0) | 2019.04.03 |
---|---|
JQuery: radio 버튼 값 설정, 버튼 값 가져오기 (0) | 2019.03.27 |
JSON (JavaScript Object Notation) (0) | 2019.03.07 |
자바스크립트로 json 변수에 담겨있는 데이터 추출하기 (0) | 2019.03.07 |
Lombok (0) | 2019.03.07 |