KIC 캠퍼스 1차 Toy Project

김용진·2023년 7월 27일
0

프로젝트

목록 보기
1/2

  • 이번 캠퍼스 기간동안 여러 프로젝트를 진행할 예정이고, 첫 프로젝트로 개인프로젝트를 진행하게 되어 제가 한것을 올려보고자 합니다.

    1. 목차

    첫 번째, 목표입니다 프로젝트를 시작하기에 앞서 주제를 정하고 어떤 방향으로 코드를 짜나갈지 고민한것을 나타냈습니다.
    두 번째, 알고리즘입니다. 정한 주제를 어떤 방식으로 풀어 나갈지 간략화 하여 나타냈습니다.
    세 번째 코드 리뷰입니다. 이곳에서는 제가 짠 코드를 간단하게 보여주는 단락입니다.
    네 번째와 다섯 번째는 결과를 나타내고, 제가 느낀바를 적어보았습니다.

    2. 목표

    이 프로젝트에서 제가 목표로 둔것은 세가지입니다.
    일상 생활에서 흔하게 볼 수있는것하기, 강의동안 배운것을 중점으로 하기, 코드를 간단하게 만들기.
    여기서 일상 생활에서 흔하게 볼 수 있는것하기가 의외로 보실 수 있는데, 이것을 목표로 둔 이유는 제가 아직 배운것이 많지 않고,
    활용도가 높지 않은 단계에서 무언가를 새로 창조한다는것이 얼마나 욕심인지를 알기때문에, 주변에 있는것을 만들어 보자는 취지를 가지고 목표로 정하였습니다.

    3. 알고리즘

    모르는 사람들이 봐도 알기쉽도록 하는걸 목표로 만들어 보았습니다.

    4. Code Review

    진행하다보니 1개의 메인클래스(Toyproject)와 2개의 인스턴스클래스(Ticket, WaitList)를 만들어
    총 3개의 클래스파일로 이루어진 패키지를 완성했습니다.

    메인클래스 구성

    시간을 나타내기위한 캘린더를 사용하였습니다.

    	Calendar cal = Calendar.getInstance();
    	int yy = cal.get(Calendar.YEAR);
    	int mm = cal.get(Calendar.MONTH)+1;
    	int dd = cal.get(Calendar.DAY_OF_MONTH);
    	int hh = cal.get(Calendar.HOUR_OF_DAY);
    	int mi = cal.get(Calendar.MINUTE);
    

    이후 계속 반복을 진행하도록 while문을 사용하여 무한루프로 만들고, 원치 않을 경우 반복문을 빠져나오도록 코딩했습니다.

    if("A".equals(sel) || "a".equals(sel)) {
    				Tiketing.WaitNo(A);
    				WList.List(A);
    				A++;
    			}
    			else if("B".equals(sel) || "b".equals(sel)) {
    				Tiketing.WaitNo(B+1000);
    				WList.List(B+1000);
    				B++;
    			}
    			else if("C".equals(sel) || "c".equals(sel)) {
    				Tiketing.WaitNo(C+2000);
    				WList.List(C+2000);
    				C++;
    			}
    			
    			else{
    				System.out.println("잘못 누르셨습니다.");
    				System.out.println("다시 시작할까요? Y/N : ");
    				sel_re = scanner.next();
    			
    				if(sel_re.equals("N") || sel_re.equals("n")) {
    				System.out.println("번호뽑기를 중지합니다.");
    				re = false;
    					}
    				else {
    					continue;
    					}
    				
    				}

    해당 코딩을 하면서 처음에는 A,B,C만 if문으로 만들면 되지 않을까?? 하고 만들었지만, 사용자 입장에서 대,소문자를 구분없이 사용할 것이라 생각하여 2가지 경우를 고려했습니다. 이후에 생각한건 ToUpperCase()를 사용했더라면 저렇게 두번 선언할 필요가 없지않았을까? 라고 생각 합니다.


    인스턴스 클래스

    대기표를 출력하는 클래스와 현 대기상황을 출력하는 클래스 두가지를 만들었으며, 이렇게 두개의 클래스로 나눈 의미는

    • 첫번째, 혹여나 모르는사람이 수정할때 용이하도록 하기위함이였습니다.
    • 두번째, 선택지를 고르면 그 안에서 동일한 코드를 계속 반복 사용해야하는데 그렇게 되면 불필요하게 길어졌습니다. 따라서 따로 클래스를 만들어 코드 한줄로 간단하게 만들고 싶었습니다.
    • 지금까지 배운 강의 내용에서 싱글톤을 사용한 클래스 캡슐화를 사용한것, 안한것 구분지어서 만들어 보고 싶었습니다. 가능한 많은 기능을 다시 해보기 위함이였습니다.

    Ticekt.Class

    Ticket쪽은 먼저 생성자를 Private로 은닉하여 싱글톤을 선언하도록 만들었습니다.

    private static Ticket current;
    	
    	public static Ticket getInstance(){
    		if(current == null)
    		{
    			current = new Ticket();
    		}
    			return current;
    	}
    	
    	private  Ticket() {
    		
    	}
        
        public int WaitNo(int No){
    		Calendar cal = Calendar.getInstance();
    		
    		int hh = cal.get(Calendar.HOUR_OF_DAY);
    		int mi = cal.get(Calendar.MINUTE);
    		//번호표 뽑기
    		System.out.printf("\n\n\n\n\n\n");
    		System.out.printf("%04d\n",No);
    		System.out.printf("\n");
    		System.out.printf("%02d시 %02d분\n",hh,mi);
    		System.out.println("\n\n3초 후 초기화면으로 돌아감니다.");
    		try {
    			Thread.sleep(3000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println("");
    		System.out.println("");
    		System.out.println("");
    		System.out.println("");
    		System.out.println("");
    		return No;
    	}

    실제 은행을 가보게 되면 2~30대보다 어르신들이 더 많이 계시는걸 알 수 있습니다. 그런 소비자의 연령대를 고려하여 표가 나오면 바로 넘어가는 대신, Thread클래스의 sleep메서드를 이용하여 3초의 여유를 주도록 만들었습니다.

    package personalProject;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class WaitList {
    	List<Integer> Board_a = new ArrayList<Integer>();
    	List<Integer> Board_b = new ArrayList<Integer>();
    	List<Integer> Board_c = new ArrayList<Integer>();
    	
    
    
    	public List<Integer> getBoard_a() {
    		return Board_a;
    	}
    
    
    
    	public void setBoard_a(List<Integer> board_a) {
    		Board_a = board_a;
    	}
    
    
    
    	public List<Integer> getBoard_b() {
    		return Board_b;
    	}
    
    
    
    	public void setBoard_b(List<Integer> board_b) {
    		Board_b = board_b;
    	}
    
    
    
    	public List<Integer> getBoard_c() {
    		return Board_c;
    	}
    
    
    
    	public void setBoard_c(List<Integer> board_c) {
    		Board_c = board_c;
    	}
    
    
    
    	void List(int x) {
    		
    		int count_a,count_b,count_c;
    		
    		
    		
    		//현황판 만들기
    	
    		if (x>=0 && x<1000) {
    			getBoard_a().add(x);
    		}else if (x>=1000 && x<2000) {
    			getBoard_b().add(x);
    		}else {
    			getBoard_c().add(x);
    		}
    		
    		count_a = Board_a.size();
    		count_b = Board_b.size();
    		count_c = Board_c.size();
    
    		System.out.println("창구별 현 대기 상황");
    		System.out.println("---------------------------------");
    		System.out.print("A 창구\n");
    		for(int i=0;i<count_a;i++) {
    			System.out.printf("%04d, ",Board_a.get(i));
    		}
    		System.out.println();
    		System.out.println("---------------------------------");
    		System.out.print("B 창구\n");
    		for(int i=0;i<count_b;i++) {
    			System.out.printf("%04d, ",Board_b.get(i));
    		}
    		System.out.println();
    		System.out.println("---------------------------------");
    		System.out.print("C 창구\n");
    		for(int i=0;i<count_c;i++) {
    			System.out.printf("%04d, ",Board_c.get(i));
    		}
    		System.out.println();
    		System.out.println("---------------------------------");
    		
    	}
    }
    

    WaitList Class

    대기 현황판을 위한 클래스입니다. 당시 Toarray가 현황판을 나타나게하는것에 제일 최적화라고 생각되어 메서드에 번호표 파라미터를 선언해주면 그 값을 판단하여 값을 저장하도록 만들었습니다.

    발표가 지속되면서 중간 중간 코드가 에러가 떠서 중지가 되는 사례가 몇번 일어났습니다. 그러고나서 저의 코드를 보다보니
    '난 무슨 자신감으로 예외처리 구문을 넣지 않은것이지? 코드에 자신감이있나?' 란 생각이 들었습니다.
    개발자로서 항상 예외상황이 올 수 있다는것을 인지해야한다는걸 새삼스래 깨닫게 된것같습니다.
    만약 현재 코드에 추가한다면 try~catch를 이용하여 비정상적인 종료를 막아줄것같습니다.

    5. 결과

    초기화면에서는 시간과, 원하는 업무를 물어보도록 나옴니다.
    여기서 선택지를 고르면 출력시간과 대기번호를 상단에 띄우고 대기시간3초를 기다림니다.
    이후 창구별 대기상황에 뽑은 표를 띄우고 다시 반복을 합니다.

    아무래도 키오스크같이 터치를 하거나, 버튼을 누르지 않고 값을 직접 입력하다보니 다른값을 넣는 경우가 있습니다.
    그래서 다른값을 넣게되면 재확인을 물어보고, 다시 시작하기를 원하지 않거나, 다른값을 넣을경우 종료하도록 만들었습니다.

    6. 고찰

    저는 두가지 궁금증을 나타내보았습니다. 이외에도 내가 좀 더 코드를 간략화 할수 있지않았을까? 내가 짠 방식이 정말 최선일까? 하는 의구심이 계속 들었고, 왜 벨로그나 개발자 티스토리에서 많은사람들과 코드를 공유해라, 많이 의견을 주고 받아라 한것이 새삼 깨닫게 되었습니다.
    그리고 정말 ptt를 못꾸민다고 생각했습니다. 공대생이라그런가...

  • profile
    메모리폼

    0개의 댓글