수행 목적 : Scanner의 입력함수와 조건문 및 반복문 과 배열, 함수를 통한 과세 로직 작성
간략 소개 : 대한민국 헌법은 국민의 의무와 권리를 규정하고 있습니다. 이중 납세의 의무는 국민의 3대 의무중 하나입니다. 모든 국민은 1년 동안 열심히 번 소득에 대해서 세금을 납부하여야 합니다. 이런 소득에 대한 소득세율표가 있습니다. 주어진 표를 기준으로 해서 소득에 대한 세금을 구하는 프로그램을 작성해 보세요.
필수 준수사항
- 연소득 금액 입력
- 주어진 종합소득세율표를 통한 조건 생성
설명) 1,000만원 소득인 경우는 과세표준이 1,200만원 이하 이기 때문에 세율을 6%로 계산한 결과인 60만원의 세금이 부과됨
1,500만원 소득의 경우는 과세표준 구간이 15% 세율이기 때문에 15%로 계산하는 게 아니라 1,200만원까지는 6%의 세율로 계산하고 그 외만 15%로 계산해서 합계를 냄.
이때, 누진공제 금액을 이용할 수 있는데 1,500만원에 15% 세율로 계산한 금액 225만원에 누진 공제 금액을 빼면 세금계산과 동일한 금액입니다.
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* 연소득 과세금액 계산 프로그램
*/
public class TaxCalculation {
// 연소득
public static long annaulIncome = 0;
// 연소득 구간 배열
public static long[] incomeSection = {0, 12000000, 46000000, 88000000, 150000000, 300000000, 500000000, 1000000000, 1000000001};
// 세율 배열
public static long[] taxRate = {0, 6, 15, 24, 35, 38, 40, 42, 45};
// 누진공제금액 배열
public static long[] deduction = {0, 0, 1080000, 5220000, 14900000, 19400000, 25400000, 35400000, 65400000};
// 계산 결과 리스트
public static ArrayList<long[]> list;
/**
* Custom Exception 클래스
* 마이너스 사용 시 예외
*/
public static class MinusException extends Exception {
public MinusException() {
super("숫자는 마이너스를 사용할 수 없습니다.");
}
}
/**
* 사용자 입력 받기
*/
public static void dataInput() {
Scanner sc = new Scanner(System.in);
System.out.println("[과세금액 계산 프로그램]");
System.out.print("연소득을 입력해주세요.:");
try {
annaulIncome = sc.nextLong();
// 사용자 입력 값이 0보다 작으면 Custom Exception 발생
if (annaulIncome < 0) {
throw new MinusException();
}
} catch (Exception e) {
// 에러 원인 출력 후 재 실행
if (e instanceof InputMismatchException) {
// 숫자 이외에 입력 시 에러
System.out.println("숫자만 입력해주세요.");
} else if (e instanceof MinusException) {
// 마이너스 숫자 입력 시 에러
System.out.println(e.getMessage());
} else {
System.out.println(e);
System.out.println("알 수 없는 에러가 발생했습니다. 관리자에게 문의해주세요.");
}
dataInput();
} finally {
sc.close();
}
}
/**
* 소득 구간 별 세율, 누진공제 확인
*/
public static void taxRateCal() {
// 계산 결과 리스트
list = new ArrayList<>();
for (int i = 1; i < incomeSection.length; i++) {
// 연소득이 1,200만원 이하일 때
// 추가적인 세금 계산이나 누진공제 계산이 없기 때문에
// 바로 계산 결과 리스트에 저장
if (i == 1) {
if (annaulIncome <= incomeSection[i]) {
// {연소득, 세율, 세금, 누진공제액}
long[] result = new long[4];
long tax = (annaulIncome / 100) * taxRate[i];
result[0] = annaulIncome;
result[1] = taxRate[i];
result[2] = tax;
result[3] = deduction[i];
// 연소득이 0원일 때
if (annaulIncome == 0) {
result[1] = taxRate[0];
result[3] = deduction[0];
}
list.add(result);
}
} else if (i == incomeSection.length - 1) {
// 연소득이 10억원 초과했을 때
if (annaulIncome > incomeSection[i]) {
texCal(i, incomeSection, taxRate, deduction);
}
} else {
if (annaulIncome > incomeSection[i - 1] && annaulIncome <= incomeSection[i]) {
texCal(i, incomeSection, taxRate, deduction);
}
}
}
}
/**
* 세금 계산 후 계산 결과 리스트에 저장
*
* @param i n번 째 세금 구간
* @param incomeSection 세금 구간 배열
* @param taxRate 세율 배열
* @param deduction 공제액 배열
*/
public static void texCal(int i, long[] incomeSection, long[]taxRate, long[] deduction) {
// 계산 결과 저장 배열
long[] result;
// 세금
long tax = 0;
// 내 연소득 구간 직전 까지의 구간 별 세금 계산
for (int j = 1; j < i; j++) {
// {과세소득구간, 세율, 세금, 누진공제액}
result = new long[4];
tax = ((incomeSection[j] - incomeSection[j - 1]) / 100) * taxRate[j];
result[0] = incomeSection[j] - incomeSection[j - 1];
result[1] = taxRate[j];
result[2] = tax;
result[3] = deduction[j];
list.add(result);
}
// 연소득 구간 최소 금액에서 초과한 금액만큼 세금 계산
// {과세구간에서 초과한 금액, 세율, 세금, 누진공제액}
result = new long[4];
tax = ((annaulIncome - incomeSection[i - 1]) / 100) * taxRate[i];
result[0] = annaulIncome - incomeSection[i - 1];
result[1] = taxRate[i];
result[2] = tax;
result[3] = deduction[i];
list.add(result);
}
/**
* 출력
*/
public static void print() {
// 총 세금
long totalTax = 0;
// 세금
long taxRate = 0;
// 누진공제액
long deduction = 0;
for (int i = 0; i < list.size(); i++) {
long[] result = list.get(i);
if (i == list.size() - 1) {
taxRate = result[1];
deduction = result[3];
}
totalTax += result[2];
System.out.printf("%11d * %2d%% = %11d\n", result[0], result[1], result[2]);
}
System.out.println();
System.out.printf("[세율에 의한 세금]: \t\t%11d\n", totalTax);
System.out.printf("[누진공제 계산에 의한 세금]:%11d", (((annaulIncome / 100) * taxRate) - deduction));
}
public static void main(String[] args) {
// 사용자 데이터 입력
dataInput();
// 소득 구간 별 세율, 누진공제 확인 및 세금 계산
taxRateCal();
// 출력
print();
}
}
클래스에서 main 메소드와 다른 메소드들에서 사용하기 위해
변수들에 static 사용, main 메소드에는 실행을 위한 메소드 호출만 진행하도록 했다.
사용자 데이터 입력을 위한 dataInput();
소득 구간 별 세율, 누진공제 확인 및 세금 계산을 위한 taxRateCal();
출력을 위한 print(); 실행
사용자로부터 연소득을 입력 받았을 때, 입력 값이 0보다 작다면 Custom Exception 클래스를 만들어
예외 발생을 진행했다.
숫자 이외에 값을 입력하면 InputMismatchException은 '숫자만 입력해주세요.' 출력
이외 에러는 e 출력 후 ' 알 수 없는 에러가 발생했습니다. 관리자에게 문의해주세요.' 출력
연소득이 1,200만원 이하일 때는 추가적인 세금 계산이나 누진 공제 계산이 필요없기 때문에
연소득, 세율, 세금, 누진공제액(0원)을 바로 결과 리스트에 저장, 연소득을 0원으로 입력 시 0원으로 출력되기 위해 설정
연소득이 10억원을 초과했을 때는 세율표에서 마지막 세율, 누진공제액 적용해서 세금 계산
나머지 연소득에 대해서도 세금 계산 진행
실행결과
2024.04.14 - [Zero-base] - 로또 당첨 프로그램 제로베이스 백엔드 스쿨 미니과제 7
2024.04.13 - [Zero-base] - 가상 선거 및 당선 시뮬레이션 프로그램 제로베이스 백엔드 스쿨 미니과제 6
2024.04.12 - [Zero-base] - 달력 출력 프로그램 제로베이스 백엔드 스쿨 미니과제 5
2024.04.12 - [Zero-base] - 주민등록번호 생성 프로그램 제로베이스 백엔드 스쿨 미니과제 4
2024.04.11 - [Zero-base] - 놀이동산 입장권 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 3
2024.04.11 - [Zero-base] - 결제 금액 캐시백 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 2
2024.04.10 - [Zero-base] - 콘솔 화면에 구구단 출력하기 제로베이스 백엔드 스쿨 미니과제 1
'📌Zero-base' 카테고리의 다른 글
백엔드 커리어 로드맵 - 어떤 백엔드 개발자가 되고 싶은지 (0) | 2024.04.15 |
---|---|
백준 25556번 포스택 제로베이스 자료구조 1일차 주제 : Stack (0) | 2024.04.15 |
로또 당첨 프로그램 제로베이스 백엔드 스쿨 미니과제 7 (0) | 2024.04.14 |
가상 선거 및 당선 시뮬레이션 프로그램 제로베이스 백엔드 스쿨 미니과제 6 (0) | 2024.04.13 |
달력 출력 프로그램 제로베이스 백엔드 스쿨 미니과제 5 (0) | 2024.04.12 |