package menu;
import java.util.Scanner;
import console.ClubConsole;
public class ClubMenu {
private Scanner sc;
//클럽 콘솔을 호출하기 위해서 추가하는 것
private ClubConsole console;
public ClubMenu()
{
this.sc = new Scanner(System.in);
this.console = new ClubConsole();
}
public void show()
{
int inputNumber = 0;
while(true)
{
displayMenu();
inputNumber = selectMenu();
System.out.println(inputNumber);
switch(inputNumber)
{
case 1:
console.register();
break;
case 2:
console.findAll();
break;
case 3:
console.findId();
break;
case 4:
console.findName();
break;
case 5:
console.modify();
break;
case 6:
console.remove();
break;
case 0:
return;
default:
System.out.println("Choose agin!!");
}
}
}
private void displayMenu()
{
System.out.println("=======================");
System.out.println("Club Menu");
System.out.println("=======================");
System.out.println("1. Register");
System.out.println("2. Find(All)");
System.out.println("3. Find(ID)");
System.out.println("4. Find(Name)");
System.out.println("5. Modify");
System.out.println("6. Remove ");
System.out.println("=======================");
System.out.println("0. Previous");
System.out.println("=======================");
}
private int selectMenu()
{
System.out.print("Select : ");
int menuNumber = sc.nextInt();
if(menuNumber >= 0 && menuNumber <= 6)
{
sc.nextLine();
/*
* nextLine() 하게되면 해당 버퍼를 지운다.
*/
return menuNumber;
}
else
{
System.out.println("It`s a invalid number --->" + menuNumber);
return -1;
}
}
}
package util;
import menu.ClubMenu;
public class StoryAssistant {
private void startStory()
{
ClubMenu clubmenu = new ClubMenu();
clubmenu.show();
}
public static void main(String[] args) {
StoryAssistant assistant = new StoryAssistant();
assistant.startStory();
}
}
package console;
import Service.ClubService;
import Service.ServiceLogicLifeCycle;
import Service.logic.ClubServiceLogic;
import entity.TravelClub;
import util.ConsoleUtil;
public class ClubConsole {
private ConsoleUtil consoleutil;
private ClubService clubService;
public ClubConsole()
{
this.consoleutil = new ConsoleUtil();
/*
* 이후 변경될 코드입니다.
*/
this.clubService = ServiceLogicLifeCycle.getuniqueInstance().getClubService();
}
public void register()
{
while(true)
{
String clubName = consoleutil.getValueOf("Club Name(0.Club Menu)");
/*
* 객체를 사용하여 콘솔에서 사용자로부터 값을 입력받는다.
* 용자가 프로그램에 클럽 이름을 제공할 수 있게 해주는 부분이다.
*/
if(clubName.equals("0")) // 돌아가겠다는 의미
{
return;
}
String intro = consoleutil.getValueOf("Club Intro(0.Club Menu)");
if(intro.equals("0"))
{
return;
}
TravelClub newClub = new TravelClub(clubName, intro);
clubService.register(newClub);
System.out.println("Registered club : " + newClub.toString());
}
}
public void findAll()
{
TravelClub[] foundClubs = clubService.findAll();
if(foundClubs.length == 0)
{
System.out.println("Empty");
return;
}
for(TravelClub club : foundClubs)
{
System.out.println(club.toString());
}
}
public void findId()
{
TravelClub foundClub = null;
while(true)
{
String clubId = consoleutil.getValueOf("Club id to find(0:Club Menu");
if(clubId.equals("0"))
{
break;
}
foundClub = clubService.findId(clubId);
if(foundClub != null)
{
System.out.println(foundClub.toString());
}
else
{
System.out.println("Can not find club, ID :" + clubId);
}
}
}
public void findName()
{
TravelClub[] foundClubs = null;
while(true)
{
String clubname = consoleutil.getValueOf("Club name to find(0:Club Menu");
if(clubname.equals("0"))
{
break;
}
foundClubs = clubService.findName(clubname);
if(foundClubs != null && foundClubs.length != 0)
{
for(TravelClub club : foundClubs)
{
System.out.println(club);
}
}
else
{
System.out.println("Can not find Club, Name :" + clubname);
}
}
}
/*
* findAll 제외하고 나머지는 사용자로부터 값을 입력 받아야함.
*/
private TravelClub findOne()
{
TravelClub foundClub = null;
while(true)
{
String clubId = consoleutil.getValueOf("Club id to find(0:Club Menu");
if(clubId.equals("0"))
{
break;
}
foundClub = clubService.findId(clubId);
if(foundClub != null)
{
break;
}
else
{
System.out.println("Can not find club, ID :" + clubId);
}
}
return foundClub;
}
public void modify()
{//변경하고자 하는 Travel club를 찾아라.
TravelClub targetClub = findOne(); // 사용자로부터 값을 받고
String newName = consoleutil.getValueOf("New Club name(0.Club Menu, Enter, No Change");
/*
* 사용자에게 새로운 여행 클럽 이름을 입력하도록 요청
* consoleutil 객체를 사용하여 사용자 입력을 받는다
*/
if(newName.equals("0"))
{
return;
}
if(!newName.isEmpty()) // 비어 있지 않다면
{
targetClub.setClubName(newName);
}
String newIntro = consoleutil.getValueOf("New Club Intro(0.Club Menu, Enter, No Change");
if(!newIntro.isEmpty())
{
targetClub.setIntro(newIntro);
}
/*
* 마지막으로 이 코드는 변경된 targetClub를 전달하여
* 클럽 정보(이름 및 소개)를 수정하기 위해
* clubService 객체의 modify 메서드를 호출
*/
clubService.modify(targetClub);
System.out.println("Modify Club : " + targetClub.toString());
}
public void remove()
{
/*
* 하나의 Club를 찾는 부분을 살펴본다.
*/
TravelClub targetClub = findOne();
String confirmStr = consoleutil.getValueOf("Remove this Club? ( Y: yes, N:no)");
if(confirmStr.toLowerCase().equals("y") || confirmStr.toLowerCase().equals("yes"))
{
System.out.println("Remove a club --> " + targetClub.getClubName());
clubService.remove(targetClub.getId());
}
else
{
System.out.println("Remove cancelled, your club is safe" + targetClub.getClubName());
}
/*
* toLowerCase() 메소드를 활용해서
* confirmStr이 가지고 있는 문자를 전부 소문자로 바꾼다.
*/
}
}
public class ClubConsole {
private ConsoleUtil consoleutil;
private ClubService clubService;
public ClubConsole()
{
this.consoleutil = new ConsoleUtil();
/*
* 이후 변경될 코드입니다.
*/
this.clubService = new ClubServiceLogic();
}
ConsoleUtil 사용자가 값을 입력하는 클래스
ClubService 인터페이스로 구현되어 있음
this.clubService = new ClubServiceLogic(); 해당 부분은 인터페이스를 implements한 클래스가 ClubServiceLogic이기 때문에 인스턴스화 진행
public void register()
{
while(true)
{
String clubName = consoleutil.getValueOf("Club Name(0.Club Menu)");
/*
* 객체를 사용하여 콘솔에서 사용자로부터 값을 입력받는다.
* 용자가 프로그램에 클럽 이름을 제공할 수 있게 해주는 부분이다.
*/
if(clubName.equals("0")) // 돌아가겠다는 의미
{
return;
}
String intro = consoleutil.getValueOf("Club Intro(0.Club Menu)");
if(intro.equals("0"))
{
return;
}
TravelClub newClub = new TravelClub(clubName, intro);
clubService.register(newClub);
System.out.println("Registered club : " + newClub.toString());
}
getValueOf
public String getValueOf(String label)
{
System.out.print(label + " : ");
String inputStr = sc.nextLine();
inputStr = inputStr.trim();
/*
* trim은 공백이나 이런 부분들을 생략해준다.
* 제주여행 < 엔터가 들어가는데 엔터부분을 빼준다.
*
*/
return inputStr;
}
consoleutil의 getValueOf메소드를 통해서 값을 받고 clubName에 할당하고 그 값을 equals에 넣는 아이디어
package entity;
import java.util.UUID;
import javax.sound.midi.SysexMessage;
import util.DateUtil;
public class TravelClub {
private static final int MINIMUM_NAME_LENGTH = 3;
private static final int MINIMUM_INTRO_LENGTH = 5;
private String id;
private String clubName;
private String intro;
private String foundationDay;
private TravelClub()
{
this.id = UUID.randomUUID().toString();
}
public TravelClub(String clubName, String intro)
{
this();
setClubName(clubName);
setIntro(intro);
this.foundationDay = DateUtil.today();
/*
* this()를 사용하여 객체가 생성될 때 기본 생성자의 초기화 코드가 실행되고,
* 그런 다음 clubName 및 intro를 설정하고 foundationDay를 설정하여 객체를 초기화한다.
*
*/
}
public void setClubName(String clubName)
{
if(clubName.length() < MINIMUM_NAME_LENGTH)
{
System.out.println("club name should be longer than 3");
return;
}
this.clubName = clubName;
}
public String getClubName()
{
return this.clubName;
}
public void setIntro(String intro)
{
if(intro.length() < MINIMUM_INTRO_LENGTH)
{
System.out.println("club intro should be longer then : " + MINIMUM_INTRO_LENGTH);
return;
}
this.intro = intro;
}
public String getIntro()
{
return this.intro;
}
public String getId()
{
return this.id;
}
public String getFoundationDay()
{
return this.foundationDay = foundationDay;
}
public static TravelClub getSample()
{
String clubname = "Sample Club";
String intro = "Sample Club Intro";
TravelClub sampleclub = new TravelClub(clubname,intro);
return sampleclub;
}
@Override
public String toString() {
return "TravelClub [id=" + id + ", clubName=" + clubName + ", intro=" + intro + ", foundationDay="
+ foundationDay + "]";
}
}
내가 몰랐던 부분 This() -> 디폴트 생성자 호출 // 생성자끼리 호출 가능 그리고 생성자를 통해서 Setter / Getter 호출 하면서 응용하는 부분 배울 것.
그리고 Setter 할 떄, 파라미터로 조건을 받아들이고 그 값에 조건을 줘서 return 하는 아이디어도 기억할 것.
public TravelClub(String clubName, String intro)
{
this();
setClubName(clubName);
setIntro(intro);
this.foundationDay = DateUtil.today();
/*
* this()를 사용하여 객체가 생성될 때 기본 생성자의 초기화 코드가 실행되고,
* 그런 다음 clubName 및 intro를 설정하고 foundationDay를 설정하여 객체를 초기화한다.
* This를 통해서 ID 값을 할당 받은 것이다.
*/
}
public static TravelClub getSample()
{
String clubname = "Sample Club";
String intro = "Sample Club Intro";
TravelClub sampleclub = new TravelClub(clubname,intro);
return sampleclub;
}
인스턴스화 할 떄 파라미터 값으로 2개의 인자를 넘겨주게 되는데, TravelClub 디폴트 생성자를 This()로 넘겨받아 해당 값을 set 한다. 이 부분의 로직을 기억하자.
package console;
import Service.ClubService;
import Service.ServiceLogicLifeCycle;
public class ClubSubConsole {
private ClubService clubservice;
public ClubSubConsole()
{
this.clubservice = ServiceLogicLifeCycle.getuniqueInstance().getClubService();
}
}
package Service;
import entity.TravelClub;
public interface ClubService {
void register(TravelClub travelClub);
TravelClub[] findAll();
TravelClub[] findName(String clubName);
TravelClub findId(String clubId);
void modify(TravelClub modifyClub);
void remove(String clubId);
}
package Service;
import Service.logic.ClubServiceLogic;
public class ServiceLogicLifeCycle {
private static ServiceLogicLifeCycle uniqueInstance;
/*
* why ? static으로 선언 했는지는 마무리 되고 알 수 있음
* ServiceLogicLifeCycle은 ClubService와 ClubConsole를 알아야 된다.
*/
private ClubService clubService;
private ServiceLogicLifeCycle()
{
this.clubService = new ClubServiceLogic();
}
public ClubService getClubService()
{
// if(clubService == null)
// {
// clubService = new ServiceLogicLifeCycle();
// }
return this.clubService;
}
public static ServiceLogicLifeCycle getuniqueInstance()
{
if(uniqueInstance == null)
{
uniqueInstance = new ServiceLogicLifeCycle();
}
return uniqueInstance;
}
/*
* 생성자가 private가 되서 인스턴스 할 수 있는 부분은 getuniqueInstance밖에 없다.
*/
}
package Service.logic;
import java.util.Arrays;
import Service.ClubService;
import entity.TravelClub;
public class ClubServiceLogic implements ClubService{
private TravelClub[] clubs;
private int index;
public ClubServiceLogic()
{
this.clubs = new TravelClub[10];
this.index = 0;
}
@Override
public void register(TravelClub travelClub) {
clubs[index] = travelClub;
index++;
}
@Override
public TravelClub[] findAll() {
return Arrays.copyOfRange(clubs, 0, index);
}
@Override
public TravelClub[] findName(String clubName) {
TravelClub[] createdClubs = Arrays.copyOfRange(clubs,0, index);
TravelClub[] foundClubs = new TravelClub[createdClubs.length];
int subIndex = 0;
for(TravelClub club : createdClubs)
{
if(club.getClubName().equals(clubName))
{
foundClubs[subIndex] = club;
subIndex++;
}
}
return Arrays.copyOfRange(foundClubs, 0, subIndex);
/*
* foundClubs 배열을 0부터 subIndex까지 잘라서 새로운 배열을 생성하고 반환하는 역할
* subIndex 이후의 요소는 잘려나가고, foundClubs 배열의 길이가 subIndex만큼 줄어든다.
* 이렇게 복사된 새로운 배열이 findName 메소드의 반환값이다.
*/
}
@Override
public TravelClub findId(String clubId) {
TravelClub[] createdClubs = Arrays.copyOfRange(clubs,0, index);
TravelClub foundClub = null;
for(TravelClub club : createdClubs)
{
if(club.getId().equals(clubId)) {
foundClub = club;
break;
}
}
return foundClub;
}
@Override
public void modify(TravelClub modifyClub) {
// 중요한 것은 바꿔야 되는 파라미터로 넘어오는 modiftClub은 이름과 인트로가 바뀐것.
// 배열에 있는 클럽중에 몇번 인덱스에 있는 배열을 바꿔줄것인가를 알아야된다.
int foundIndex = 0;
for(int i = 0; i<clubs.length; i++)
{
if(clubs[i].getId().equals(modifyClub.getId()))
{
foundIndex = i; // 인덱스를 찾음
break;
}
}
this.clubs[foundIndex] = modifyClub;
}
/*
* modify 메소드는 주어진 클럽 ID를 기반으로 현재 등록된 클럽 중에서 해당 클럽을 찾아서 정보를 수정하는 기능을 수행
* 클럽의 ID를 기반으로 인덱스를 찾아내고, 해당 인덱스의 클럽 정보를 주어진 modifyClub 객체의 정보로 대체
*/
@Override
public void remove(String clubId) {
/*
* a,b,c,d 에서 b를 삭제한다고 가정했을 때,
* a,c,d -> 앞쪽으로 땡기는 작업이 필요하다. index 활용
*/
int foundIndex = 0;
for(int i = 0; i<clubs.length; i++)
{
if(clubs[i].getId().equals(clubId))
{
foundIndex = i; // 인덱스를 찾음
break;
}
}
// 찾은 인덱스부터 시작
for(int i = foundIndex; i<=this.index; i++)
{
clubs[i] = clubs[i+1];
}
this.index--; //내용을 제거해서 index
}
}
package util;
import java.util.Scanner;
public class ConsoleUtil {
private Scanner sc;
public ConsoleUtil()
{
this.sc = new Scanner(System.in);
}
/*
* 정수 값이 아니라 문자열로 받아서 반환해줄거임.
*/
public String getValueOf(String label)
{
System.out.print(label + " : ");
String inputStr = sc.nextLine();
inputStr = inputStr.trim();
/*
* trim은 공백이나 이런 부분들을 생략해준다.
* 제주여행 < 엔터가 들어가는데 엔터부분을 빼준다.
*
*/
return inputStr;
}
}
package util;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class DateUtil {
public static String today(String format)
{
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
return dateFormat.format(Calendar.getInstance().getTime());
}
public static String today()
{
return today("yyyy.MM.dd");
}
}