티스토리 뷰

 

https://nikeisme827.tistory.com/18

 

[Java] 배열과 ArrayList (4) - 데이터를 읽어 들이고 배열 활용하기/ 간단한 Todolist 만들기

이 데이터를 가진 txt파일이 아래와 같이 원하는 형식으로 출력되게 할 것이다. ★ Maven project를 이용하여 project 파일 만들기 ☆ Maven이란? - 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으

nikeisme827.tistory.com

위의 게시글에서 파일 입출력을 적용하여 데이터를 읽어들였다.

 

하나의 class만 이용하면 한계점

1. 하나의 클래스 App.java에서 데이터 입출력, 연산, 출력 처리를 모두 다 하고 있다. ▶ God class

2. 객체가 아닌 기본 자료형을 활용 중이라 관리가 불편하다.

 

This step.

1. Todo 데이터를 하나로 모아서 관리해주느 별도의 클래스 Todo를 생성할 것이다.

   - 진행 여부 필드 추가 : Boolean is Completed 

2. 생성한 클래스 (Todo)를 활용하여 데이터를 관리한다.

3. 객체 ( Todo) 배열을 활용하여 읽은 데이터들을 Java에서 관리한다.

4. 할 일 순서 번호를 매겨 하나의 Todo를 조회하는 기능을 구현한다. 

 


★ Todo 클래스 만들고, 데이터 하나로 모으기

맛있게 요리할 데이터는 바로 이 todo.txt이다. 

 

Todo 데이터를 하나로 모아서 관리해주는 별도의 com.todo.model 패키지를 만들어 클래스 Todo를 생성했다.


 

1. Todo 데이터가 가지고 있는 멤버 변수를 보자.

   멤버 ( Member ) : 해당 클래스가 가지고 있는 구성원 ( 속성, 메서드)

   할 일 번호 / 할 일 제목 / 할 일 내용 / 할 일 마감기간 그리고 이번에는 진행 여부도 만들었다. 

 

2. Contructor를 구현하여 멤버 변수의 값을 지정하고 인스턴스를 초기화 하기 위해 생성자를 직접 구현한다.

 

   ☆생성자 ( Constructor)

     - 주로 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화 하는 역할

 

 

3. getter , setter 메서드 활용하기

   private로 선언한 멤버 변수를 외부 코드에서 사용하기 위해 getter,setter 메서드를 활용하여 값을 가져오고 지정한다.

   getter,setter 메서드로 public을 이용하여 private에 접근할 수 있다. 

 


★ Todo  데이터 입출력 결과 관리, 하나의 Todo 조회 해보기

1. Todo 데이터를 객체 멤버 변수 RESOURCES로 초기화 하기.

 

2. LocalDate를 yyyy-MM-dd 형태로 변환하기 위해 객체 멤버 변수 DATE_PATTERN으로 초기화 하기.

 

3. 파일 경로를 설정하고, todo data.txt 파일을 얻는다.

    data가 몇 줄인지 long 타입 numberOfRows 변수로 알아보자.

    값이 더 큰 타입 ▶ 작은 타입으로 변환 할때는 명시적으로 변환하려는 타입을 써야한다.

    이렇게 3 줄이 나온다.

출력 화면

 4. 이 3줄을 담은 Todo 배열 타입의 todos 인스턴스를 만들어보자.

     List를 사용하기 위해 하나로 인스턴스화 하기 위해 java.util.List 인터페이스 클래스를 이용한다.

     배열 하나로 만들기 위해 List<String>타입의 lines 인스턴스로 만들어 준다. 

     그럼 이렇게 배열 한 줄로 완성된다.

출력 화면


 

1. index를 0부터 초기화 한다.

 

2.각 인스턴스에 순차적으로 적용되기 위해  for each 구문을 이용한다.

  각 항목 줄 바꿈 하기.

  id는 Long타입으로 변환

  duedate 초기화한 DATE_PATTERN 적용시키기

 

3. id , title, dueDate, description 매개변수가 적용된 Todo 타입의 todo 인스턴스를 생성한다.

 

출력 화면

4. todo의 index가 1씩 증가하도록 한다. 


전체 Todos 조회를 해보자.

다시 Todo.java로 들어가자.

toString을 오버라이딩해준다. 

그럼 지정한 형태로 출력할 수 있다. 

출력 화면

 

참조변수 값 그대로 출력하면 내부적으로 toString()이 호출된다.

 

할 일 순서 번호(임의)로 하나의 Todo를 조회해보자.

Todo 2번을 조회해봤다. 

출력 화면

 


개선된 부분

- 기본 자료형들을 하나의 참조 자료형(참조 타입, Todo)으로 모아서 관리하기 때문에

   raw data를 건들지 않고, 별도의 클래스로 관리하게 됨 (Wrapping)

 

현재 한계점

- 메인 화면에 해당하는 App.java에서 데이터의 입출력과 결과 데이터를 출력 등 전부 수행하고 있음.

 


package com.todo;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;

import com.todo.model.Todo;

public class App {
	
	private static final String RESOURCES = "src/main/resources/";
	
	private static final DateTimeFormatter DATE_PATTERN = DateTimeFormatter.ofPattern("yyyy-MM-dd");

	public static void main(String[] args) throws IOException {
		
		final Path filePath = Paths.get(RESOURCES + "todo-data-simple.txt");
		Long numberOfRows = Files.lines(filePath).count(); 
//		System.out.println(numberOfRows.intValue());
		
		Todo[] todos = new Todo[numberOfRows.intValue()];
		
		List<String> lines = Files.readAllLines(filePath);
//		System.out.println(lines);
		
		int index = 0;
		for (String line : lines) {
			final String[] columns = line.split("\t");
			
			final Long id = Long.parseLong(columns[0]);
			final String title = columns[1];
			final LocalDate dueDate = LocalDate.parse(columns[2], DATE_PATTERN);
			final String description = columns[3];
			
			// id, title, dueDate, description을 어디에 쓰지?
			Todo todo = new Todo(id, title, dueDate, description);
//			System.out.println(todo);
			
			todos[index] = todo;
			index++;
			
//			todos[index++] = new Todo(Long.parseLong(columns[0]),
//									columns[1],
//									LocalDate.parse(columns[2], DATE_PATTERN),
//									columns[3]
//									);
		}//forEach() 끝
		
		// 전체 Todos 조회
//		System.out.println( Arrays.toString(todos) );
		
	    for (int i = 0; i < todos.length; i++) {
//			System.out.println(todos[i]); // 참조변수 값 그대로 출력하면 내부적으로 toString()이 호출됨
		}
		
		// 할 일 순서 번호(임의)로 하나의 Todo 조회
		Long todoNumber = 2L;
		for (Todo todo : todos) {
			if(todo.getId() == todoNumber) System.out.println(todo);
		}
		
	}

}
package com.todo.model;

import java.time.LocalDate;

public class Todo {
	
	private Long id; 
	private String title; 
	private String description; 
	private LocalDate dueDate; 
	private Boolean isCompleted; 

	
	public Todo(Long id, String title, LocalDate dueDate, String description) {
		this.id = id;
		this.title = title;
		this.description = description;
		this.dueDate = dueDate;
		this.isCompleted = false; // 기본값은 false
	}

	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public LocalDate getDueDate() {
		return dueDate;
	}

	public void setDueDate(LocalDate dueDate) {
		this.dueDate = dueDate;
	}

	public Boolean getIsCompleted() {
		return isCompleted;
	}

	public void setIsCompleted(Boolean isCompleted) {
		this.isCompleted = isCompleted;
	}

	@Override
	public String toString() {
		return "Todo [id=" + id + ", title=" + title + ", description=" + description + ", dueDate=" + dueDate
				+ ", isCompleted=" + isCompleted + "]";
	}
	
}