헬린코린이

비나이다 비나이다 본문

Project/Team Project

비나이다 비나이다

HCD 2022. 12. 19. 22:15

MVC패턴과 크롤링을 이용하여 작은 프로젝트를 진행했습니다. 기간은 1주일 정도 걸렸고

정말 열심히 했습니다.

client

package client;

import ctrl.Ctrl;

public class Client {
	public static void main(String[] args) {
		Ctrl app=new Ctrl();
		app.startApp();
	}
}

ctrl

package ctrl;

import model.Crawling;
import model.MemberDAO;
import model.MemberVO;
import model.ScheduleDAO;
import model.ScheduleVO;
import view.View;

// 컨트롤은 모델과 뷰를 멤버변수로 가짐
public class Ctrl { 
	private View view;
	private MemberDAO mdao;
	private ScheduleDAO sdao;
	private Crawling crawling;

	public Ctrl() { // 생성자
		// DAO를 다 만들고나서 크롤링만드는것 맞는것
		// 이 두개는 개별적이고 컨트롤에서 조합해야함

		view=new View(); // 객체화하기
		mdao=new MemberDAO(); // 객체화하기
		sdao=new ScheduleDAO(); // 객체화하기
		crawling =new Crawling(); // 크롤링 객체 가지고 있어야함

	}

	// 앱 시작
	public void startApp() {
		// 뷰에서 메인메뉴 출력가져오기
		// 받은 액션에따라

		while(true){ // 메인메뉴 반복
			int act=view.printStart();

			if(act==1){ // 로그인
				MemberVO mvo = new MemberVO(); // 로그인정보 확인할 일회성 mvo 객체화
				mvo.setID(view.getId()); // 입력받은 id 세팅
				mvo.setPw(view.getPw()); // 입력받은 pw 세팅
				mvo = mdao.hasMember(mvo); // 해당하는 기존 mvo 반환
				if(mvo==null) {
					view.loginFalse(); // 로그인 실패
					continue;
				}
				view.loginTure(mvo);// 로그인성공 출력문구에 해당이름을 넣기위한 인자 mvo
				// 현재 로그인한 사람 == mvo

				// 관리자모드
				if(mvo.getID().equals("sixsense")) {// id가 "sixsense"라면 관리자모드
					while(true){
						act=view.adminMenu(); // 관리자 메뉴출력 선택값 act반환

						if(act==1){// 1. 출력
							// sdao에서 반환된 목록 리스트를 뷰에게 출력 요청
							view.adminselectAll(sdao.loadSchedules(null));
						}
						else if(act==2){ // 2. 일정삭제
							ScheduleVO svo=new ScheduleVO();
							// 일정전체목록을 view로 넘겨서 전체출력 후 true반환
							if(view.adminselectAll(sdao.loadSchedules(null))) { 
								// 일정 전체 목록을 뷰에게 넘겨주고 삭제할일정 입력받고 svo에 세팅
								// sdao의 삭제메서드로 svo넘겨줌
								svo.setpNum(view.deleteNum(sdao.loadSchedules(null)));   
								if(sdao.isDeleteSchedule(svo)) { // 삭제 성공한다면
									view.scheduleDeleteTrue(); // 성공멘트출력
								}
								else {
									view.scheduleDeleteFalse(); // 실패멘트출력
								}
							}
						}
						else if(act==3) { // 3. 로그아웃
							// 뷰에게 로그아웃 멘트 호출
							view.logOut();
							break; // 관리자모드 반복문 종료
						}
					}
				}
				else { // 회원로그인
					while(true){ 
						// 로그인성공시
						act=view.printMenu();
						if(act==1){ // 1. 일정추가
							ScheduleVO svo=new ScheduleVO(); // 모델에 인자로 넘길 svo 객체화
							svo.setYear(view.year()); // 년도 입력받아서 세팅
							svo.setMonth(view.mon(svo.getYear())); // 월 입력받아서 세팅
							svo.setDay(view.day(svo.getYear(),svo.getMonth())); // 일 입력받아서 세팅

							svo.setID(mvo.getID()); // 회원ID를 일정vo에 FK로 세팅
							svo.setMemo(view.diary()); // 일정추가

							// 크롤링에서 구리스트 반환 - 뷰에서 출력, 선택된 값으로 세팅
							// 세팅된 구를 크롤링 동에 넘겨주고 - 동 리스트 반환 - 뷰에서 출력, 선택된 값으로 세팅
							svo.setGu(view.gu(crawling.getGu())); // 구 저장 
							svo.setDong(view.dong(crawling.getDong(svo.getGu())));
							// 스케줄리스트를 가지고있는 객체와 일정세팅된 객체 크롤링으로 보냄 -크롤링에서 dao로 전달
							crawling.setWeather(sdao ,svo); // 세팅된 객체를 크롤링으로 보냄
							view.scheduleTrue(); // 일정등록 성공 
						}

						else if(act==2){ //2.전체 일정 출력
							// 로그인한 mvo넘겨주고 해당 회원의 일정리스트를 뷰에게 전달후 출력 
							view.selectAll(sdao.loadSchedules(mvo));
						}
						else if(act==3){ //3.일정 변경
							// 로그인한 mvo넘겨주고 해당 회원의 일정리스트를 뷰에게 전달후 출력 
							if(view.selectAll(sdao.loadSchedules(mvo))) {
								// sdao에서 회원의 일정리스트를 뷰에게 전달 - 변경할 일정과 sdao를 크롤링에 넘겨주고 세팅								
								if(crawling.setWeather(sdao, view.changeDiary(sdao.loadSchedules(mvo)))) { // 변경성공한다면 

									view.scheduleChangeTrue(); // 성공멘트출력
								}
								else {
									view.scheduleChangeFalse();; // 실패멘트출력
								}
							}
						}

						else if(act==4){ //4.일정 삭제

							ScheduleVO svo=new ScheduleVO(); // 모델에 인자로 넘길 svo 객체화
							// 로그인한 mvo넘겨주고 해당 회원의 일정리스트를 뷰에게 전달후 출력 
							if(view.selectAll(sdao.loadSchedules(mvo))) {
								// sdao에서 회원의 일정리스트를 뷰에게 전달 - 삭제할 일정pk 세팅
								svo.setpNum(view.deleteNum(sdao.loadSchedules(mvo)));
								if(sdao.isDeleteSchedule(svo)) { // 해당 일정 삭제 성공한다면
									view.scheduleDeleteTrue(); // 성공멘트출력
								}
								else {
									view.scheduleDeleteFalse(); // 실패멘트출력
								}
							}
						}
						else if(act==5) { // 5. 회원변경
							// 뷰에서 변경할정보를 입력받고 세팅된 vo를 모델로 보내서 확인 후 변경
							if(mdao.isModifyMember(view.updateMember(mvo))) { // 변경성공한다면
								view.memberChangeTrue(); // 성공멘트출력
								break;
							}
							view.memberChangeFalse(); // 실패멘트출력

						}
						else if(act==6) { // 6. 회원탈퇴
							if(view.getCheck(mvo)) { // 탈퇴여부 입력받고 반환
								if(mdao.isDeleteMember(mvo)) { // ID확인후 회원삭제 성공한다면
									sdao.memberDeleteScheduleAll(mvo); // ID확인후 삭제
									view.memberDeleteTrue(); // 탈퇴성공멘트출력
									break;
								}
							} 
							view.memberDeleteFalse(); // 탈퇴실패멘트출력
						}
						else{
							break; // 로그인반복문 탈출하고 메인메뉴로
						}
					}
				}
			}

			else if(act==2){ // 회원가입
				MemberVO mvo=new MemberVO(); // 회원가입할 일회성 mvo 객체화
				mvo.setID(view.getId()); // 입력받은 id 세팅
				mvo.setPw(view.getPw()); // 입력받은 pw 세팅
				mvo.setName(view.getName()); // 입력받은 이름 세팅
				if(mdao.isInputMember(mvo)) { // 세팅된 mvo를 넘겨주고 회원가입 성공한다면
					view.joinTure(); // 성공멘트출력
				}
				else {
					view.idFalse(); // 실패한다면 아이디 중복 멘트 출력
				}
			}
			else{ // 프로그램 종료
				view.powerOff(); 
				return;
			}

		}
	}
}

model

ScheduleVO

package model;

public class ScheduleVO {
	private String weather; //날씨.
	private int year; //년.
	private int month; //달.
	private int day; //일.
	private String highTemperature; //최고기온.
	private String lowTemperature; //최저기온.
	private String pmRainfall; //최대 강우량.
	private String amRainfall; //최소 강우량.
	private String memo;
	private String ID; //FK
	private int pNum; //PK
	private String gu;
	private String dong;

	public int getpNum() {
		return pNum;
	}
	public void setpNum(int pNum) {
		this.pNum = pNum;
	}
	public String getWeather() {
		return weather;
	}
	public void setWeather(String weather) {
		this.weather = weather;
	}
	public String getMemo() {
		return memo;
	}
	public void setMemo(String memo) {
		this.memo = memo;
	}
	public String getID() {
		return ID;
	}
	public void setID(String ID) {
		this.ID = ID;
	}
	public int getYear() {
		return year;
	}
	public void setYear(int year) {
		this.year = year;
	}
	public int getMonth() {
		return month;
	}
	public void setMonth(int month) {
		this.month = month;
	}
	public int getDay() {
		return day;
	}
	public void setDay(int day) {
		this.day = day;
	}

	public String getHighTemperature() {
		return highTemperature;
	}
	public void setHighTemperature(String highTemperature) {
		this.highTemperature = highTemperature;
	}
	public String getLowTemperature() {
		return lowTemperature;
	}
	public void setLowTemperature(String lowTemperature) {
		this.lowTemperature = lowTemperature;
	}
	
	public String getPmRainfall() {
		return pmRainfall;
	}
	public void setPmRainfall(String pmRainfall) {
		this.pmRainfall = pmRainfall;
	}
	public String getAmRainfall() {
		return amRainfall;
	}
	public void setAmRainfall(String amRainfall) {
		this.amRainfall = amRainfall;
	}
	public String getGu() {
		return gu;
	}
	public void setGu(String gu) {
		this.gu = gu;
	}
	public String getDong() {
		return dong;
	}
	public void setDong(String dong) {
		this.dong = dong;
	}



}

ScheduleDAO

package model;

import java.util.ArrayList;

public class ScheduleDAO {
	private ArrayList<ScheduleVO> svo;
	private int PK;

	public ScheduleDAO() {
		PK=101;
		svo=new ArrayList<ScheduleVO>(); //생성자에서 초기화하는 것이아니라로그인을 하면 그떄 초기화 하면 되는 거 아님?

	}

	public void memberDeleteScheduleAll(MemberVO vo) { // 
		for(int i = 0; i < svo.size(); i++) {
			if(vo.getID().equals(svo.get(i).getID())) { // 동일 아이디 체크
				svo.remove(i--); // 연속으로 같은 아이디일때 일정삭제를 위한 i--
			}
		}
	}
	
	//C
	public boolean isInputSchedule(ScheduleVO vo) { //일정 추가. 날짜 메모입력 받고 PK는 여기서 설정. 날씨는 안 받음.
		try {
			ScheduleVO data = new ScheduleVO(); 
			data = vo;
			data.setpNum(PK++); //PK
			svo.add(data);
			return true;
		}catch (Exception e) {

			return false;
		}
	}
	//R
	public ArrayList<ScheduleVO> loadSchedules(MemberVO vo){ //회원의 일정 전체 목록 출력.
		if(vo == null) { //관리자모드일때 사용.
			return svo; //전체 목록 출력.   
		}
		ArrayList<ScheduleVO> exSvo = new ArrayList<>();// 임시 배열리스트.
		for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
			if(svo.get(i).getID()/*FK*/.equals(vo.getID()/*PK*/)) { //아이디가 같은 것을 찾는다.
				exSvo.add(svo.get(i)); //같으면 임시 배열리스트에 저장.
			}
		}
		return exSvo; //id가 같은 목록만 출력.
	}
	//R
	public ScheduleVO loadSchedule(MemberVO vo) { //PK번호 입력받아서 하나의 목록만 출력.
		for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
			if(svo.get(i).getID().equals(vo.getID())) { //pk값이 동일하다면.
				return svo.get(i); // 그 값을 리턴해준다.
			}
		}
		return null; //PK가 없다면 null을 반환한다.
	}

	//U
	public boolean isModifySchedule(ScheduleVO vo) { //일정 변경. 
		for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
			if(svo.get(i).getpNum()==vo.getpNum()) { //PK값이 맞다면.
				if(vo.getMemo() != null) { //메모가 null이 아니라면.
					svo.get(i).setMemo(vo.getMemo()); //메모가 변경된다.
					return true; //true 리턴해준다.
				}else {
					svo.get(i).setYear(vo.getYear()); //년을 바꿔주고.
					svo.get(i).setMonth(vo.getMonth());  // 달을 바꿔주고.
					svo.get(i).setDay(vo.getDay()); //일을 바꿔준다.
					svo.get(i).setLowTemperature(vo.getLowTemperature());
					svo.get(i).setHighTemperature(vo.getHighTemperature());
					svo.get(i).setAmRainfall(vo.getAmRainfall());
					svo.get(i).setPmRainfall(vo.getPmRainfall());
					return true; //true를 리턴해준다.
				}
			}
		}
		return false; //false를 리턴해준다.
	}

	//D
	public boolean isDeleteSchedule(ScheduleVO vo) { //삭제하기.
		for(int i=0; i<svo.size(); i++) { //리스트 size만큼 돌아서.
			if(svo.get(i).getpNum()==vo.getpNum()) { //PK값이 맞다면.
				svo.remove(i); //PK값에 해당하는 객체를 삭제.
				return true;//true를 리턴해준다.
			}
		}
		return false; //false를 리턴해준다.
	}
}

MemberVO

package model;


public class MemberVO {
	private String ID; //PK
	private String pw; //비밀번호.
	private String name; //이름.
	//ArrayList<ScheduleVO> sArrayList ;
	public String getID() {
		return ID;
	}
	public void setID(String iD) {
		ID = iD;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public MemberVO() {	} //기본생성자
	public MemberVO(String ID, String pw, String name) { //관리자 샘플데이터를 위해 작성.
		this.ID=ID;
		this.pw=pw;
		this.name=name;
	}

}

MemberDAO

package model;

import java.util.ArrayList;

public class MemberDAO {
	private ArrayList<MemberVO> mvo; // MemberVO를 담고있는 배열.

	public MemberDAO(){ 
		mvo=new ArrayList<MemberVO>();
		mvo.add(new MemberVO("sixsense","1234","완벽")); //관리자 정보.
	}
	// C
	public boolean isInputMember(MemberVO vo) { //회원가입.
		for(int i=0; i<mvo.size(); i++) { //리스트 size만큼 돌아서 
			if(mvo.get(i).getID().equals(vo.getID())) { //id가 이미 저장된 VO에 있으면 false
				return false; // false를 리턴해준다.
			}
		}
		MemberVO data=new MemberVO();  //일회용.
		data.setID(vo.getID()); // MemberVO의 아이디를 설정해준다.
		data.setName(vo.getName()); //MemberVO의 이름을 설정해준다.
		data.setPw(vo.getPw()); //MemberVO의 비밀번호를 설정해준다.
		mvo.add(vo);
		return true; //같은 아이디가 존재하지 않다면 true 반환 
		
	}
	//R
	public MemberVO hasMember(MemberVO vo) {// 로그인 로직
		for(int i=0;i<mvo.size();i++) { //mvo사이즈만큼 돌아서
			if(mvo.get(i).getID().equals(vo.getID())) { //아이디가 있다면
				if(mvo.get(i).getPw().equals(vo.getPw())) { //비밀번호가 있다면
					return mvo.get(i); //그 값을 반환한다.
				}
				return null; //null반환
			}
		}
		return null; //null반환
	}
	//U
	public boolean isModifyMember(MemberVO vo) { //정보변경.
		for(int i=0; i<mvo.size(); i++) { //리스트 size만큼 돌아서.
			if(mvo.get(i).getID().equals(vo.getID())) { //id가 있으면.
				if(vo.getPw()!=null) { //비밀번호가 null이 아니라면.
					mvo.get(i).setPw(vo.getPw()); //비밀번호를 변경한다.
					return true;  //true를 반환한다.
				}else if(vo.getName()!=null) { // 이름이 null이 아니라면.
					mvo.get(i).setName(vo.getName()); //이름을 변경한다.
					return true; //true를 반환한다.
				}
			}
		}
		return false; //id가 없다면 false를 반환한다.
	}
	//D
	public boolean isDeleteMember(MemberVO vo) { // 회원 탈퇴.
		for(int i=0; i<mvo.size(); i++) { //리스트size만큼 돌아서.
			if(mvo.get(i).getID().equals(vo.getID())) { //ID가 맞다면 if문 실행
				mvo.remove(i);  //삭제.
				return true; //true 반환
			}
		}
		return false; // 같은 아이디가 존재하지 않다면 false 반환
	}
}

Crawling

package model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Crawling {

   private Map<String, ArrayList<String>> map; // 멤버변수 map
   // 강남구 : [신사동, 압구정동, ... ]
   // 강동구 : [강일동, 상일동, ...]
   // ... 와 같이 키값은 구, 밸류값은 동리스트로 이루어져 있는 맵을 저장할 공간

   public Crawling(){ // 생성자
      map = getMap();
      // 크롤링 객체를 만드는 순간 getMap() 메서드를 호출하여 반환값을 멤버변수 map에 저장한다
   }

   public Map<String, ArrayList<String>> getMap () { // 크롤링 한 map을 리턴할 메서드
      Map<String, ArrayList<String>> map = new HashMap<>();
      // 리턴해줄 map 생성
      final String url = "https://www.seoul.go.kr/seoul/autonomy_sub.do";
      // 서울 특별시 자치구별 동 현황 사이트 주소 url
      Document doc = null;
      try {
         doc = Jsoup.connect(url).get();
         // 해당 url의 페이지 정보를 문서 객체에 저장
      } catch (IOException e) {
         e.printStackTrace();
      }
      Elements eles = doc.select("div.district.tabcont");
      // 크롤링할 정보가 들어있는 div 쿼리셀렉터
      for(Element str : eles) {
         Elements gu = str.select("h5");
         // 구
         ArrayList<String> list = new ArrayList<String>(Arrays.asList(gu.text().split("\\(")));
         // '(' 기준으로 스플릿 
         // ex) '1) 강남구', '江南區) - 행정동', '行政洞) 22,법정동', '法定洞) 14'  
         ArrayList<String> list2 = new ArrayList<String>(Arrays.asList(list.get(0).split("\\) ")));
         // 위에서 ( 기준으로 스플릿한 것 중 첫번째의 값을
         // ex) '1) 강남구'
         // ') ' 기준으로 스플릿
         // ex) '1', '강남구'
         Elements dongs = str.select("tbody > tr > td:nth-child(2)");
         // tbody > tr > td:nth-child(2) 목록
         ArrayList<String> listD = new ArrayList<>(); // 동 리스트
         for(Element e : dongs) {
            ArrayList<String> myList = new ArrayList<>(Arrays.asList(e.text().split(", ")));
            // ', ' 기준으로 스플릿
            // ex) '신사동(新沙洞)', '압구정동(狎鷗亭洞)'
            for(String dong : myList) {
               ArrayList<String> myList2 = new ArrayList<>(Arrays.asList(dong.split("\\(")));
               // '(' 기준으로 스플릿
               // '신사동', '新沙洞)'  
               if(!listD.contains(myList2.get(0))) {
                  listD.add(myList2.get(0));
                  // 위의 값 중 첫번째 값을
                  // ex) '신사동'
                  // 동 리스트에 저장
               }
            } 
         }
         map.put(list2.get(1), listD);
         // 맵에 구와 동리스트를 저장
      }
      return map;
      // 맵 리턴
   }
   public ArrayList<String> getGu() { // 구 리스트를 리턴하는 메서드
      ArrayList<String> guList = new ArrayList<String>(map.keySet());
      Collections.sort(guList);
      return guList;
      // 맵의 키값들을 뽑아서 배열리스트에 저장 후 소트해서 리턴
   }
   public ArrayList<String> getDong(String gu){ // 동 리스트를 리턴하는 메서드
      ArrayList<String> dongList = map.get(gu);
      Collections.sort(dongList);
      return dongList;
      // 인자로 받은 구와 키값이 같은 밸류 배열리스트를 소트해서 리턴
   }
   public boolean setWeather(ScheduleDAO sdao, ScheduleVO svo) { // 날씨를 크롤링하여 svo에 저장 후 sdao로 보내는 메서드
      if(svo.getDay() != 0) { 
         LocalDate now = LocalDate.now();
         // 오늘 날짜 now
         LocalDate when = LocalDate.of(svo.getYear(), svo.getMonth(), svo.getDay());
         // 인자로 받은 날짜 when
         long betweenDay = ChronoUnit.DAYS.between(now, when);
         // 오늘 날짜와 인자로 받은 날짜의 차이  betweenDay
         String url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=" + svo.getDong() + "+기상예보";
         // 인자로 받은 동 정보를 getSelect 메서드에 넣어서 크롤링할 url을 리턴받아온다
         Document doc = null;
         try {
            doc = Jsoup.connect(url).get();
            // 해당 url의 페이지 정보를 문서 객체에 저장
         } catch (IOException e) {
            e.printStackTrace();
         }
         // 크롤링
         String bday = String.valueOf(betweenDay + 1);
         Elements lowestTemp = doc.select("li:nth-child("+ bday +") > div > div.cell_temperature > span > span.lowest");
         Elements highestTemp = doc.select("li:nth-child("+ bday +") > div > div.cell_temperature > span > span.highest");
         Elements amRainfall = doc.select("li:nth-child(" + bday + ") > div > div.cell_weather > span:nth-child(1) > span > span");
         Elements pmRainfall = doc.select("li:nth-child(" + bday + ") > div > div.cell_weather > span:nth-child(2) > span > span");
         svo.setLowTemperature(lowestTemp.text()); // 최저기온
         svo.setHighTemperature(highestTemp.text()); // 최대기온
         svo.setAmRainfall(amRainfall.text()); // 오전강수량
         svo.setPmRainfall(pmRainfall.text()); // 오후강수량 세팅
      }
      if(svo.getpNum() == 0) { // 일정추가
         sdao.isInputSchedule(svo); // 인자로 받은 객체의 날씨를 세팅하고 나서 DAO클래스의 일정추가 메서드의 인자로 보낸다
      }
      else { // 일정변경
         sdao.isModifySchedule(svo);
      }
      return true;
   }
}

view

package view;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import model.MemberVO;
import model.ScheduleVO;

public class View {

	//----------------------------------------------------------------
	//메인메뉴 출력 로직

	public Scanner sc ;
	public View(){
		sc = new Scanner(System.in);
	}

	public int printStart(){
		int act;
		while(true) {
			try{
				System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯  비나이다 비나이다  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
				System.out.println("1.   로그인");
				System.out.println("2.   회원가입");
				System.out.println("3.   종료");
				System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
				System.out.print("   :::   ");
				act = sc.nextInt();
			}catch(Exception e){
				sc.nextLine();
				System.out.println("✖︎ ✖︎  입력 범위로 입력해주세요!  ✖ ︎✖︎");
				continue;
			}
			if(1<=act && act <=3){
				break;
			}
			System.out.println();
			System.out.println();
			System.out.println("✖ ︎✖︎  입력 범위로 입력해주세요!  ✖︎ ✖︎");
			System.out.println();
			System.out.println();
		}
		return act;
	}


	//-----------------------------------------------------------
	// 프로그램 종료문구 로직
	public void powerOff() {
		for(int i=0;i<3;i++) {
			System.out.println(" . ");
		}
		System.out.println("프로그램이 종료되었습니다.");
		System.out.println("안녕히가세요. : D");
	}

	//-----------------------------------------------------------------
	//로그아웃 종료문구 로직
	public void logOut() {
		System.out.println("로그아웃되었습니다.  ");
		System.out.println("안녕히가세요 : D ");
	}

	//-------------------------------------------------------
	//로그인 id 입력 로직
	public String getId() {
		System.out.print("ID :  ");
		String id=sc.next();
		return id;
	}

	//-------------------------------------------------------------------------
	//로그인  pw 입력 로직
	public String getPw() {
		System.out.print("PW :  ");
		String pw=sc.next();
		// 비밀번호 재입력 (유효성 검사) 추가하기
		return pw;
	}

	//---------------------------------------------------------
	//로그인 name 입력 로직
	public String getName() {
		System.out.print("NAME : ");
		String pw=sc.next();
		return pw;
	}

	//////////////////////////////////////
	// 회원가입 로그인 성공
	public void joinTure() {
		System.out.println("회원가입 성공되었습니다.");
		System.out.println("로그인 해주세요 : D ");
	}

	//////////////////////////////////////////////////////
	// 회원가입 중복시 로직
	public void idFalse() {
		System.out.println("✖︎ ✖︎ 중복된 아이디 입니다. ✖︎ ✖︎");
	}

	//---------------------------------------------------------------------------------------------
	//로그인 실패시 로직
	public void loginFalse() {
		System.out.println("✖ ︎✖︎ 로그인 실패... ✖︎ ✖︎");
		System.out.println("아이디 or 비밀번호를 다시 확인해보세요!");
	}

	//---------------------------------------------------------------------------------------------
	//로그인 성공 로직
	public void loginTure(MemberVO vo) {
		System.out.println();
		System.out.println("로그인 되었습니다.");
		System.out.println(vo.getName()+"님 안녕하세요 : D ");

	}

	//------------------------------------------------------------------------------------
	//로그인후 회원 메뉴 출력로직  
	public int printMenu() {  //로그인후 회원 메뉴 출력
		int act;
		while(true) {
			try {
				System.out.println();
				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("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
				System.out.print("   :::   ");
				act = sc.nextInt();
			} catch(Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("✖︎ ✖︎  입력 범위로 입력해주세요!  ✖ ︎✖");
				continue;
			}
			if(1<=act && act <=7) {
				break;
			}
			System.out.println("✖︎ ✖︎  입력 범위로 입력해주세요!  ✖ ︎✖");
			System.out.println();
		}
		return act;
	}

	///////////////////////////////////////////////////////////////////////////////////
	// 일정 구 입력 로직
	public String gu(ArrayList<String>datas) {
		String gu;
		boolean flag=false;
		System.out.println(datas);
		//유효성검사
		while(true) {
			System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 구 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
			System.out.print("   :::   ");
			gu=sc.next();
			for(int i=0;i<datas.size();i++) {
				if(datas.get(i).equals(gu)) {
					flag=true;
					break;
				}   
			}
			if(flag) {
				break;
			}
		}
		return gu;
	}

	///////////////////////////////////////////////////////////////////////////////////
	// 일정 동 입력 로직
	public String dong(ArrayList<String>datas) {

		String dong;
		boolean flag=false;
		System.out.println(datas);
		//유효성검사
		while(true) {
			System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 동 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
			System.out.print("   :::   ");
			dong=sc.next();
			for(int i=0;i<datas.size();i++) {
				if(datas.get(i).equals(dong)) {
					flag=true;
					break;
				}   
			}
			if(flag) {
				break;
			}
		}		
		return dong;
	}
	//-----------------------------------------------------------------
	//연도 입력 로직
	public int year() {
		LocalDate now = LocalDate.now();
		int year;
		int nowyear = now.getYear();//현재 연도
		while(true) {
			System.out.println();
			System.out.println("날씨정보는 10일 까지만 표시됩니다. : D");
			System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 연도 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
			System.out.print("   :::   ");
			try{
				year=sc.nextInt();
			}catch(Exception e){
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("✖︎ ✖︎  입력하신 연도를 다시 확인해주세요!  ✖ ︎✖");
				continue;
			}
			if(year<nowyear) { //현재 연보다 작을경우 컨티뉴
				System.out.println("✖︎ ✖︎  입력하신 연도를 다시 확인해주세요!  ✖ ︎✖");
				continue;
			}
			break;
		}
		return year;
	}
	///////////////////////////////////////////////////////////
	/// 일정 월 입력 로직
	public int mon(int year) {
		LocalDate now = LocalDate.now();
		int mon;
		while(true) {
			System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 월 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
			System.out.print("   :::   ");
			try {
				mon=sc.nextInt();
			}catch (Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("✖︎ ✖︎  입력하신 월을 다시 확인해주세요!  ✖ ︎✖");
				continue;
			}
			if(mon<1 || mon>12 ) {
				System.out.println("✖︎ ✖︎  입력하신 월을 다시 확인해주세요!  ✖ ︎✖");
				continue;            
			}
			if(year==now.getYear()) {
				//현재 월보다작으면 과거이니 다시입력.
				if(mon<now.getMonthValue()) {
					System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다..✖︎ ✖︎");
					continue;
				}
			}
			break;
		}
		return mon;
	}

	///////////////////////////////////////////////////////////////////////////////////
	// 일정 일 입력 로직
	public int day(int year,int mon) {
		LocalDate now = LocalDate.now();
		int day;
		while(true) {
			System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 일 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
			System.out.print("   :::   ");
			try {
				day=sc.nextInt();
			}catch (Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("✖︎ ✖︎  입력하신 일을 다시 확인해주세요!  ✖ ︎✖");
				continue;
			}
			if(mon==1 || mon==3|| mon==5 || mon==7 || mon==8 || mon==10 || mon==12  ) {
				if(day<1 || day>31) {
					System.out.println("✖︎ ✖︎  입력하신 일을 다시 확인해주세요!  ✖ ︎✖");
					continue;
				}
				if(year==now.getYear() && mon==now.getMonthValue()&& day<now.getDayOfMonth()) {
					System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다.. ✖︎ ✖︎");
					continue;					
				}
				else {
					break;
				}
			}
			else if(mon==4 || mon==6 || mon==9 || mon==11) {
				if(day<1 || day>30) {
					System.out.println("✖︎ ✖︎  입력하신 일을 다시 확인해주세요!  ✖ ︎✖");
					continue;
				}
				if(year==now.getYear() && mon==now.getMonthValue()&& day<now.getDayOfMonth()) {
					System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다.. ✖︎ ✖︎");
					continue;					
				}
				else {
					break;
				}
			}
			else if(mon==2) {
				if(day<1 || day>29) {
					System.out.println("✖︎ ✖︎  입력하신 일을 다시 확인해주세요!  ✖ ︎✖");
					continue;
				}
				if(year==now.getYear() && mon==now.getMonthValue()&& day<now.getDayOfMonth()) {
					System.out.println("✖︎ ✖︎ 지나간 시간은 다시 되돌릴 수 없습니다.. ✖︎ ✖︎");
					continue;					
				}
				else {
					break;
				}
			}
		}
		return day;
	}

	////////////////////////////////////////////////////
	/// 일정 입력 로직
	public String diary() {
		System.out.println();

		System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 일정 메모 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
		System.out.print("   :::   ");
		sc.nextLine();
		String dia= sc.nextLine();
		return dia;
	}
	////////////////////일정 등록 성공로직
	//---------------------------------------------------------------------------------
	public void scheduleTrue() { // 
		System.out.println();
		System.out.println("일정이 등록되었습니다! : D");
	}
	//////////////////////////////////////
	/// 일정 삭제 로직
	public int deleteNum(ArrayList<ScheduleVO> datas) {//인자필요 일정객체배열리스트
		int num;
		while(true) {
			System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 삭제 일정 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
			System.out.print("   :::   ");
			try {
				num = sc.nextInt();
			} catch (Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("✖︎ ✖︎  삭제하실 일정을 다시 확인해주세요!  ✖ ︎✖");
				continue;
			}
			if(num<1 || num>datas.size()) {
				System.out.println("✖︎ ✖︎  삭제하실 일정을 다시 확인해주세요!  ✖ ︎✖");
				continue;
			}
			break;
		}
		//실질적인 데이터의 pk값 대입
		int pk=datas.get(num-1).getpNum();
		return pk;
	}

	/////////////////////////////////////////////////////////////////////////////////
	//// 강수량, 기온정보로 이모지 설정로직
	public String getEmoji(int rain, String temp) { // 강수량이랑 기온을 인자로 받음. 기온에 따라 눈과 비를 표시해줌
		String emoji = "";
		if(rain<=0) { 
			emoji= "☀︎";
		}
		else if(rain<=60) {
			emoji="☁";
		}
		else { // 최저기온+숫자+도씨 
			ArrayList<String> alTemp_ = new ArrayList<>(Arrays.asList(temp.split("기온"))); // "기온"을 기준으로 자름: "최저" 0인덱스,"숫자+도씨"가 1번인덱스
			ArrayList<String> alTemp = new ArrayList<>(Arrays.asList(alTemp_.get(1).split("°"))); // 1번인덱스에서 도씨로 자름 => String "숫자"만 남음
			int intTemp = Integer.parseInt(alTemp.get(0)); // String "숫자"를 int로 변환
			if(intTemp > 0) {
				emoji="☂︎";
			}
			else { 
				emoji="☃︎";
			}
		}
		return emoji; 
	}
	/////////////////////////////////////////////////////////////////////
	//////////// 관리자 일정 출력 
	public boolean adminselectAll(ArrayList<ScheduleVO> datas) {
		if(datas.isEmpty()) {
			System.out.println("아직 일정이 없습니다.");
			return false;
		}
		/*전체 출력*/
		for(int i=0;i<datas.size();i++) {

			if(!datas.get(i).getLowTemperature().isEmpty()) {

				if(datas.get(i).getAmRainfall().isEmpty()) {
					datas.get(i).setAmRainfall("0");
				}
				if(datas.get(i).getPmRainfall().isEmpty()) {
					datas.get(i).setPmRainfall("0");
				}

				ArrayList<String> amList = new ArrayList<>(Arrays.asList(datas.get(i).getAmRainfall().split("%")));
				ArrayList<String> pmList = new ArrayList<>(Arrays.asList(datas.get(i).getPmRainfall().split("%")));
				int amRain=Integer.parseInt(amList.get(0));
				int pmRain=Integer.parseInt(pmList.get(0));
				String amEmoji = getEmoji(amRain, datas.get(i).getLowTemperature());
				String pmEmoji = getEmoji(pmRain, datas.get(i).getLowTemperature());


				//i. 월/일 어디어디어디어디 일정 날씨
				System.out.println((i+1)+". [ "+datas.get(i).getID()+"  /  "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ] \n     " +datas.get(i).getGu()+" "+datas.get(i).getDong()+"\n     "
						+datas.get(i).getLowTemperature()+" / "+datas.get(i).getHighTemperature()+"  오전:"+amEmoji+ "  오후:"+pmEmoji+"\n     📄 "+datas.get(i).getMemo() + " ⌟ ");
				System.out.println();
			}
			else {
				System.out.println((i+1)+".  [ "+datas.get(i).getID()+"  /  "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ]"+" \n      📄"+datas.get(i).getMemo()+" ⌟\n      제공되는 날씨 정보 없음");
				System.out.println();			}         
		}
		return true;
	}
	//////////////////////////////////////////////////////////////////
	/////회원 일정 전체출력
	public boolean selectAll(ArrayList<ScheduleVO> datas) {
		if(datas.isEmpty()) { // 일정이 없을때
			System.out.println("아직 일정이 없습니다.");
			return false;
		}
		/*전체 출력*/
		for(int i=0;i<datas.size();i++) {

			if(!datas.get(i).getLowTemperature().isEmpty()) { // 최저기온이 비어있지않다면(날씨정보가 있다면)

				if(datas.get(i).getAmRainfall().isEmpty()) { // 오전강수량이 비어있다면
					datas.get(i).setAmRainfall("0"); // 0으로 나오게 세팅
				}
				if(datas.get(i).getPmRainfall().isEmpty()) { // 오후강수량이 비어있다면
					datas.get(i).setPmRainfall("0"); // 0으로 나오게 세팅
				}
				// 이모지출력을 위한 코드 - 강수량만                                         (  예를들어 80% -> %기준으로 자른다)
				ArrayList<String> amList = new ArrayList<>(Arrays.asList(datas.get(i).getAmRainfall().split("%"))); // ArryList안에 String80
				// String값인 미니레인풀을 %기준으로 스플릿하여 배열리스트에저장
				ArrayList<String> pmList = new ArrayList<>(Arrays.asList(datas.get(i).getPmRainfall().split("%")));
				
				int amRain=Integer.parseInt(amList.get(0)); // int80 으로 바꿔줌
				int pmRain=Integer.parseInt(pmList.get(0)); 
				
				String amEmoji = getEmoji(amRain, datas.get(i).getLowTemperature()); // (80, 최저기온)인자로 넘겨줌
				String pmEmoji = getEmoji(pmRain, datas.get(i).getLowTemperature()); 


				//i. 월/일 어디어디어디어디 일정 날씨
				System.out.println((i+1)+". [ "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ] \n     " +datas.get(i).getGu()+" "+datas.get(i).getDong()+"\n     "
						+datas.get(i).getLowTemperature()+" / "+datas.get(i).getHighTemperature()+"  오전:"+amEmoji+ "  오후:"+pmEmoji+"\n     📄 "+datas.get(i).getMemo() + " ⌟ ");
				System.out.println();
			}
			else {
				System.out.println((i+1)+".  [ "+datas.get(i).getMonth() +"월"+datas.get(i).getDay()+"일 ]"+" \n      📄"+datas.get(i).getMemo()+" ⌟\n      제공되는 날씨 정보 없음");
				System.out.println();
			}         
		}
		return true;
	}

	///////////////////////////////////////////////////////////////////////////////
	//// 변경할 일정 변경 로직
	public ScheduleVO changeDiary(ArrayList<ScheduleVO>datas) { 
		System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
		System.out.println("변경하실 일정번호를 입력해주세요");
		System.out.print("입력 : ");
		int pknum;
		while(true) {
			int len;         
			len=datas.size();
			try {
				pknum = sc.nextInt();
			} catch (Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("번호를 다시한번 확인해주세요.");
				continue;
			}
			if(pknum<1 || pknum>len) {
				System.out.println("번호를 다시한번 확인해주세요.");
				continue;
			}
			break;
		}
		ScheduleVO svo=new ScheduleVO(); 
		//실질적인 데이터의 pk값 대입 
		int pk=datas.get(pknum-1).getpNum();

		int num;
		while(true) {
			System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
			System.out.println("1.메모변경 2.날짜변경");
			try {
				num = sc.nextInt();
			} catch (Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("번호를 다시한번 확인해주세요.");
				continue;
			}
			if(num<1 || num>2) {
				System.out.println("번호를 다시한번 확인해주세요.");
				continue;
			}
			break;
		}
		if(num == 1) {
			System.out.println("변경하실 일정메모를 입력해 주세요");
			sc.nextLine();
			String dia=sc.nextLine();
			//객체에 pk번호 세트
			svo.setpNum(pk);
			//객체에 새로운 일정세트
			svo.setMemo(dia);;
		}
		else if(num == 2){
			svo.setYear(year());
			svo.setMonth(mon(svo.getYear()));
			svo.setDay(day(svo.getYear(), svo.getMonth()));
			svo.setDong(datas.get(pknum-1).getDong()); 
			// 일정변경할때 그 일정의 위치를 그대로 가져와서 날씨정보를 다시 검색하기위해서(크롤링하기위해서!)
			svo.setpNum(pk);
		}
		return svo;
	}

//	public boolean deleteDiary() { // 이건 어디있나요
//		System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 삭제 [Y/N]  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
//		System.out.print("   :::   ");
//		String ans=sc.next();
//		if(ans.equalsIgnoreCase("Y")) {
//			return true;
//		}
//		return false;
//	}

	//-----------------------------------------------------------------------------------------------------------
	// 회원 탈퇴 로직
	public boolean getCheck(MemberVO vo) {
		while(true) {
			System.out.println(vo.getName()+"님, 정말 탈퇴하시겠습니까? [Y/N]");
			String ans = sc.next();
			if(ans.equalsIgnoreCase("Y")) {
				return true;
			}
			else if(ans.equalsIgnoreCase("N")) {
				return false;
			}
		}
	}
	//-----------------------------------------------------------------------------------------------------------
	// 회원 변경 로직
	public MemberVO updateMember(MemberVO vo) {
		int num;
		System.out.println();System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ 회원 변경 입력  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");

		while(true){
			System.out.println("1.  비밀번호");
			System.out.println("2.  이름");
			System.out.print("   :::   ");
			try {
				num=sc.nextInt();
			} catch (Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("✖︎ ✖︎ 번호를 다시 확인해주세요!  ✖ ︎✖"); 
				System.out.print("   :::   ");           
				continue;
			}
			if(num<1 || num>2) {
				System.out.println("✖︎ ✖︎ 번호를 다시 확인해주세요!  ✖ ︎✖"); 
				System.out.print("   :::   ");          
				continue;
			}
			break;
		}

		if(num==1) {
			System.out.println("새로운 비밀번호를 입력해주세요.");
			String pw=sc.next();
			vo.setPw(pw);
		}
		else {
			System.out.println("새로운 이름을 입력해주세요.");
			String nm=sc.next();
			vo.setName(nm);
		}

		return vo;
	}


	//--------------------------------------------------------------------------------------------
	// 일정변경 성공
	public void scheduleChangeTrue() {
		System.out.println("일정을 변경 완료하였습니다 :D");
	}
	//--------------------------------------------------------------------------------------------
	// 일정변경 실패
	public void scheduleChangeFalse() {
		System.out.println("✖︎ ✖︎ 일정이 변경되지 않았습니다!  ✖ ︎✖");
	}
	//--------------------------------------------------------------------------------------------
	// 회원정보변경 성공
	public void memberChangeTrue() {
		System.out.println("회원 정보가 변경되었습니다.");
	}
	//--------------------------------------------------------------------------------------------
	// 회원정보변경 실패
	public void memberChangeFalse() {
		System.out.println("✖︎ ✖︎ 회원정보가 변경되지 않았습니다!  ✖ ︎✖");
	}
	//--------------------------------------------------------------------------------------------
	// 일정 삭제 성공
	public void scheduleDeleteTrue() {
		System.out.println("일정이 삭제되었습니다.");
	}
	//--------------------------------------------------------------------------------------------
	// 일정 삭제 실패
	public void scheduleDeleteFalse() {
		System.out.println("✖︎ ✖ 일정이 삭제되지않았습니다. ✖︎ ✖");
	}
	//--------------------------------------------------------------------------------------------
	// 회원 탈퇴성공
	public void memberDeleteTrue() {
		System.out.println("회원탈퇴에 성공했습니다.");
		System.out.println("다음에 다시 만나요 :D");
	}

	//----------------------------------------------------------------------------------------
	// 회원탈퇴 실패
	public void memberDeleteFalse() {
		System.out.println("✖︎ ✖ 회원탈퇴에 실패하였습니다. ✖︎ ✖");
	}
	//---------------------------------------------------------------------------------
	// 관리자 메뉴
	public int adminMenu() {  //로그인후 회원 메뉴 출력
		int act;
		while(true) {
			try {
				System.out.println();
				System.out.println("⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯  관리자 메뉴  ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯");
				System.out.println("1. 일정출력");
				System.out.println("2. 일정삭제");
				System.out.println("3. 로그아웃");
				System.out.print("   :::   ");
				act = sc.nextInt();
			} catch(Exception e) {
				sc.nextLine(); //에러값을 먹어준다
				System.out.println("✖︎ ✖︎  입력 범위로 입력해주세요!  ✖ ︎✖︎");
				continue;
			}
			if(1<=act && act <=3) {
				break;
			}
			System.out.println("✖︎ ✖︎  입력 범위로 입력해주세요!  ✖ ︎✖︎");
		}
		return act;
	}




}
Comments