기록

*23일차 실습 본문

학원/실습

*23일차 실습

pringspring 2022. 2. 24. 14:59

@실습문제
음악playlist를 관리하는 프로그램을 만들어 보세요.

# 1. vo클래스 작성
@com.collection.list.music.model.vo.Music.java
-title:String
-singer:String

getter/setter, 기본생성자/파라미터있는생성자, toString 오버라이드

# 2. 실행클래스(메인메소드 포함)
@com.collection.list.music.run.Run.java

# 3. 메뉴클래스
@com.collection.list.music.view.MusicMenu.java
* 다음메뉴를 반복적으로 출력하고, 사용자선택값에 따라 적절한 컨트롤클래스 MusicManager객체의 메소드를 호출할 것.
* 필요한 사용자 입력값(곡명/가수명/Music객체정보)은 MusicMenu클래스에서 작성후 Manager객체로 전달함.

-sc:Scanner
-manager:MusicManager

    ================ Music Playlist Menu ================
    1.목록보기
    2.마지막에 음악추가
    3.맨처음에 음악추가
    4.곡삭제
    5.곡변경
    6.곡명검색
    7.가수검색
    8.목록정렬(곡명오름차순)
    0.종료
    ================================================================
    >> 메뉴선택 : 

정렬 메뉴
-각 Comparator객체를 생성해 manager객체의 orderBy(Comparator)메소드 호출할 것.

    ================== 정렬 메뉴 ===================
1. 가수명 오름차순
2. 가수명 내림차순
3. 곡명 오름차순
4. 곡명 내림차순
5. 메인메뉴 돌아가기
================================================

a. 리스트 출력메소드
+ printList(List<Music>) : void

b. 곡명 입력메소드
+ inputTitle() : String

c. 가수 입력메소드
+ inputSinger() : String

d. 음악 입력메소드(곡명, 가수 모두 입력)
+ inputMusic() : Music






# 4. 컨트롤러 클래스 MusicManager
패키지 com.collection.list.music.controller
-musicList:ArrayList<Music> => 초기화블럭을 사용하여 5곡을 미리 만들어두기

구현할 메소드는 다음과 같다.
--------------------------------------------------------------------
1. 음악리스트 리턴
+ selectList():List<Music>

2. 마지막에 음악추가 : 사용자로부터 곡명과 가수를 입력받아 리스트에 저장하는 메소드. 
+ addList(Music) : void

3. 맨처음에 음악추가 : 리스트 최상위(0번지)에 음악을 추가하는 메소드
+ addAtZero(Music) : void

4. 특정곡을 삭제하는 메소드(제목을 전달받아 검색후, 최초로 검색된 음악을 삭제)
삭제여부를 리턴
+ removeMusic(String) : boolean

5. 특정곡을 바꾸는 메소드(이전 음악객체, 새 음악객체를 전달해서 교체)
교체 성공여부를 리턴
+ boolean replaceMusic(Music oldMusic, Music newMusic) : boolean

6. 특정곡이 있는지 검사하는 메소드 : 복수개의 결과가 나올수 있음. 
(곡명일부로 검색해서 해당곡이 있다면, 곡정보(제목/가수)를 출력하고, 없다면, "검색결과가 없습니다"출력)
+ searchMusicByTitle(String title) : List<Music>

7. 가수명으로 검색 메소드 : 복수개의 결과가 나올수 있음.
+ searchMusicBySinger(String singer) : List<Music>

8. 서브메뉴 - 각 정렬 메소드 : Comparable/Comparator 인터페이스를 적절히 활용할 것
+ orderBy(Comparator<Music> c) : List<Musice>

 


package com.collection.list.music.vo;
/**
 * 
 *VO클래스 
 *
 */



import java.util.Objects;

public class Music implements Comparable<Music>{
	private String title;
	private String singer;
	
	public Music() {}

	public Music(String title, String singer) {
		this.title = title;
		this.singer = singer;
	}

	public String getTitle() {
		return title;
	}

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

	public String getSinger() {
		return singer;
	}

	public void setSinger(String singer) {
		this.singer = singer;
	}

	@Override
	public String toString() {
		return title + "\t\t" + singer;
	}

	@Override
	public int compareTo(Music o) {
		return this.singer.compareTo(o.singer);
	}

	@Override
	public int hashCode() {
		return Objects.hash(singer, title);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Music other = (Music) obj;
		if (singer == null) {
			if (other.singer != null)
				return false;
		} else if (!singer.equals(other.singer))
			return false;
		if (title == null) {
			if (other.title != null)
				return false;
		} else if (!title.equals(other.title))
			return false;
		return true;
	}	
}
--------------------------------------------------------
package com.collection.list.music.run;

import com.collection.list.music.view.MusicMenu;

public class MusicRun {

	public static void main(String[] args) {
		new MusicMenu().mainMenu();
		System.out.println("-----이용해주셔서 감사합니다.-----");
	}

}
--------------------------------------------------------
package com.collection.list.music.vo.model;

import java.util.Comparator;

import com.collection.list.music.vo.Music;

public class TitleAsc implements Comparator<Music> {

	@Override
	public int compare(Music o1, Music o2) {
		return o1.getTitle().compareTo(o2.getTitle());
	}
}
package com.collection.list.music.manager;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import com.collection.list.music.vo.Music;


/**
 * 
 *music 관리자 클래스
 *has a 포함관계
 *
 */
public class MusicManager {
	private List<Music> musicList = new ArrayList<>();
	{
		musicList.add(new Music("이지금","아이유"));
		musicList.add(new Music("Easy on me","Adele"));
		musicList.add(new Music("Die For You","The Weekend"));
		musicList.add(new Music("outro","m83"));
		musicList.add(new Music("수영해","유라"));
	}
	
	/**
	 * 1. 목록보기
	 * 필요에 따라 printList메소드를 오버라이딩해서 쓸 수 있다.
	 */
	public List<Music> selectList() {
		return musicList;
	}
	


	/**
	 * 2. 마지막에 음악추가 : 사용자로부터 곡명과 가수를 입력받아 리스트에 저장하는 메소드.
	 */
	public void addList(Music m) {
		//생성된 Music객체를 리스트에 추가
		musicList.add(m);
	}

	/**
	 * 3. 맨처음에 음악추가 : 리스트 최상위(0번지)에 음악을 추가하는 메소드
	 */
	public void addAtZero(Music string) {
		//0번지 music객체 추가
		musicList.add(0,string);
	}

	/**
	 * 4. 특정곡을 삭제하는 메소드 : 제목으로 검색후 최초로 검색된 음악을 삭제
	 */
	public boolean removeMusic(String title) {
		//1.리스트를 열람후 곡을 찾음
		for(int i=0; i<musicList.size(); i++) {
			//3.해당곡이 있을 경우 삭제
			if(title.equals(musicList.get(i).getTitle())) {
				musicList.remove(i);
//				mList.remove(mList.get(i));
				return true;
			}
		}
		
		//4.해당곡이 없을 경우에는 찾는 곡이 없는 경우
		return false;
			
	}

	/**
	 * 5. 특정곡을 바꾸는 메소드 
	 */
	public boolean replaceMusic(Music oldMusic, Music newMusic) {
		
		//1.리스트를 열람후 곡을 찾음
		for(int i=0; i<musicList.size(); i++) {
			//3.해당곡이 있을 경우 새로운 music객체(사용자 입력)
			if(oldMusic.equals(musicList.get(i))) {
				//대체
				musicList.set(i, newMusic);
				return true;
			}
		}
		
		//4.해당곡이 없을 경우;
		return false;
	}

	/**
	 * 6. 특정곡이 있는지 검사하는 메소드
	 * (곡명일부로 검색해서 해당곡이 있다면, 곡정보(제목/가수)를 출력하고, 없다면, "검색결과가 없습니다"출력) 
	 */
	public List<Music> searchMusicByTitle(String title) {

		//1.리스트 순회 : 곡이 있다면, 곡정보 출력
		//없다면, 곡이 없다고 피드백주기
		List<Music> searchList = new ArrayList<>();
		for(int i=0; i<musicList.size(); i++) {
			//2.해당곡이 있을 경우 출력
			if(musicList.get(i).getTitle().contains(title)) 
				searchList.add(musicList.get(i));
		}
		
		return searchList;
	}


	/**
	 * 7. 가수명으로 검색 메소드 : 복수개의 결과가 나올수 있음.
	 */
	public List<Music> searchMusicBySinger(String singer) {
		//검색된 결과를 담을 리스트
		List<Music> searchList = new ArrayList<>();
		
		//1.리스트 순회 
		for(int i=0; i<musicList.size(); i++) {
			//2.해당가수의 곡이 있을경우 출력
			if(musicList.get(i).getSinger().contains(singer)) {	
				searchList.add(musicList.get(i));				
			}
		}
		
		return searchList;
	}

	

	/**
	 * 8. 졍렬메소드
	 * @java.uril.Comparable을 구현한 Music 클래스 (comparedTo메소드 오버라이드)
	 * @java.util.Comparator를 구현한 클래스 작성(compare메소드오버라이드)
	 */
	public List<Music> orderBy(Comparator<Music> comp) {
		//실제 원본 리스트를 변경하지 않으려면, clone후 진행한다.
		//ArrayList타입에 clone오버라이딩 되어있으므로, List -> ArrayList 형변환 필수.
		//실제 ArrayList에 대해 깊은 복사가 이루어 지지만, 참조하는 요소 Music객체는 동일하다.(복사생성자를 통해 다시 깊은 복사 가능)
		List<Music> musicList = (List<Music>)((ArrayList<Music>) this.musicList).clone();

		// 아래 두 코드는 동일하다.
//		Collections.sort(musicList, comp);
		musicList.sort(comp); 
		
		return musicList;
	}

	
}


--------------------------------------------------------
package com.collection.list.music.view;

import java.util.Collections;
import java.util.List;
import java.util.Scanner;

import com.collection.list.music.manager.MusicManager;
import com.collection.list.music.vo.Music;
import com.collection.list.music.vo.model.TitleAsc;

/**
 * 
 * 
 * view단 클래스
 * -사용자에게 메뉴시각화 
 * -사용자 입력값 처리 
 * -manager 객체의 메소드 호출
 * -결과 출력
 *
 */

public class MusicMenu {
	
	private Scanner sc =new Scanner(System.in);
	
	//music을 관리하는 class가 manager니까.
	private MusicManager manager = new MusicManager();
	
	

	public void mainMenu() {
		String menu = "================ Music Playlist Menu ================\r\n" 
				+ "1.목록보기\r\n" 
				+ "2.마지막에 음악추가\r\n"
				+ "3.맨처음에 음악추가\r\n" 
				+ "4.곡삭제\r\n" 
				+ "5.곡변경\r\n" 
				+ "6.곡명검색\r\n"
				+ "7.가수검색\r\n" 
				+ "8.목록정렬(곡명오름차순)\r\n"
				+ "0.종료\r\n" 
				+ "================================================================\r\n" 
				+ ">> 메뉴선택 : ";
		
		
		while (true) {
			System.out.println(menu);
			String choice = sc.next();
			
			boolean result = false;
			
			switch(choice) {
			//목록 출력
			case "1" :
				printList(manager.selectList());
				break;
			//마지막에 음악추가
			case "2":
				manager.addList(inputMusic());
				break;
			//맨처음에 음악추가
			case "3":
				manager.addAtZero(inputMusic());
				break;
			//특정곡 삭제
			case "4":
				result = manager.removeMusic(inputTitle());
				System.out.println(result ? "> 삭제 성공! " : "> 삭제 실패! 찾는 곡 없음 " );
				break;
			//특정곡 변경
			case "5":
				result = manager.replaceMusic(inputMusic(),inputMusic());
				System.out.println(result ? "> 수정 성공! " : "> 수정 실패! 찾는 곡 없음 " );
				break;
			//특정곡 검색	
			case "6":
				printList(manager.searchMusicByTitle(inputTitle()));
				break;
			//가수명으로 검색
			case "7":
				printList(manager.searchMusicBySinger(inputSinger()));
				break;
			//서브메뉴
			case "8":
				orderMenu();
				break;
			case "0":
				return; //현재메소드를 호출한곳으로 return(메인메소드)
			default:
				System.out.println("잘못 입력함");
			}
		}
	}
	
	
	
	
	
	private void orderMenu() {
		String order="================ 정렬 메뉴 ================\\r\\n\" \r\n"
				+ "				+ \"1.가수명 오름차순\\r\\n\" \r\n"
				+ "				+ \"2.가수명 내림차순\\r\\n\"\r\n"
				+ "				+ \"3.곡명 오름차순\\r\\n\" \r\n"
				+ "				+ \"4.곡명 내림차순\\r\\n\" \r\n"
				+ "				+ \"5.메인메뉴 돌아가기\\r\\n\" \r\n"
				+ "				+ \"================================================================\\r\\n\" \r\n"
				+ "				+ \">> 메뉴선택 :  ";
		
		
		while(true) {
			System.out.print(order);
			int choice =sc.nextInt();
			switch(choice) {
			case 1:
				printList(manager.orderBy(null));
				break;
			case 2:
				printList(manager.orderBy(Collections.reverseOrder()));
				break;
			case 3:
				printList(manager.orderBy(new TitleAsc()));
				break;
			case 4:
				printList(manager.orderBy(Collections.reverseOrder(new TitleAsc())));
				break;
			case 5:
				return;
			default:
				System.out.println("잘못 입력함");
			}
		}
	}

	private void printList(List<Music> list) {
		System.out.println("==========================================");
		if(!list.isEmpty()) {
			System.out.println("곡명\t\t가수");
			System.out.println("------------------------------------");
			//1.for(index)
			//2.iterator
			//3.foreach
			for(Music m : list)
				System.out.println(m);
		}
		else {
			System.out.println("찾으시는 곡이 없습니다.");
		}
		System.out.println("------------------------------------\n");
		
	}
	
	
	public Music inputMusic() {
		System.out.println("곡명 입력");
		String title = sc.next();
		System.out.println("가수 입력");
		String singer = sc.next();
		
		return new Music(title,singer);
	}

	public String inputTitle() {
		System.out.println("곡명 입력:  ");
		return sc.next();
	}
	
	public String inputSinger() {
		System.out.println("가수 입력:  ");
		return sc.next();		
	}
	

}

'학원 > 실습' 카테고리의 다른 글

*24일차 ncs (수강생 평가) -실기  (0) 2022.02.25
*24일차 ncs (수강생 평가) -필기  (0) 2022.02.25
*22일차 실습  (0) 2022.02.23
*21일차 실습  (0) 2022.02.22
*20일차 실습  (0) 2022.02.21