JAVA

Collection_list

mi-ni 2023. 12. 14. 18:33

컬렉션이란?

자료구조 개념이 내장되어 있는 클래스로 자바에서 제공하는 "자료구조"를 담당하는 "프레임워크"이다.

- 자료구조 : 방대한 데이터를 보다 효율적으로 관리(조회,정렬,추가,수정,삭제) 할 수 있도록 도와주는 개념

- 프레임워크 : 이미 만들어져있는 틀(뼈대)

 

배열의 단점과 컬렉션의 장점

배열의 단점

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();
		
	}

}