Collection_list
컬렉션이란?
자료구조 개념이 내장되어 있는 클래스로 자바에서 제공하는 "자료구조"를 담당하는 "프레임워크"이다.
- 자료구조 : 방대한 데이터를 보다 효율적으로 관리(조회,정렬,추가,수정,삭제) 할 수 있도록 도와주는 개념
- 프레임워크 : 이미 만들어져있는 틀(뼈대)
배열의 단점과 컬렉션의 장점
배열의 단점
1. 배열은 우선 크기를 지정해야된다!! 한번 지정된 크기를 변경할 수 없음 !!
새로운 값을 더 추가하고자 한다면 새로운 배열을 만들고, 기존꺼를 복사하는 코드를 직접 기술
2. 배열 중간에 위치해 추가한다거나, 삭제를 하는 경우 값을 매번 땡겨주는 복잡한 알고리즘을 직접 기술해야한다.
3. 한 공간에 한 타입의 데이터들만 저장 가능하다.
컬렉션의 장점
1. 크기를 지정해 줄 필요없음!! 만일 지정을 했다고 하더라도 , 더 많은 데이터 들이 들어오면 알아서 사이즈를 늘려준다.
크기의 제약이 없음
2. 중간에 값을 추가한다거나 , 삭제하는 경우 값을 땡겨주는 작업 (알고리즘)을 직접 기술할 필요 없음!!
단지 메소드 호출 만으로 알아서 내부적으로 진행될 거임
3. 한 공간에 여러타입의 데이터를 저장 가능!!
방대한 데이터들을 단지 보관만 해두고 조회만 할 경우 배열을 많이 사용한다.
방대한 데이터들을 보관도 하고 추가도 하고 삭제도 하는등등.. 이런과정들이 빈번할 경우 컬렉션을 많이 사용한다.
part01_basic
public calss Music {
package com.kh.chap01_list.part01_basic.model.vo;
public class Music {
private String title;
private String artist;
public Music() {}
public Music(String title, String artist) {
super();
this.title = title;
this.artist = artist;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
@Override
public String toString() {
return "Music [title=" + title + ", artist=" + artist + "]";
}
}
public class ListRun {
// 별도로 제네릭 설정을 하지 않으면 <Object>로 설정됨!
ArrayList/*<Object>*/ list = new ArrayList(3); // 크기 지정을 할 수도 있고 안할 수도 있음 안하면 기본 크기가 10으로 지정됨!
System.out.println(list); // 안에 아무것도 없음 (비어있는 상태임)
// E-> Element : 리스트에 담길 데이터들 (요소)
// 1. add(E e) : 리스트 공간 끝에 전달된 데이터를 추가시켜 주는 메소드
list.add(new Music("Attention","뉴진스"));
list.add(new Music("새삥","지코"));
list.add(new Music("죽일놈","다이나믹듀오"));
list.add("하이루");
// 지정된 크기보다 더 많이 넣어도 오류가 나지 않는다. => 장점1 : 크기의 제약이 없다.
// 다양한 타입의 데이터를 담을 수 있음 => 장점3 : 여러타입 보관 가능
System.out.println(list); // list 특징 : 순서 융지하면서 담김 (0번 인덱스부터 차곡차곡)
// 2. add (int index, E e) : 직접 인덱스를 지정해서 해당 인덱스 위치에 데이터를 추가시켜주는 메소드 이다.
list.add(1, new Music("진심이 담긴 노래", "케이시"));
// 중간 위치에 데이터 추가시 복잡한 알고리즘 직접 구현 안함 => 장점2
System.out.println(list);
// 3. remove(int index) : 해당 인덱스위치의 데이터를 삭제시켜주는 메소드
list.remove(1);
System.out.println(list);
// 4. set(int index, E e) : 해당인덱스 위치에 데이터를 새로이 전달된 e로 수정시켜주는 메소드
list set(0, new Music("nextLevel" , "에스파"));
System.out.println(list);
// 5. size() : 해당 리스트의 사이즈를 반환시켜주는 메소드 (즉, 몇개의 데이터가 담겨있는지)
System.out.println("리스트의 사이즈 : " + list.size()); // 배열과 비교해보자면 lenghth와 같은 느낌이다!
// 6. get(int index) : 해당 인덱스 위치의 객체를 반환시켜주는 메소드
Music m = (Music)list.get(0);
String s = (String)list.get(3);
System.out.println(m);
System.out.println(s);
System.out.println(list.get(1));
System.out.println(((Music)list.get(1)).getTitle()); // Object 타입이기 때문에 강제 형변환을 해줘야 한다.
// 7. subList(int index1, int index2) : List => 추출해서 나온 List 반환 : Substring 비슷
List sub = list.subList(0,2); // 0 <= <2
System.out.println(sub);
// 8. addAll(Collection c) : 컬렉션을 통째로 뒤에 추가시켜주는 메소드
list.addAll(sub);
System.out.println(list);
// 9. isEmpty() : boolean => 컬렉션이 비어있는지 묻는 메소드
System.out.println(list.isEmpty());
// 10. clear() : 리스트 안에 있는 내용을 싹 비워주는 메소드
// list.clear();
System.out.println(list);
System.out.println(list.isEmpty());
// 반복문을 통해 순차적으로 출력
System.out.println("=========")
// 1) for loop문
for( int i=0 ; i < list.size(); i++ ){
System.out.println(list.get(i));
}
System.out.pirntln("==========")
// 2) 향상된 for문
for(Object o : list) { // o = list.get(0) => list.get(1)
System.out.println(o);
}
}
}
public class GenericListRun {
package com.kh.chap01_list.part01_basic.run;
import java.util.ArrayList;
import java.util.List;
import com.kh.chap01_list.part01_basic.model.vo.Music;
public class GenericListRun {
public static void main(String[] args) {
// <Music> 으로 제네릭 설정!! => E == Music
ArrayList<Music> list = new ArrayList<Music>();
list.add(new Music("Attention", "뉴진스"));
list.add(new Music("새삥","지코"));
//list.add("하이룽"); 다른 타입 담기 불가
System.out.println(list);
list.add(1, new Music("진심이담긴노래", "케이시"));
System.out.println(list);
List<Music> sub = list.subList(0, 2); // 원본 리스트에 영향을 주지 않는다.
System.out.println(sub);
list.addAll(sub); // 원본 리스트에 영향을 줌
System.out.println(list);
Music m = list.get(0);
System.out.println(m);
System.out.println(list.get(1).getTitle());
for(Music o : list) {
System.out.println(o);
}
/*
* 제네릭<>을 사용하는 이유
* 1. 명시된 타입의 객체만 저장할 수 있도록 제한을 둘 수 있음
* 2. 컬렉션에 저장된 객체를 꺼내서 사용할 때 매번 형변환 하는 절차를 없애기 위해서
*
*/
}
}
public void ListSortRun {
package com.kh.chap01_list.part01_basic.run;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class ListSortRun {
public static void main(String[] args) {
// ArrayList 생성
ArrayList<String> list = new ArrayList<>();
{ // 초기화 블럭
list.add("C");
list.add("A");
list.add("B");
list.add("a");
}
System.out.println("원본 : " + list);
// 오름차순 정렬
// Collections.sort(list);
list.sort(Comparator.naturalOrder());
System.out.println("오름차순 : " + list);
// 내림차순 정렬
// Collections.sort(list, Comparator.reverseOrder())
list.sort(Comparator.reverseOrder());
System.out.println("내림차순 : " + list);
// 대소문자 구분 없이 오름차순
// Collections.sort(String.CASE_INSENSTIVE_ORDER)
list.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println("대소문자 구분없이 오름차순 : " + list);
// 대소문자 구분없이 내림차순
// Collections.sort(Collections.reverseOrder(String.CASE_INSENSTIVE_ORDER))
list.sort(Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
System.out.println(list);
}
}
// 웹페이지 관리자 정렬할때 많이씀
part02_mvc
public class Music {
package com.kh.chap01_list.part02_mvc.model.vo;
public class Music {
private String title;
private String artist;
public Music() {}
public Music(String title, String artist) {
super();
this.title = title;
this.artist = artist;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
@Override
public String toString() {
return "Music [title=" + title + ", artist=" + artist + "]";
}
}
public class MusicMenu {
package com.kh.chap01_list.part02_mvc.view;
// 화면을 담당하는 클래스 (출력문, 입력문)
import java.util.ArrayList;
import java.util.Scanner;
import com.kh.chap01_list.part02_mvc.controller.MusicController;
import com.kh.chap01_list.part02_mvc.model.vo.Music;
public class MusicMenu {
// 필드부 (무조건 캡슐화 원칙에 의거 private로 작성해야함)
// 스캐너 선언
private Scanner sc = new Scanner(System.in);
private MusicController mc = new MusicController();
// 생성자부 => 생략 (JVM이 만들어줌!!)
// 메소드부
public void mainMenu() {
while(true) {
System.out.println("\n===========★ Welcome 별밤 ★================");
System.out.println("1. 새로운 곡 추가");
System.out.println("2. 곡 전체 조회");
System.out.println("3. 특정곡 삭제");
System.out.println("4. 특정곡 검색");
System.out.println("5. 특정곡 수정");
System.out.println("0. 프로그램 종료");
System.out.print(">> 메뉴 선택 : ");
int menu = sc.nextInt();
sc.nextLine();
switch(menu) {
case 1:
insertMusic();
// 새로운곡 추가하는 서브 메뉴 보여주기
break;
case 2:
selectMusic();
// 곡 전체 조회해주는 메뉴 보여주기
break;
case 3:
deleteMusic();
// 특정곡을 삭제해주는 메뉴 보여주기
break;
case 4:
searchMusic();
// 곡을 검색해주는 메뉴 보여주기
break;
case 5:
updateMusic();
// 곡을 수정해주는 메뉴 보여주기
break;
case 0:
System.out.println("프로그램을 종료합니다. 이용해주셔서 감사합니다.");
return;
default :
System.out.println("메뉴를 잘못 선택했습니다. 다시 선택해주세요.");
// break;
}
}
}
// alt + shift + j // 메소드 주석
/**
* 1. 새로운 곡을 추가하는 서브화면
*/
public void insertMusic() {
System.out.println("\n========새로운 곡 추가=========");
System.out.print("제목 입력 : ");
String title = sc.nextLine();
System.out.print("가수 입력 : ");
String artist = sc.nextLine();
// 곡 추가 요청 보내기!! (사용자가 입력한 곡명, 가수명 같이 넘기면서 !!!)
// 즉 Controller 메소드 호출
mc.insertMusic(title,artist);
}
/**
* 2. 전체 곡 조회용 서브화면
*/
public void selectMusic() {
System.out.println("\n==========전체 곡 리스트===========");
// 전체곡 조회 요청! (ControlMusic소드 호출)
ArrayList<Music> list = mc.selectMusic();
/* 리스트가 비어있을 때는 이 for문 안돈다.
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
*/
if(list.isEmpty()) { // 리스트가 비어있을 경우
System.out.println("현재 존재하는 곡이 없습니다.");
}else { // 그게 아닐 경우(즉, 뭐라도 담겨있을 경우)
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
}
}
/**
* 3. 특정 곡을 삭제하는 메소드
*
*/
public void deleteMusic() {
System.out.println("\n===========특정 곡 삭제============");
System.out.print("삭제하고자 하는 곡 명 : ");
String title = sc.nextLine();
int result = mc.deleteMusic(title); // 0, 1
if(result == 1) {
System.out.println("성공적으로 삭제 됐습니다.");
}else {
System.out.println("삭제할 곡을 찾지 못했습니다.");
}
}
/**
* 4. 특정 곡 검색해주는 서브화면
*/
public void searchMusic() {
System.out.println("\n======== 특정 곡 검색 ===========");
// 1. 간단버전
/*
System.out.print("검색할 곡 명(키워드만도 가능) : ");
String keyword = sc.nextLine();
ArrayList<Music> searchList = mc.searchMusic(keyword);
*/
// 2. 심화버전
System.out.println("1) 제목으로 검색");
System.out.println("2) 가수명으로 검색");
System.out.print(">> 메뉴선택 : ");
int menu = sc.nextInt();
sc.nextLine();
System.out.print("검색 키워드 : ");
String keyword = sc.nextLine();
ArrayList<Music> searchList = mc.searchMusic(menu,keyword);
System.out.println("\n==========검색결과============");
if(searchList.isEmpty()) { // 텅 비어있을 경우 => 검색결과 없음
System.out.println("검색된 결과가 없습니다.");
}else { // 그게 아닐 경우 => 검색된게 담겨 있음
for(int i=0; i<searchList.size(); i++) {
System.out.println(searchList.get(i));
}
}
}
/**
* 5. 특정곡 수정해주는 서브화면
*/
public void updateMusic() {
System.out.println("\n=======특정 곡 수정==========");
System.out.print("수정하고자 하는 곡 명 : ");
String title = sc.nextLine();
System.out.print("수정 내용(가수) : ");
String upArtist = sc.nextLine();
System.out.print("수정 내용(곡명) : ");
String upTitle = sc.nextLine();
int result = mc.updateMusic(title,upArtist,upTitle);
if(result > 0) {
System.out.println("성공적으로 수정 되었습니다.");
}else {
System.out.println("수정할 곡을 찾지 못했습니다.");
}
}
}
public class MusicController {
package com.kh.chap01_list.part02_mvc.controller;
// 사용자의 요청 처리해주는 클래스 !! 출력문, 입력문 쓰지말자 !!
import java.util.ArrayList;
import com.kh.chap01_list.part02_mvc.model.vo.Music;
import com.kh.chap01_list.part02_mvc.view.MusicMenu;
public class MusicController {
//필드부
private ArrayList<Music> list = new ArrayList<>();
{ // 초기화 블럭
list.add(new Music("Attention","뉴진스"));
list.add(new Music("새삥","지코"));
list.add(new Music("새삥말고헌삥", "데이식스"));
}
// 메소드부
/**
* 1. 새로운 곡 추가하는 메소드
* @param title
* @param artist
*/
public void insertMusic(String title,String artist) {
list.add(new Music(title, artist));
}
/**
* 2. 전체곡 조회 메소드
* @return
*/
public ArrayList<Music> selectMusic() {
return list;
}
/**
* 3. 특정곡 삭제 메소드
* @param title
* @return
*/
public int deleteMusic(String title) {
int result = 0;
for(int i=0; i<list.size(); i++) {
if(list.get(i).getTitle().equals(title)) {
list.remove(i);
result = 1;
break; // 반복문 빠져나오기
}
}
// result == 0 (삭제할 곡을 못찾음) | 1(성공적으로 삭제 된거임!)
return result;
}
/**
* 4. 특정곡 검색 기능 메소드(키워드 검색)
* @param keyword
* @return
*/
public ArrayList<Music> searchMusic(String keyword) {
ArrayList<Music> searchList = new ArrayList<Music>(); // []
for(int i=0; i<list.size(); i++) {
if(list.get(i).getTitle().contains(keyword)) {
searchList.add(list.get(i));
}
}
// searchList => 텅비어있을 수 있음 | 검색된 Music 객체들이 담겨있을 수도 있음!
return searchList;
}
// 2. 심화버전
public ArrayList<Music> searchMusic(int menu, String keyword) {
ArrayList<Music> searchList = new ArrayList<Music>();
if(menu == 1) { // 곡명으로 검색
for(int i=0; i<list.size(); i++) {
if(list.get(i).getTitle().contains(keyword)) {
searchList.add(list.get(i));
}
}
} else { // 가수명으로 검색
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getArtist().contains(keyword)) {
searchList.add(list.get(i));
}
}
}
return searchList;
}
/**
* 5. 특정곡 수정 메소드
* @param title
* @param upArtist
* @param upTitle
* @return
*/
public int updateMusic(String title, String upArtist, String upTitle) {
int result = 0;
for(int i=0; i<list.size(); i++) {
Music m = list.get(i);
if(m.getTitle().equals(title)) {
m.setArtist(upArtist);
m.setTitle(upTitle);
result = 1;
break;
}
}
return result;
// result == 0 (수정할 곡을 못 찾은 경우) | 1(성공적으로 수정됨)
}
}
public class MVCRun {
package com.kh.chap01_list.part02_mvc.run;
import com.kh.chap01_list.part02_mvc.view.MusicMenu;
public class MVCRun {
public static void main(String[] args) {
/*
* MVC 패턴 : 각 클래스마다 역할(데이터, 화면, 요청처리)을 부여해서 작업
* => 유지보수에 용이!
*
* - M(Model) : 데이터를 담당하는 역할(데이터를 담기위한 클래스, 비즈니스 로직 처리하기 위한클래스, 데이터가 보관되어있는 보관함과 연결해서 입출력)
* - V(View) : 화면을 담당하는 역할 / 즉, 사용자에게 보여지는 시각적인 요소들 (Print(출력문),Scanner(입력문))
* - C(controller) : 사용자가 요청한 내용을 처리한 후 그 결과를 돌려주는 역할( 출력문,입력문 절때 !!안쓸거임!!)
*/
MusicMenu mm = new MusicMenu();
mm.mainMenu();
}
}