yoni

[24][IO] trim() 메소드, 급여 처리 시스템 제작, StringTokenizer class의 사용 ★ 본문

java of educational by contents

[24][IO] trim() 메소드, 급여 처리 시스템 제작, StringTokenizer class의 사용 ★

yoni-1117 2018. 12. 8. 17:41

[과제 3] 아르바이트 급여 처리 시스템


1. 데이터 파일

▷ C:/작업 기준폴더/io/alba.csv(CSV 파일)
     - 데이터 구조: 성명, 근무시간, 근무유형
-----------------------------------------------------------------------------------

아로미,50     ,A
왕눈이,60,B
홍길순,70,B
가길동,50,A
나길동,80,A
-----------------------------------------------------------------------------------



2. 데이터 파일 처리 결과 파일, 자동 생성
- 시간당: 7,530 원
- 기본급: 근무 시간 * 7530
- 70 ~ 79 시간 근무: 초과 수당 50,000 추가 지급
- 80시간 이상 근무: 초과 수당 100,000 추가 지급
- 근무 유형 A: 주간, 추가 지급 없음
- 근무 유형 B: 야간, 100,000 추가 지급
- 총금액: 기본급 + 초과 수당 + 야간 수당
 
▷ C:/작업 기준 폴더/backup/alba_proc.txt
-----------------------------------------------------------------------------------

성명: 아로미
근무시간: 50
근무유형: A
기본급: 376,500 원
초과 수당: 0 원
야간 수당: 0 원
총금액: 376,500 원
-------------------------------
성명: 왕눈이
근무시간: 60
근무유형: B
기본급: 451,800 원
초과 수당: 0 원
야간 수당: 100,000 원
총금액: 551,800 원
-------------------------------
.....

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

 
 
3. 처리 클래스

   - split() 메소드 이용
   - 천단위 구분기호 출력
     DecimalFormat df = new DecimalFormat("#,###,### 원");
     String basic = df.format(1800000);
   - trim(): 문자열의 처음과 시작 부분의 공백을 제거함.
              정수로 변환시 문자열에 공백이 존재하면
              Integer.parseInt(args[2]) 메소드가 Exceptioin을 발생함,
              숫자형 데이터에는 trim() 메소드 사용을 권장함.
              예) "    ABC    ".trim() → "ABC"  


 

▷ oop3.AlbaProc.java(MapleProc.java를 복사하여 사용합니다.)
-----------------------------------------------------------------------------------

package oop3;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
 
public class AlbaProc {
 
  public static void main(String[] args) {
    File src = new File("C:/201812_java/io/alba.csv");
    File dest = new File("C:/201812_java/io/alba_proc.txt");
    
    // File -> FileReader -> BufferedReader
    FileReader reader = null;   // 파일 읽기
    BufferedReader br = null; // 읽은 내용을 메모리에 저장
 
    // PrintWriter -> FileWriter -> File
    FileWriter writer = null;    // 파일에 기록
    PrintWriter pw = null;      // 메모리에 기록
    
    try {
      reader = new FileReader(src);      // Call By Reference, 해시코드 전달
      br = new BufferedReader(reader); // Call By Reference, 해시코드 전달
      
      // false: 기존 내용을 지우고 기록, true: 파일 하단에 추가
      writer = new FileWriter(dest, false);  
      pw = new PrintWriter(writer);
      
      while(true) {
        String line = br.readLine(); // 내장산,2016-11-10,50000,4,0
        if (line == null) { // 파일 마지막인지 검사
          break; // while 탈출
        } else {
          System.out.println(line); // 화면 출력
          
/*
성명: 아로미
근무 시간: 50 시간
근무 유형: 주간
기본급: 376,500 원
초과 수당: 0 원      
야간 수당: 0 원
총금액: 376,500 원
 
아로미,50     ,A
*/
          String[] values = line.split(",");
          
          String name = values[0].trim(); // 성명
          int time = Integer.parseInt(values[1].trim()); // 근무 시간
          String type = values[2].trim(); // 타입
          
          int basic = time * 7530;
          
          // 초과 수당
          int over_time = 0;
          if (time >= 70 && time <= 79) {
            over_time = 50000;
          } else if (time >= 80) {
            over_time = 100000;
          }
          
          // 야간 수당
          int night = 0;
          if (type.equals("B")) {
            night = 100000;
          }
          
          int total = basic + over_time + night;
          
          DecimalFormat df = new DecimalFormat("#,###,### 원");
          
          pw.println("성명: " + name);  // 파일 기록
          pw.println("근무시간: " + time);
          pw.println("근무유형: " + type); 
          pw.println("기본급: " + df.format(basic));
          pw.println("초과 수당: " + df.format(over_time));
          pw.println("야간 수당: " + df.format(night));
          pw.println("총금액: " + df.format(total));
          pw.println("-------------------------------");
        }
      }
      
    } catch (FileNotFoundException e) {
      System.out.println("파일이 없습니다.");
    } catch (IOException e) {
      System.out.println("파일을 일기/쓰기 중에 에러가 발생했습니다.");
    } catch (NumberFormatException e) {
      System.out.println("데이터에 문제가 있습니다. 공백등을 확인해주세요.");
    } finally {
      try { pw.close(); } catch (Exception e) {  }
      try { writer.close(); } catch (Exception e) { }
      try { br.close(); } catch (Exception e) { }
      try { reader.close(); } catch (Exception e) { }
    }
  }
 
}
 

 

 
-----------------------------------------------------------------------------------
 
  
  
[02] StringTokenizer class의 사용

- 기본적으로 split() 메소드와 기능이 같으나 존재하는 값만 출력함.

[실행 화면]

4
 
가을
겨울
-----------------------------------
3
가을
겨울
-----------------------------------
라면,만두,김밥
   라면
   만두
   김밥
김치 찌게,참치 찌게,부대 찌게
   김치 찌게
   참치 찌게
   부대 찌게
 
 

▷ oop3.STTest.java
-----------------------------------------------------------------------------------

package oop3;
 
import java.util.StringTokenizer;
 
public class STTest {
 
  public static void main(String[] args) {
    String[] list = "봄,,가을,겨울".split(",");
    System.out.println(list.length); // 4
    
    for (int i = 0; i < list.length; i++) { // 0 ~ 3
      System.out.println(list[i]);
    }
     
    System.out.println("-----------------------------------");    
    
    StringTokenizer st = new StringTokenizer("봄,,가을,겨울", ",");
    System.out.println(st.countTokens()); // 3
    
    while(st.hasMoreTokens()) { // 단어가 있는지 검사
      System.out.println(st.nextToken()); // 단어 추출
    }
    
    System.out.println("-----------------------------------");
 
    // 2차 그룹화
    String menu = "라면,만두,김밥/김치 찌게,참치 찌게,부대 찌게";
    StringTokenizer st2 = new StringTokenizer(menu, "/"); // 1차
    
    while(st2.hasMoreTokens()) {
      String group = st2.nextToken();
      System.out.println(group);
      
      StringTokenizer st3 = new StringTokenizer(group, ","); // 2차
      while(st3.hasMoreTokens()) {
        System.out.println("   " + st3.nextToken());
      }
    }
      
  }
 
}
 
 
-----------------------------------------------------------------------------------
 
 
 
[과제 4] StringTokenizer class를 사용한 영화 예약 시스템 제작
 
1. 데이터 파일

▷ C:/작업 기준폴더/io/movie.csv(CSV 파일)
     - 데이터 구조: 영화명, 좌석, 성인수, 학생수
-----------------------------------------------------------------------------------

신과함께,A,2,1
공작,A,3,0
맘마미아2,B,3,1
택시,C,2,0
월터의 상상은 현실이된다.,A,1,0
-----------------------------------------------------------------------------------


2. 데이터 파일 처리 결과 파일, 자동 생성
- 좌석, 성인 금액
  A: 11,000
  B: 10,000
  C:  9,000
- 학생 금액, 학생은 성인 금액 20% 할인
  A: 11,000 -> 8,800
  B: 10,000 -> 8,000
  C:  9,000 -> 7,200
- 결재 금액: 성인 금액 + 학생 금액
- 포인트: 결재 금액의 5% 계산

▷ C:/작업 기준 폴더/backup/movie_proc.txt
-----------------------------------------------------------------------------------

영화명: 신과함께
좌석: A
성인수: 2명
학생수: 1명
성인 금액: 22,000 원
학생 금액: 8,800 원
결재 금액: 30,800 원
포인트(5%): 1,540 원
-------------------------------
영화명: 공작
좌석: A
성인수: 3명
학생수: 0명
성인 금액: 33,000 원
학생 금액: 0 원
결재 금액: 33,000 원
포인트(5%): 1,650 원
-------------------------------
.....

-----------------------------------------------------------------------------------
 
 
3. 처리 클래스

   - split() 메소드 이용
   - 천단위 구분기호 출력
     DecimalFormat df = new DecimalFormat("#,###,### 원");
     String basic = df.format(1800000);
   - trim(): 문자열의 처음과 시작 부분의 공백을 제거함.
              정수로 변환시 문자열에 공백이 존재하면
              Integer.parseInt(args[2]) 메소드가 Exceptioin을 발생함,
              숫자형 데이터에는 trim() 메소드 사용을 권장함.
              예) "    ABC    ".trim() → "ABC"  


 
▷ oop4.MovieProc.java(AlbaProc.java를 복사하여 사용합니다.)
-----------------------------------------------------------------------------------

package oop3;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.StringTokenizer;
 
public class MovieProc {
 
  public static void main(String[] args) {
    File src = new File("C:/201812_java/io/movie.csv");
    File dest = new File("C:/201812_java/io/movie_proc.txt");
    
    // File -> FileReader -> BufferedReader
    FileReader reader = null;   // 파일 읽기
    BufferedReader br = null; // 읽은 내용을 메모리에 저장
 
    // PrintWriter -> FileWriter -> File
    FileWriter writer = null;    // 파일에 기록
    PrintWriter pw = null;      // 메모리에 기록
    
    try {
      reader = new FileReader(src);      // Call By Reference, 해시코드 전달
      br = new BufferedReader(reader); // Call By Reference, 해시코드 전달
      
      // false: 기존 내용을 지우고 기록, true: 파일 하단에 추가
      writer = new FileWriter(dest, false);  
      pw = new PrintWriter(writer);
      
      while(true) {
        String line = br.readLine(); // 내장산,2016-11-10,50000,4,0
        if (line == null) { // 파일 마지막인지 검사
          break; // while 탈출
        } else {
          if (line.length() > 0) {
            System.out.println(line); // 화면 출력
 
            /*
영화명: 신과함께
좌석: A
성인수: 2명
학생수: 1명
성인 금액: 22,000 원
학생 금액: 8,800 원
결재 금액: 30,800 원
포인트(5%): 1,540 원
 
신과함께,A,2,1
             */
            StringTokenizer st = new StringTokenizer(line, ",");
            String name = st.nextToken().trim(); // 영화명
            String seat = st.nextToken().trim(); // 좌석
            int count = Integer.parseInt(st.nextToken().trim()); // 성인수
            int child = Integer.parseInt(st.nextToken().trim()); // 학생수
 
            int count_price = 0; // 성인 금액
            int child_price = 0; // 학생 금액
            int price = 0;  // 좌석당 가격
            if (seat.equals("A")) {
              price = 11000;
            } else if (seat.equals("B")) {
              price = 10000;
            } else if (seat.equals("C")) {
              price = 9000;
            }
            count_price = count * price; // 성인 금액
            child_price = child * (int)(price * 0.8); // 학생 금액
 
            int total = count_price + child_price;
            int point = (int)(total * 0.05);
 
            DecimalFormat df = new DecimalFormat("#,###,### 원");
 
            pw.println("영화명: " + name);  // 파일 기록
            pw.println("좌석: " + seat);
            pw.println("성인수: " + count + "명"); 
            pw.println("학생수: " + child + "명");
            pw.println("성인 금액: " + df.format(count_price));
            pw.println("학생 금액: " + df.format(child_price));
            pw.println("결재 금액: " + df.format(total));
            pw.println("포인트(5%): " + df.format(point));
            pw.println("-------------------------------");
          }
        }
      }
      
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try { pw.close(); } catch (Exception e) {  }
      try { writer.close(); } catch (Exception e) { }
      try { br.close(); } catch (Exception e) { }
      try { reader.close(); } catch (Exception e) { }
    }
  }
 
}
 
 
 
 
 
-----------------------------------------------------------------------------------


Comments