ArrayList 이용한 데이터 관리 프로그램 직접 작성하기 ✅✅✅
String title, String artist 두 가지로 제작된 샘플은 주어졌지만, 직접 제작해보는 과제는 처음이었다.
최초 구상 따라 자막별 검색, 화질별 검색을 꼭 넣고 싶어서... String[] sub, int[] quality처럼 배열로 선언한 터라 참고할 예제도 없이 썼다 지웠다 반복하며 고민을 계속했다. 그러다 결국 찾은 방안은 생성된 전체 목록을 토대로 → 타입은 CreatorDTO로 둔 채로 반복문 for문에 넣어 → Arrays.toString() + contains(value) 조건을 달고 DTO 타입의 값으로 반환 받기였다. 물론 체계적으로 접근하진 못했고, 붙잡고 있으며 이 방법 저 방법 시도해보다 운이 좋아 성공한 것 같기도 하다... 언젠간 이런 구조를 안정적으로 활용하는 날이 오길 바란다!
RUN
Application.class
package com.reminder.collection_practice.videocreator.run;
import com.reminder.collection_practice.videocreator.view.CreatorMenu;
public class Application {
public static void main(String[] args) {
CreatorMenu creatorMenu = new CreatorMenu();
creatorMenu.mainMenu();
}
}
❗ MVC 패턴
디자인 패턴 중 하나로 MVC는 Model, View, Controller를 뜻한다.
- Model : data, 정보의 가공을 책임지는 파트
- View : 사용자 인터페이스, 데이터 입출력 파트
- Controller : 데이터와 사용자 인터페이스를 잇는 다리 역할
이러한 MVC 디자인 패턴을 사용하여 용도에 따른 구분을 두면 유지보수성, 확장성, 유연성이 증가한다.
Model - comparator
AscLength.class
package com.reminder.collection_practice.videocreator.model.comparator;
import java.util.Comparator;
import com.reminder.collection_practice.videocreator.model.dto.CreatorDTO;
public class AscLength implements Comparator<CreatorDTO> {
@Override
public int compare(CreatorDTO o1, CreatorDTO o2) {
return o1.getLength() - o2.getLength();
}
}
DescLength.class
package com.reminder.collection_practice.videocreator.model.comparator;
import java.util.Comparator;
import com.reminder.collection_practice.videocreator.model.dto.CreatorDTO;
public class DescLength implements Comparator<CreatorDTO> {
@Override
public int compare(CreatorDTO o1, CreatorDTO o2) {
return o2.getLength() - o1.getLength();
}
}
DescTitle.class
package com.reminder.collection_practice.videocreator.model.comparator;
import java.util.Comparator;
import com.reminder.collection_practice.videocreator.model.dto.CreatorDTO;
public class DescTitle implements Comparator<CreatorDTO> {
@Override
public int compare(CreatorDTO o1, CreatorDTO o2) {
return -o1.getTitle().compareTo(o2.getTitle());
}
}
Model - dto
CreatorDTO.class
package com.reminder.collection_practice.videocreator.model.dto;
import java.util.Arrays;
public class CreatorDTO {
/* 제목, 화질, 길이, 자막 종류 */
private String title;
private int length;
private int[] quality;
private String[] sub;
public CreatorDTO() {}
public CreatorDTO(String title, int length, int[] quality, String[] sub) {
super();
this.title = title;
this.length = length;
this.quality = quality;
this.sub = sub;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int[] getQuality() {
return quality;
}
public void setQuality(int[] quality) {
this.quality = quality;
}
public String[] getSub() {
return sub;
}
public void setSub(String[] sub) {
this.sub = sub;
}
@Override
public String toString() {
return "CreatorDTO [title=" + title + ", length=" + (length / 60) + "분 " + (length % 60) + "초" + ", quality=" + Arrays.toString(quality) + ", sub="
+ Arrays.toString(sub) + "]";
}
}
View
CreatorMenu.class
package com.reminder.collection_practice.videocreator.view;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import com.reminder.collection_practice.videocreator.controller.CreatorController;
import com.reminder.collection_practice.videocreator.model.comparator.AscLength;
import com.reminder.collection_practice.videocreator.model.comparator.DescLength;
import com.reminder.collection_practice.videocreator.model.comparator.DescTitle;
import com.reminder.collection_practice.videocreator.model.dto.CreatorDTO;
public class CreatorMenu {
private CreatorController creatorController = new CreatorController();
Scanner scan = new Scanner(System.in);
public void mainMenu() {
mainMenu :
while(true) {
System.out.println("============ 메뉴 ============");
System.out.println("1. 영상 추가");
System.out.println("2. 영상 목록 전체 조회");
System.out.println("3. 정렬하여 조회"); //제목, 길이 오름차순 내림차순
System.out.println("4. 제목 검색");
System.out.println("5. 자막별 검색");
System.out.println("6. 화질별 검색");
System.out.println("7. 영상 정보 수정");
System.out.println("8. 영상 삭제");
System.out.println("0. 프로그램 종료");
System.out.print("메뉴 선택 : ");
int menu = scan.nextInt();
scan.nextLine();
switch(menu) {
case 1 : addList(); break;
case 2 : selectList(); break;
case 3 : sortMenu(); break;
case 4 : searchTitle(); break;
case 5 : searchSub(); break;
case 6 : searchQlty(); break;
case 7 : updateVid(); break;
case 8 : removeVid(); break;
case 0 : System.out.println("프로그램을 종료합니다."); break mainMenu;
default : System.out.println("잘못 선택하셨습니다. 번호를 다시 입력해 주세요."); break;
}
}
}
public void addList() {
System.out.println("======== 영상 추가 ========");
/* A. 제목 */
System.out.print("제목 입력 : ");
String title = scan.nextLine();
/* B. 길이
* 초 단위로 입력 받고 x분 y초로 출력 */
System.out.print("길이 입력(초) : ");
int length = scan.nextInt();
/* C. 화질
* 사용자가 화질 개수와 종류 선택
* 최대 4가지 화질 제공 */
System.out.println("# 화질 구분(2160, 1080, 720, 480)");
System.out.print("화질 개수 : ");
int qltyCount = scan.nextInt();
int[] quality = new int[qltyCount];
for(int i=0; i < qltyCount; i++) {
System.out.print((i + 1) + "번째 화질 입력 : ");
quality[i] = scan.nextInt();
}
/* D. 자막
* 사용자가 자막 개수와 종류 선택
* 최대 4가지 자막 제공 */
System.out.println("# 자막 구분(KOR, ENG, IDN, SPN)");
System.out.print("자막 개수 : ");
int subCount = scan.nextInt();
String[] sub = new String[subCount];
for(int i=0; i < subCount; i++) {
System.out.print((i+1) + "번째 자막 입력 : ");
sub[i] = scan.next();
}
creatorController.addList(new CreatorDTO(title, length, quality, sub));
}
public void selectList() {
System.out.println("======== 영상 목록 전체 조회 ========");
List<CreatorDTO> vidList = creatorController.selectList();
if(!vidList.isEmpty()) {
for(CreatorDTO vid : vidList) {
System.out.println(vid);
}
} else {
System.out.println("목록이 존재하지 않습니다.");
}
}
public void sortMenu() {
System.out.println("======== 정렬 메뉴 ========");
System.out.println("A. 제목 오름차순 정렬");
System.out.println("B. 제목 내림차순 정렬");
System.out.println("C. 길이 오름차순 정렬");
System.out.println("D. 길이 내림차순 정렬");
System.out.print("메뉴 선택 : ");
char menu = scan.next().charAt(0);
ascDesc(menu);
}
public void ascDesc(char menu) {
System.out.println("======== 정렬하여 조회 ========");
List<CreatorDTO> vidList = creatorController.selectList();
/* 사본에 정렬 반영 */
List<CreatorDTO> sortList = new ArrayList<>();
sortList.addAll(vidList);
if(menu == 'A') {
/* 익명클래스 사용 */
sortList.sort(new Comparator<CreatorDTO>() {
@Override
public int compare(CreatorDTO o1, CreatorDTO o2) {
return o1.getTitle().compareTo(o2.getTitle());
}
});
} else if(menu == 'B') {
/* Comparator 상속 클래스 사용 */
sortList.sort(new DescTitle());
} else if(menu == 'C') {
sortList.sort(new AscLength());
} else {
sortList.sort(new DescLength());
}
for(int i=0; i < sortList.size(); i++) {
System.out.println(sortList.get(i));
}
}
public void searchTitle() {
System.out.println("======== 제목 검색 ========");
System.out.print("제목 입력 : ");
String title = scan.nextLine();
List<CreatorDTO> searchList = creatorController.searchTitle(title);
if(!searchList.isEmpty()) {
for(int i=0; i < searchList.size(); i++) {
System.out.println(searchList.get(i));
}
} else {
System.out.println("검색 결과가 없습니다.");
}
}
public void searchSub() {
System.out.println("======== 자막 검색 ========");
System.out.println("# 자막 구분(KOR, ENG, IDN, SPN)");
System.out.print("자막 입력(택 1) : ");
String sub = scan.nextLine();
List<CreatorDTO> vidList = creatorController.selectList();
for(CreatorDTO vid : vidList) {
if(!vidList.isEmpty()) {
if(Arrays.toString(vid.getSub()).contains(sub)) {
System.out.println(vid);
} else {
System.out.println("검색 결과가 없습니다.");
}
}
}
}
public void searchQlty() {
System.out.println("======== 화질 검색 ========");
System.out.println("# 화질 구분(2160, 1080, 720, 480)");
System.out.print("화질 입력(택 1) : ");
String quality = scan.nextLine();
List<CreatorDTO> vidList = creatorController.selectList();
for(CreatorDTO vid : vidList) {
if(!vidList.isEmpty()) {
if(Arrays.toString(vid.getQuality()).contains(quality)) {
System.out.println(vid);
} else {
System.out.println("검색 결과가 없습니다.");
}
}
}
}
public void updateVid() {
System.out.println("======== 영상 정보 수정 ========");
System.out.print("기존 영상 제목 검색 : ");
String title = scan.nextLine();
System.out.print("수정할 영상 제목 : ");
String updateTitle = scan.nextLine();
System.out.print("수정할 길이 입력(초) : ");
int updateLength = scan.nextInt();
System.out.println("# 화질 구분(2160, 1080, 720, 480)");
System.out.print("수정할 화질 개수 : ");
int qltyCount = scan.nextInt();
int[] updateQuality = new int[qltyCount];
for(int i=0; i < qltyCount; i++) {
System.out.print((i + 1) + "번째 화질 입력 : ");
updateQuality[i] = scan.nextInt();
}
System.out.println("# 자막 구분(KOR, ENG, IDN, SPN)");
System.out.print("수정할 자막 개수 : ");
int subCount = scan.nextInt();
String[] updateSub = new String[subCount];
for(int i=0; i < subCount; i++) {
System.out.print((i+1) + "번째 자막 입력 : ");
updateSub[i] = scan.next();
}
CreatorDTO updateVid = new CreatorDTO(updateTitle, updateLength, updateQuality, updateSub);
int result = creatorController.updateVid(title, updateVid);
}
public void removeVid() {
System.out.println("======== 영상 삭제 ========");
System.out.print("삭제할 영상 제목 : ");
int result = creatorController.removeVid(scan.nextLine());
if(result > 0) {
System.out.println("성공적으로 삭제되었습니다.");
} else {
System.out.println("삭제할 영상을 찾지 못했습니다.");
}
}
}
Controllor
CreatorController.class
package com.reminder.collection_practice.videocreator.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.reminder.collection_practice.videocreator.model.dto.CreatorDTO;
public class CreatorController {
/* 업로드 영상 리스트 저장 */
private List<CreatorDTO> vidList = new ArrayList<>();
/* 영상 추가 */
public void addList(CreatorDTO vid) {
vidList.add(vid);
}
/* 영상 목록 전체 조회 */
public List<CreatorDTO> selectList() {
return vidList;
}
/* 제목 검색 - String contains */
public List<CreatorDTO> searchTitle(String title) {
/* 검색 키워드가 포함된 영상들만 리턴 받기 위한 메소드 */
List<CreatorDTO> searchList = new ArrayList<>();
for(CreatorDTO vid : vidList) {
if(vid.getTitle().contains(title)) {
searchList.add(vid);
}
}
return searchList;
}
/* 영상 수정 - title 기준으로 조회 */
public int updateVid(String title, CreatorDTO updateVid) {
CreatorDTO old = null;
for(int i=0; i < vidList.size(); i++) {
if(vidList.get(i).getTitle().equals(title)) {
old = vidList.set(i, updateVid);
}
}
return old != null ? 1 : 0;
}
/* 영상 삭제 */
public int removeVid(String title) {
CreatorDTO old = null;
for(int i=0; i < vidList.size(); i++) {
if(vidList.get(i).getTitle().equals(title)) {
old = vidList.remove(i);
}
}
return old != null ? 1 : 0;
}
}
============ 메뉴 ============
1. 영상 추가
2. 영상 목록 전체 조회
3. 정렬하여 조회
4. 제목 검색
5. 자막별 검색
6. 화질별 검색
7. 영상 정보 수정
8. 영상 삭제
0. 프로그램 종료
메뉴 선택 : 7
======== 영상 정보 수정 ========
기존 영상 제목 검색 : 고양이 좋아
수정할 영상 제목 : 고양이 최고
수정할 길이 입력(초) : 100
# 화질 구분(2160, 1080, 720, 480)
수정할 화질 개수 : 3
1번째 화질 입력 : 1080
2번째 화질 입력 : 720
3번째 화질 입력 : 480
# 자막 구분(KOR, ENG, IDN, SPN)
수정할 자막 개수 : 4
1번째 자막 입력 : KOR
2번째 자막 입력 : ENG
3번째 자막 입력 : IDN
4번째 자막 입력 : SPN
============ 메뉴 ============
1. 영상 추가
2. 영상 목록 전체 조회
3. 정렬하여 조회
4. 제목 검색
5. 자막별 검색
6. 화질별 검색
7. 영상 정보 수정
8. 영상 삭제
0. 프로그램 종료
메뉴 선택 : 8
======== 영상 삭제 ========
삭제할 영상 제목 : 강아지 좋아
성공적으로 삭제되었습니다.
============ 메뉴 ============
1. 영상 추가
2. 영상 목록 전체 조회
3. 정렬하여 조회
4. 제목 검색
5. 자막별 검색
6. 화질별 검색
7. 영상 정보 수정
8. 영상 삭제
0. 프로그램 종료
메뉴 선택 : 2
======== 영상 목록 전체 조회 ========
CreatorDTO [title=고양이 최고, length=1분 40초, quality=[1080, 720, 480], sub=[KOR, ENG, IDN, SPN]]
============ 메뉴 ============
1. 영상 추가
2. 영상 목록 전체 조회
3. 정렬하여 조회
4. 제목 검색
5. 자막별 검색
6. 화질별 검색
7. 영상 정보 수정
8. 영상 삭제
0. 프로그램 종료
메뉴 선택 : 0
프로그램을 종료합니다.
'Java' 카테고리의 다른 글
[JAVA] 14-1. 입출력 | 스트림 | InputStream-OutputStream | Reader-Writer (0) | 2022.01.12 |
---|---|
[JAVA] 13-2. 예외처리 | finally | try-with-resource | 오버라이딩 (0) | 2022.01.12 |
[JAVA] 13-1. 예외처리 | throws | try-catch | 사용자 정의 예외클래스 (0) | 2022.01.11 |
[JAVA] 12-2. 컬렉션 | Map | HashMap | Properties (0) | 2022.01.11 |
[자바의 정석] Ch 11. 컬렉션 프레임워크 강의 메모 (0) | 2022.01.11 |