오늘은 객체지향 과정에서 메모장에 정리해둔 파일을 객체지향으로 가지고 오는 과정에 대해 공부했다
우선 메모장에
1, 우레 옥, 37.111,127.111
2, 수정식당, 42.111,120.333
3, 목골 식당, 442.111,123.333
4, 짜라, 424.312,123.342
5, 햄버거, 424.123,123.234
맛집 관련 데이터를 만들기위해 식당 이름 좌표 번호 등을 메모장에 정리했다
이때 텍스트들을 ","로 구분하며 띄어쓰기는 하면 안 된다 (나중에 오류를 불러올 수 있다고 한다 )
이렇게 만든 텍스트 파일을 c드라이브에 zzz라는 폴더 안에 저장했다
자 이제 객체지향아 덤벼라 !!!!
이 프로젝트의 목적은 맛집리스트를 사용자에게 보여주고 사용자는 그 맛집의 리뷰를 작성하는 프로그램을 만드려고 한다
오늘은 그 첫번째 과정으로 우선 맛집 리스트를 사용자에게 보여주려고 한다
그림으로 보면 엄청 심플하지만 맛집 파일을 객체로 불러오는 과정은 상당히 어렵고 복잡했다......
가장 처음으로 StoreDTO라는 Class를 만들었다 여기서 DTO란??
DTO(Data Transfer Object): 데이터를 매핑하기 위한 데이터 객체를 말한다 DTO는 보통 로직을 가지고 있지 않고
data와 그 data에 접근을 위한 getter , setter 만 가지고 있다 즉 DTO는 Database에서 Data를 얻어 Sevice나 Controller 등으로 보낼 때 사용하는 객체를 말한다
@ToString
@AllArgsConstructor
public class StoreDTO {
int sno;
String name;
double lat;
double lng;
}
이렇게 StoreDTO를 정리했다
sno = 맛집의 넘버
name = 맛집 이름
lat , lng = 좌표
⭐lombok를 사용해서 tostrig getter , setter를 쉽게 세팅했습니다
이제 가장 중요한 맛집 리스트를 위해 StoreLoader 이란 Class를 만들어 주었습니다
public class StoreLoader {
//맛집 데이터 인스턴스 변수 잡기
private StoreDTO[] stores;
}
변수 배열을 가장 먼저 선언해서 잡아주었습니다 이 값은 다른 곳에서 함부로 수정하면 안 되기에 private로 설정해주었습니다
public StoreLoader(){
stores= new StoreDTO[5];
File storeFile = new File("c:\\zzz\\store.txt");
Scanner scanner =new Scanner(storeFile);
}
이렇게 파일을 풀러 주기 위해 File를 사용해서 파일의 경로를 불러와주었습니다
여기서 Scanner는 storefile를 불러오는 역할을 합니다
Scanner scanner = new Scanner(System.in);
기존 자주 사용했던 Scanner 코드의 System.in 은 시스템에 연결해주다~라는 뜻인것 처럼
Scanner scanner =new Scanner(storeFile);
은 storFile를 연결해주다~ 라는 뜻으로 사용되고 있는 거죠!!!
하지만 이렇게 코드를 작성했을 때 아마 오류가 나실 겁니다!! 그 오류를 해결하려 해 보면 우리가 처음 마주하는
예외 발생 이란 것을 마주하게 됩니다
예외 발생의 해결법 중 오늘 우리는 throws를 사용할 겁니다!!
throws란?
예외를 던지다~ 나 몰라라 한다~라는 뜻입니다 즉 예외가 생겼을 때 책임을 다른 객체에게 넘기겠다는 뜻이죠
public StoreLoader() throws FileNotFoundException {
stores= new StoreDTO[5];
File storeFile = new File("c:\\zzz\\store.txt");
Scanner scanner =new Scanner(storeFile);
throws를 사용해서 코드를 수정시켜주었습니다 이러니 에러가 사라졌어요!!
자 이제 파일을 불러오는 데는 성공했습니다 이제 파일 안에 내용물들은 전부 들고 오기 위해 내용을 돌려봐야겠죠?
돌리다... 돌리다... 루프!!!! 그래요 for문을 사용해서 파일 안에 내용을 전부 가지고 올 겁니다
내용물을 확인하면서 가지고 오는 for문
for(int i =0; i< stores.length; i++){
//메모장 내용의 줄(라인)으로 가져온다
String line= scanner.nextLine();
// 가져오는 기준은 , 를 기준으로 가져온다
String [] arr= line.split(",");
// 내용들의 값을 지정
int sno = Integer.parseInt(arr[0]);
String name= arr[1];
double lat = Double.parseDouble(arr[2]);
double lng = Double.parseDouble(arr[3]);
//지정한 값들을 StoreDTO에 적용시키기
StoreDTO dto = new StoreDTO(sno,name, lat, lng);
//stores[] 에 dto 담기
stores[i] = dto;
}
for문으로 내용물들을 불러왔고 그 내용물의 값들을 지정해서 처음 만들었던 stores [ ]에 넣어주었습니다
우리는 처음에 stores를 private로 설정해 두었습니다 그래서 이아이는 다른 객체에서 사용할 수가 없어요 그래서
private StoreDTO[] stores;
이렇게 다른 객체에서 불러올 수 있게 메소드를 새로 만들었습니다 이제 Main에서 불러올수있게 되었습니다
public StoreDTO[] getStores() {
return this.stores;
}
StoreLoader 완성
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class StoreLoader {
//맛집 데이터 인스턴스 변수 잡기
private StoreDTO[] stores;
public StoreLoader() throws FileNotFoundException {
stores= new StoreDTO[5];
//메모장에 있는 파일 가지고오기
File storeFile = new File("c:\\zzz\\store.txt");
Scanner scanner =new Scanner(storeFile);
for(int i =0; i<stores.length;i++){
//메모장 내용의 줄(라인)으로 가져온다
String line = scanner.nextLine();
//가져오는 기준은 , 를 기준으로 가져온다
String[] arr = line.split(",");
// 내용물의 값을 지정
int sno = Integer.parseInt(arr[0]);
String name = arr[1];
double lat = Double.parseDouble(arr[2]);
double lng = Double.parseDouble(arr[3]);
//지정한 값들을 StoreDTO에 적용시키기
StoreDTO dto = new StoreDTO(sno,name,lat,lng);
//stores[]에 dot담기
stores[i]=dto;
}
}
//다른 객체에서 사용할수있게 만들어주기
public StoreDTO[] getStores() {
return this.stores;
}
}
Main
import java.io.FileNotFoundException;
public class Main {
public static void main(String[] args) throws FileNotFoundException {
StoreLoader storeLoader = new StoreLoader();
StoreDTO[] dtos= storeLoader.getStores();
for(StoreDTO dto:dtos){
System.out.println(dto);
}
}
}
Main에서는 만들어 두었던 것들을 불러와 주기만 하면 됩니다!!
하지만
StoreLoader storeLoader = new StoreLoader();
StoreDTO[] dtos= storeLoader.getStores();
이 두 가지는 직접적으로 데이터를 자지고 있는 것이 아니기 때문에 프린트를 해보면 저것들이 가리키는 주소 값만 나오게 됩니다 그래서
for(StoreDTO dto:dtos){
System.out.println(dto);
}
이렇게 새롭게 정의해서 for문을 돌려 모든 데이터를 확인하는 것이지요
자 이제 프린트를 해볼까요??
✨결과
StoreDTO(sno=1, name=우레 옥, lat=37.111, lng=127.111)
StoreDTO(sno=2, name=수정식당, lat=42.111, lng=120.333)
StoreDTO(sno=3, name=목골 식당, lat=442.111, lng=123.333)
StoreDTO(sno=4, name=짜라, lat=424.312, lng=123.342)
StoreDTO(sno=5, name=햄버거, lat=424.123, lng=123.234)
이렇게 오늘의 수업은 끝이 났습니다 강의 시간에 본 것을 돌려보며 만들었지만 사실 아직 완벽하게 이해한 것은 아닌 것 같아요 객체지향은 설계단계부터 잘해야 한다고 하는데 아직 설계도 로직 짜는 것도 서툴러서 복잡하고 어렵게만 느껴지는 것 같습니다 여러 번 더 만들어보면서 공부를 해보러 저는 이만 가보겠습니다!!!
'개발자 성장 일지' 카테고리의 다른 글
2022.03.12 반성 다짐 그리고 설계 (0) | 2022.03.12 |
---|---|
2022.03.10. 투표 서비스 < 유권자 패키지> (0) | 2022.03.11 |
2022.03.10 투표 서비스 <설계 그리고 후보자 패키지> (0) | 2022.03.10 |
2022.03.08 수업일지 (0) | 2022.03.08 |
돼지 저금통 만들기 (0) | 2022.03.07 |