잡동사니에도 사랑을

[21.08.19]Ch.10 성적관리 프로그램 만들기1 (Main, DTO, Service) 본문

JAVA_SE/09_collection

[21.08.19]Ch.10 성적관리 프로그램 만들기1 (Main, DTO, Service)

luvforjunk 2021. 8. 24. 23:00
728x90
반응형

 

[문제 - 성적관리 프로그램]

 

<조건>

1. 번호, 이름, 국어, 영어, 수학점수를 입력하여 총점과 평균을 구하시오.
2. 각 기능에 따라 3개의 클래스로 나누어 작성하시오.
   SungJukDTO.java
   SungJukService.java
   SungJukMain.java
3. 평균은 소수 이하 2째자리까지 출력.
   소수 이하 자리값이 0이면 출력하지 않는다. ex) 92.000 → 92
4. 번호는 중복되지 않게 입력한다.
5. 이름은 중복되어도 된다. (똑같은 이름을 입력하세요)
6. Comparable / Comparator 이용.
7. SungJukDTO에서 toString( )을 Override하시오.

 

<결과값>

menu( )
*****************
   1. 입력
   2. 출력
   3. 검색
   4. 삭제
   5. 정렬
   6. 끝
*****************
   번호 : 
1~6중에 선택하세요

insertArticle( )
번호 입력 :
이름 입력 :
국어 입력 :
영어 입력 :
수학 입력 :

등록 완료

printArticle( )
번호      이름      국어      영어      수학      총점      평균
15      홍길동        90         92        91        xxx      xx.xx
30      또치           85         92       100       xxx      xx.xx

searchArticle( )
검색 할 이름 입력 : 코난
찾고자 하는 이름이 없습니다

검색 할 이름 입력 : 홍길동
번호      이름      국어      영어      수학      총점      평균
15      홍길동        90         92         91      xxx      xx.xx
16      홍길동        89         45         78      xxx      xx.xx

deleteArticle( ) - 똑같은 이름이 있으면 모두 삭제
삭제 할 이름 입력 : 홍길동
데이터를 삭제하였습니다

sortArticle( )
1. 이름으로 오름차순
2. 총점으로 내림차순
3. 이전메뉴
번호 입력 : 

-----------------------------------------------------------------------------------------------------------

////////SungJukMain

package collection;                                

public class SungJukMain {
	public static void main(String[ ] args) {
		//List 처리
		SungJukService service = new SungJukService( );

		service.menu( );     

		System.out.println("프로그램을 종료합니다");
	}
}

 

////////SungJukService

 

package collection;

import java.util.*;

public class SungJukService {
	Scanner scan = new Scanner(System.in);

	private List<SungJukDTO> list; // 부모를 List로 설정해놓고 생성자는 ArrayList

 

여기서 잠깐!

List 컬렉션에 대해 다시 한번 정리해보자면!

List컬렉션은 저장 용량이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여된다.

객체를 저장할 때는 add( )메소드, 객체를 찾아올 때는 get( )메소드, 그리고 삭제는 remove( )메소드를 사용한다.

ArrayList는 List 인터페이스의 가장 대표적인 구현 클래스인데,

ArryList에서 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.

마찬가지로 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려난다.

.

.

.

       

 //----------------------------중략------------------
 
 public SungJukService( ) {

                  list = new ArrayList<SungJukDTO>( ); 

         }

         public void menu( ) {
			int num;
			
            while (true) {
				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("*****************");
				System.out.print("      번호 : ");
					num = scan.nextInt( );
					
                    if (num == 6)
						break;
					if (num == 1)
						insertArticle( );
					else if (num == 2)
						printArticle( );
					else if (num == 3)
						searchArticle( );
					else if (num == 4)
						deleteArticle( );
					else if (num == 5)
						sortArticle( );
					else
						System.out.println("1~6중에 선택하세요");

                  } // while
         } // menu
 
         public void sortArticle( ) { // -------------------sortArticle( )
                  int num;

                  while (true) {
                           System.out.println("1. 이름으로 오름차순");
                           System.out.println("2. 총점으로 내림차순");
                           System.out.println("3. 이전메뉴");
                           System.out.print("번호 입력 : ");
                           num = scan.nextInt( );

                           if (num == 3)
                                   break;
                           // 이름으로 오름차순
                           if (num == 1) {
//                         // interface라 뉴가 안되니 익명 설정해주기
//                         Comparator<SungJukDTO> com = new Comparator<SungJukDTO>( ) {

//                                 @Override
//                                 public int compare(SungJukDTO dto1, SungJukDTO dto2) {
//                                          return dto1.getName( ).compareTo(dto2.getName( ));
//                                          //문자열과 문자열의 크기 비교가 불가하므로 compareTo가 그 역할을 대신한다
//                                 }
//                         };
//                 Collections.sort(list, com); // 객체 전체를 움직여주는 역할을 함. 총점만 바뀌는 것이 아님.
//                          printArticle();

                                   Collections.sort(list);

                                   printArticle( );
                                   // DTO에서 이미 CompareTo 다 잡아놨으니 위 Comparator는 없어도 됨.
                                   // Comparable은 클래스에다 implements해서 자체적으로 기준점을 잡아주고,
                                   // Comparator은 직접 기준점을 잡는다

                                   // 총점으로 내림차순
                           } else if (num == 2) {
                                   Comparator<SungJukDTO> com = new Comparator<SungJukDTO>( ) {
                                   
                                            @Override
                                            public int compare(SungJukDTO dto1, SungJukDTO dto2) {
                                                     // 조건연산자 : 조건 ? 참 : 거짓;
                                                     // return dto1.getTot( ) > dto2.getTot( ) ? 1 : -1; - 오름차순
                                                     return dto1.getTot( ) > dto2.getTot( ) ? -1 : 1;
                                            }
                                   };
                                   Collections.sort(list, com);
                                   printArticle( );
                           }
                  } // while
         } // sortArticle( )

         public void deleteArticle( ) {// -------------------deleteArticle( )***
                  System.out.println( );
                  System.out.print("삭제할 이름 입력 : ");
                  String name = scan.next( );
                  int sw = 0; // 변수 설정

//                for(int i =0; i<list.size(); i++) {
//                         if(list.get(i).getName().equals(name)) {
//                                 list.remove(list.get(i));
//                                 sw =1;
//                         }
//                }
//                list size가 계속 움직이면서 번호가 같이 움직여버려 에러가 남


                  Iterator<SungJukDTO> it = list.iterator( ); // 생성 - 반복해서 가져올 객체가 SungJukDTO

                  while (it.hasNext()) { // it값이 있습니까? 항목이 있으면 T, 없으면 F (hasnext는 데이터가 있다 없다만 판단)

                           SungJukDTO dto = it.next( );
                  // 항목을 꺼내서 dto에게 전달, 다음으로 이동(next는 항목을 꺼내고 전달한 뒤 다음으로 이동하는 것 까지)

                           if (dto.getName( ).equals(name)) {
                                   it.remove( ); // it가 가리키는 현재 위치를 지우는 것이 아닌 dto에 보관한 내용 삭제
                                   sw = 1;
                           } // if
                  } // while

                  if (sw == 0) // 변수에 변화가 없으면
                           System.out.println("찾고자 하는 이름이 없습니다");
                  else // 변수 변화가 있으면
                           System.out.println("데이터를 삭제하였습니다");
         } // deleteArticle( )

         public void searchArticle( ) { // -------------------searchArticle( )
                  System.out.println( );
                  System.out.print("검색 할 이름 입력 : ");
                  String Name = scan.next( );

                  int sw = 0; // 1번 - 변수를 잡는다(for문으로 전 데이터 돌기)

                  for (SungJukDTO dto : list) {
                           if (Name.equals(dto.getName( ))) { // 검색한 이름과 같은 이름을 찾으면
                                   if (sw == 0) // 0부터 시작해서 처음엔 0, 그 다음에 1 이렇게 찍히고

                                            // 0일때는 딱 한번밖에 안나오니 이름도 한번밖에 안찍힘

                                            System.out.println("번호\t이름\t국어\t영어\t수학\t총점\t평균");
                                   System.out.println(dto); // 2번 - 데이터를 찍고
                                   
                                   sw = 1; // 3번 - 뭔가를 찍고 나니 변수가 0에서 1로
//                      &n
728x90
반응형