Data Scientist 옌

매일 발전하는 IT문제해결사

국비지원교육 (22.01-22.07)/강의노트

22-02-24(목) 021일차 [Java] BigDecimal, 사칙연산을 하는 계산기 만들기, String 자르기(StringTokenizer)

옌炎 2022. 5. 9. 09:54
728x90

수업내용


1교시 (09:30-10:20)

  • 지난 시간 복습

java.lang.Math 클래스

숫자, 수학 관련 클래스이다.

함수가 static이다.

 

random(), 배열, for문

 

로또 번호

1. 난수로 번호 생성 : Math.random()

2. 번호를 6개 만들기 : 배열, for

2.1 중복 제가 : 배열, for 문의 index, 증감 연산자, 배열의 데이터 key=value 인덱스=값

3. 6개 번호를 5개 만들기 : for

4. 문자 만들기 A : char 문자이면서 숫자 증감연산자

5. 자동, 수동 붙이기 : 배열, 문자열을 초기화해서 사용하는 방법

6. 자리수 맞추기 : 문자열의 길이를 체크

 

2교시 (10:30-11:20)

  • Exam_Math_9
package a.b.c.ch5;

import java.math.BigDecimal;

public class Exam_Math_9 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 오버 플로우
		// 자바 int 형 : 4byte : 32bit : 2,147,483,647
		//							  2,500,000,000
		//					 z >>> : -1,794,967,296
		int x = 50000;
		int y = 50000;
		int z = x * y;
		System.out.println("z >>> : " + z);
		
		// 9,223,372,036,854,775,807L
		long x1 = 50000;
		long y1 = 50000;
		long z1 = x1 * y1;
		System.out.println("z1 >>> : " + z1);
		
		// 부동 소수점 오류
		int x2 = 1;
		double y2 = 0.1;
		int num = 7;
		double z2 = x2 - num * y2; // 0.3
		System.out.println("z2 >>> : " + z2);
		// z2 >>> : 0.29999999999999993
		
		int x3 = 1;
		double y3 = x3* 10;
		int num1 = 7;
		double z3 = (y3-num1) / 10.0;
		System.out.println("z3 >>> : " + z3); // 0.3
		
		// java.math.BigDecimal
		// java.math.BigDecimal.add(BigDeciaml augend) : 덧셈 연산
		// java.math.BigDecimal.subtract(BigDecimal subtranhend) : 뺄셈 연산
		// java.math.BigDecimal.multiply(BigDecimal multiplicand) : 곱셈 연산
		// java.math.BigDecimal.devide(BigDecimal divisor) : 나눗셈 연산
		// java.math.BigDecimal.remainder(BigDecimal divisor) : 나머지 연산
		BigDecimal b1 = BigDecimal.valueOf(1);
		BigDecimal b2 = BigDecimal.valueOf(0.7);
		System.out.println("b1.subtract(b2) >>> : " + b1.subtract(b2));
	}
}
  • Exam_Math_10
package a.b.c.ch5;

import java.math.BigDecimal;

public class Exam_Math_10 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// double x = 1.12345678922222;
		// double y = 1.2343456789111;
		String x = "1.12345678922222";
		String y = "1.2343456789111";
		
		// 빅데시말 사용할 때 문자숫자로 초기화해야 한다.
		// 숫자로 초기화하면 형변환이 생기는 경우 연산이 잘못될 가능성이 있다.
		// BigDecimal b1 = new BigDecimal("1.12345678922222");
		// BigDecimal b2 = new BigDecimal("1.2343456789111");
		
		BigDecimal b1 = new BigDecimal(x);
		// BigDecimal b1 = new BigDecimal(String.valueOf(x));
		System.out.println("b1 >>> : " + b1);
		
		BigDecimal b2 = new BigDecimal(y);
		// BigDecimal b2 = new BigDecimal(String.valueOf(x));
		System.out.println("b2 >>> : " + b2);
		
		// public BigDecimal add(BigDecimal augend)
		// 더하기
		BigDecimal badd = b1.add(b2);
		System.out.println("badd >>> : " + badd);
		
		/*
		 double x = 1.12345678922222;
		double y = 1.2343456789111;
		b1 >>> : 1.12345678922222003137676438200287520885467529296875
		b2 >>> : 1.23434567891110003046151177841238677501678466796875
        badd >>> : 2.35780246813332006183827616041526198387145996093750
        
        String x = "1.12345678922222";
		String y = "1.2343456789111";
		b1 >>> : 1.12345678922222
		b2 >>> : 1.2343456789111
		badd >>> : 2.35780246813332
		*/
		// public BigDecimal setScale(int newScale, int roundingMode)
		badd = badd.setScale(3, BigDecimal.ROUND_DOWN);
		System.out.println("badd >>> : " + badd);
		
		// 빼기
		BigDecimal bsub= b1.subtract(b2);
		System.out.println("bsub >>> : " + bsub);
		bsub = bsub.setScale(3, BigDecimal.ROUND_HALF_EVEN);
		System.out.println("bsub >>> : " + bsub);
		
		// 곱하기
		BigDecimal bmul = b1.multiply(b2);
		System.out.println("bmul >>> : " + bmul);
		bmul = bmul.setScale(3, BigDecimal.ROUND_DOWN);
		System.out.println("bmul >>> : " + bmul);
		
		// 나누기
		// BigDecimal bdiv = b1.divide(b2);
		BigDecimal bdiv = b1.divide(b2, 3, BigDecimal.ROUND_DOWN);
		System.out.println("bdiv >>> : " + bdiv);
		// bdiv = bdiv.setScale(3, BigDecimal.ROUND_DOWN;
		// System.out.println("bdiv >>> : " + bdiv);
	}
}

3교시 (11:30-12:20)

  • 사칙연산을 하는 계산기 만들기 (미완성)
package a.b.c.ch5;

import java.math.BigDecimal;

public class Exam_Math_10 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// double x = 1.12345678922222;
		// double y = 1.2343456789111;
		String x = "1.12345678922222";
		String y = "1.2343456789111";
		
		// 빅데시말 사용할 때 문자숫자로 초기화해야 한다.
		// 숫자로 초기화하면 형변환이 생기는 경우 연산이 잘못될 가능성이 있다.
		// BigDecimal b1 = new BigDecimal("1.12345678922222");
		// BigDecimal b2 = new BigDecimal("1.2343456789111");
		
		BigDecimal b1 = new BigDecimal(x);
		// BigDecimal b1 = new BigDecimal(String.valueOf(x));
		System.out.println("b1 >>> : " + b1);
		
		BigDecimal b2 = new BigDecimal(y);
		// BigDecimal b2 = new BigDecimal(String.valueOf(x));
		System.out.println("b2 >>> : " + b2);
		
		// public BigDecimal add(BigDecimal augend)
		// 더하기
		BigDecimal badd = b1.add(b2);
		System.out.println("badd >>> : " + badd);
		
		/*
		 double x = 1.12345678922222;
		double y = 1.2343456789111;
		b1 >>> : 1.12345678922222003137676438200287520885467529296875
		b2 >>> : 1.23434567891110003046151177841238677501678466796875
        badd >>> : 2.35780246813332006183827616041526198387145996093750
        
        String x = "1.12345678922222";
		String y = "1.2343456789111";
		b1 >>> : 1.12345678922222
		b2 >>> : 1.2343456789111
		badd >>> : 2.35780246813332
		*/
		// public BigDecimal setScale(int newScale, int roundingMode)
		badd = badd.setScale(3, BigDecimal.ROUND_DOWN);
		System.out.println("badd >>> : " + badd);
		
		// 빼기
		BigDecimal bsub= b1.subtract(b2);
		System.out.println("bsub >>> : " + bsub);
		bsub = bsub.setScale(3, BigDecimal.ROUND_HALF_EVEN);
		System.out.println("bsub >>> : " + bsub);
		
		// 곱하기
		BigDecimal bmul = b1.multiply(b2);
		System.out.println("bmul >>> : " + bmul);
		bmul = bmul.setScale(3, BigDecimal.ROUND_DOWN);
		System.out.println("bmul >>> : " + bmul);
		
		// 나누기
		// BigDecimal bdiv = b1.divide(b2);
		BigDecimal bdiv = b1.divide(b2, 3, BigDecimal.ROUND_DOWN);
		System.out.println("bdiv >>> : " + bdiv);
		// bdiv = bdiv.setScale(3, BigDecimal.ROUND_DOWN;
		// System.out.println("bdiv >>> : " + bdiv);
	}
}

4교시 (12:30-13:20)

  • 사칙연산을 하는 계산기 만들기 (계속)
    • 선생님이 주신 참조용 코드 KM_Calcu
package a.b.c.ch5;


// 요구사항
/*
1. 사칙연산: + - * /
2. BigDecimal 사용
3. 각 연산은 함수 구현, 함수 이름은 본인이 만들어 보기
4. 연산 결과는 main 함수에서 콘솔에 출력하기
5. 입력은 Scanner 클래스 사용
*/
import java.util.Scanner;


public class KSY_Calcu {

	public int adder(int x, int y) {

		return x + y;
	}

	public int subtractor(int x, int y) {

		return x - y;
	}

	public int multiplyer(int x, int y) {

		return x * y;
	}

	public int divider(int x, int y) {

		return x / y;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		KSY_Calcu kc = new KSY_Calcu();
		
		System.out.println(" 계산기 시작 ");

		while (true) {
			System.out.println("연산 방법을 입력하세요.");
			System.out.println("A 더하기  S 빼기  M 곱하기  D 나누기  X 종료");

			Scanner sc = new Scanner(System.in);
			String input = sc.next();
			input.toUpperCase();

			if 		  (input == "A") {
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요")
				int x = sc.nextInt();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요")
				int y = sc.nextInt();
				System.out.println("정답은 " + kc.adder(x, y) + " 입니다.");

			} else if (input == "S") {
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요")
				int x = sc.nextInt();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요")
				int y = sc.nextInt();
				System.out.println("정답은 " + kc.subtractor(x, y) + " 입니다.");

			} else if (input == "M") {
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요")
				int x = sc.nextInt();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요")
				int y = sc.nextInt();
				System.out.println("정답은 " + kc.multiplyer(x, y) + " 입니다.");

			} else if (input == "D") {
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요")
				int x = sc.nextInt();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요")
				int y = sc.nextInt();
				System.out.println("정답은 " + kc.divider(x, y) + " 입니다.");

			} else if (input == "X") {
				break;
			}
			sc.close();
			
		} // end of while()
	} // end of main()
} // end of KSY_Calcu class
  • 선생님이 주신 참조용 코드 KM_Calcu_1
package a.b.c.ch5;

import java.math.BigDecimal;
import java.util.Scanner;

// 요구사항
/*
1. 사칙연산 : + - * /
2. BicDecimal 사용
3. 각 연산은 함수 구현, 함수 이름은 본인 만들어 보기 
4. 연산 결과는 main 함수에서 콘솔에 출력하기 
5. 입력은 Scanner 클래스 사용

13:00 까지 만들기 
*/

public class KM_Calcu {
	
	public BigDecimal kmAdd(String x, String y) {

		BigDecimal b1 = new BigDecimal(x); 						
		BigDecimal b2 = new BigDecimal(y);
 		BigDecimal badd = b1.add(b2);
 		
		return badd;
	}
	public BigDecimal kmSubtract(String x, String y) {
		
		BigDecimal b1 = new BigDecimal(x); 						
		BigDecimal b2 = new BigDecimal(y);
 		BigDecimal bsubtract = b1.subtract(b2);
 		
		return bsubtract;
	}
	public BigDecimal kmMultiply(String x, String y) {
		
		BigDecimal b1 = new BigDecimal(x); 						
		BigDecimal b2 = new BigDecimal(y);
 		BigDecimal bmultiply = b1.multiply(b2);
 		
		return bmultiply;
	}
	public BigDecimal kmDivide(String x, String y) {
		
		BigDecimal b1 = new BigDecimal(x); 						
		BigDecimal b2 = new BigDecimal(y);
 		BigDecimal bdivide = b1.divide(b2);
 		
		return bdivide;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner sc = null;
		
		String x = "";
		String y = "";
		String oper = "";
		char cOper = '\u0000';
				
		try {
		
			sc = new Scanner(System.in);
			
			System.out.println("연산할 x 값을 입력하시오 >>> : ");
			x = sc.next();
			System.out.println("x >>> : " + x);
			
			System.out.println("연산할 y 값을 입력하시오 >>> : ");
			y = sc.next();
			System.out.println("y >>> : " + y);
			
			System.out.println("연산할  연산자를  + - * /  입력하시오 >>> : ");
			oper = sc.next();
			cOper = oper.charAt(0);
			System.out.println("cOper >>> : " + cOper);
	
			
			if (0x2B == cOper) {
				// +
				System.out.println("연산할  연산자는>>> : " + cOper);
				
				KM_Calcu km_add = new KM_Calcu();
				BigDecimal badd = km_add.kmAdd(x, y);
				
				System.out.println(x + " + " + y + " = " + badd);			
			}
			if (0x2D == cOper) {
				// -				
				System.out.println("연산할  연산자는>>> : " + cOper);
				
				KM_Calcu km_sub = new KM_Calcu();
				BigDecimal bsubtract= km_sub.kmSubtract(x, y);
				
				System.out.println(x + " - " + y + " = " + bsubtract);
			}
			if (0x2A == cOper) {
				// *				
				System.out.println("연산할  연산자는>>> : " + cOper);
				
				KM_Calcu km_mul = new KM_Calcu();
				BigDecimal bmultiply = km_mul.kmMultiply(x, y);
				
				System.out.println(x + " * " + y + " = " + bmultiply);
			}
			if (0x2F == cOper) {
				// /				
				System.out.println("연산할  연산자는>>> : " + cOper);
				
				KM_Calcu km_div = new KM_Calcu();
				BigDecimal bdivide = km_div.kmDivide(x, y);
				
				System.out.println(x + " / " + y + " = " + bdivide);
			}
			
			sc.close();
		}catch(Exception e) {
			System.out.println("에러가 >>> : " + e.getMessage());
		}finally {
			if (sc !=null) {
				sc.close();
			}
		}
	}
}

5교시 (14:30-15:20)

  • 사칙연산을 하는 계산기 만들기 (계속) - 완성한 코드
package a.b.c.ch5;


// 요구사항
/*
1. 사칙연산: + - * /
2. BigDecimal 사용
3. 각 연산은 함수 구현, 함수 이름은 본인이 만들어 보기
4. 연산 결과는 main 함수에서 콘솔에 출력하기
5. 입력은 Scanner 클래스 사용
*/
import java.util.Scanner;
import java.math.BigDecimal;

public class KSY_Calcu {

	public BigDecimal adder(String x, String y) {

		BigDecimal x1 = new BigDecimal(x);
		BigDecimal y1 = new BigDecimal(y);
		BigDecimal added = x1.add(y1);
		
		return added;
	}

	public BigDecimal subtractor(String x, String y) {

		BigDecimal x1 = new BigDecimal(x);
		BigDecimal y1 = new BigDecimal(y);
		BigDecimal subtracted = x1.subtract(y1);
		
		return subtracted;
	}

	public BigDecimal multiplyer(String x, String y) {

		BigDecimal x1 = new BigDecimal(x);
		BigDecimal y1 = new BigDecimal(y);
		BigDecimal multiplyed = x1.multiply(y1);
		
		return multiplyed;
	}

	public BigDecimal divider(String x, String y) {

		BigDecimal x1 = new BigDecimal(x);
		BigDecimal y1 = new BigDecimal(y);
		BigDecimal divided = x1.divide(y1);
		
		return divided;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("== 계산기를 시작합니다 ==");

		while (true) {
			System.out.println();
			System.out.println("연산 방법을 입력하세요.");
			System.out.println("A 더하기  S 빼기  M 곱하기  D 나누기  X 계산기 종료");

			String input = "";
			Scanner sc = new Scanner(System.in); 
			input = sc.next().toUpperCase();
			
			// System.out.println("input : " + input);
			
			if 		  (input.equals("A")) {
				KSY_Calcu kc_add = new KSY_Calcu();
				System.out.println("== 더하기 연산==");
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요");
				String x = sc.next();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요");
				String y = sc.next();
				BigDecimal answer_add = kc_add.adder(x, y);
				System.out.println("정답은 " + answer_add + "입니다.");
				
			} else if (input.equals("S")) {
				System.out.println("== 빼기 연산==");
				KSY_Calcu kc_substract = new KSY_Calcu();
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요");
				String x = sc.next();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요");
				String y = sc.next();
				BigDecimal answer_sub = kc_substract.subtractor(x, y);
				System.out.println("정답은 " + answer_sub + "입니다.");

			} else if (input.equals("M")) {
				System.out.println("== 곱하기 연산==");
				KSY_Calcu kc_multiply = new KSY_Calcu();
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요");
				String x = sc.next();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요");
				String y = sc.next();
				BigDecimal answer_mul = kc_multiply.multiplyer(x, y);
				System.out.println("정답은 " + answer_mul + " 입니다.");

			} else if (input.equals("D")) {
				System.out.println("== 나누기 연산==");
				KSY_Calcu kc_divide = new KSY_Calcu();
				System.out.println("계산하고자 하는 첫번째 수를 입력하세요");
				String x = sc.next();
				System.out.println("계산하고자 하는 두번째 수를 입력하세요");
				String y = sc.next();
				BigDecimal answer_dev = kc_divide.divider(x, y);
				System.out.println("정답은 " + answer_dev + " 입니다.");
			} else if (input.equals("X")) {
				System.out.println("== 계산기를 종료합니다 ==");
				break;
			}
		} // end of while()
	} // end of main()
} // end of KSY_Calcu class

6교시 (15:30-16:20)

  • Exam_String
package a.b.c.ch5;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Exam_String {
	
	// 상수
	public static final String MEMBER_NUM = "M";
	public static final String BOARD_NUM = "B";
	
	public static String mNum(String nCnt) {
		
		int nn = nCnt.length();
		
		for (int i=nn; i < 4; i++) {
		
			nCnt = "0" + nCnt;
		
		}
		
		return nCnt;
	}
	
	public static String mNum_1(String nCnt) {
		
		int nn = nCnt.length();
		
		if (1 == nn) {
			nCnt = "000" + nCnt;
		} else if (2 == nn) {
			nCnt = "00" + nCnt;
		} else if (3 == nn) {
			nCnt = "0" + nCnt;
		}
		
		return nCnt;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 202107230001 : 회원번호 만들기 : 년월일 + 시퀀스 (0001 ~ 9999)
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		// SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
		// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String d = sdf.format(new Date());
		System.out.println("d >>> : " + d);
		
		String mnum = "";
		String nCnt = "";
		
		for (int i=1; i < 101; i++) {
			
			nCnt = String.valueOf(i);

			mnum = Exam_String.MEMBER_NUM // M
					+ d // 20220224
					+ Exam_String.mNum(nCnt);
			
			System.out.println("mnum >>> : " + mnum);
		}
	}

}

7교시 (16:30-17:20)

  • Exam_String_1
package a.b.c.ch5;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Exam_String_1 {
	
	public static String 년월일() {
		return new SimpleDateFormat("yyyyMMdd").format(new Date());
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String s0 = "kosmo108.java";
		// index = length() - 1;
		// length() = index + 1;
		System.out.println("s0.length() >>> : " + s0.length());
		for (int i=0; i < s0.length(); i++) {
			System.out.println("s0.charAt(" + i + ") >>> : " + s0.charAt(i));
		}
		
		String s01 = s0.substring(2);
		System.out.println("s0.substring(2) >>> : " + s01);
		
		String s02 = s0.substring(2, 13);
		System.out.println("s0.substring(2, 13) >>> : " + s02);
		System.out.println("s0.length() >>. : " + s02.length());
		
		int index = s0.indexOf('o');
		System.out.println("index >>> : " + index);
		if (index != -1) {
			System.out.println("s0.indexOf('0') >>> : " + index);
			String s03 = s0.substring(index+1);
			System.out.println("s0.substring(index+1) >>> : " + s03);
			
			String fileName = s0.substring(0, index);
			
			String newFileName = fileName + "(1)" + "." + s03;
			String newFileName_1 = fileName + "_" + Exam_String_1.년월일() + "." + ㄴ03;
			
			System.out.println("original fileName >>> : " + s0);
			System.out.println("new fileName >>> : " + newFileName);
			System.out.println("new fileName_1 >>> : " + newFileName_1);
		}
		
		int lastIndex = s0.lastIndexOf('o');
		System.out.println("s0.lasIndexOf('o') >>> : " + lastIndex);
		String s04 = s0.substring(lastIndex+1);
		System.out.println("s0.substring(lastIndex+1) >>> : " + s04);
	}

}

8교시 (17:30-18:30)

  • Exam_String_2
package a.b.c.ch5;

import java.util.StringTokenizer;

public class Exam_String_2 {
	
	public void charSplit(String sVal) {
		
		System.out.println("charSplit(String sVal) sVal >>> : " + sVal);
		
		if (sVal != null && sVal.length() > 0) {
			
			String sChar[] = sVal.split("@"); // 델리미터 delimiter, 구분자
			
			for (int i=0; i < sChar.length; i++) {
				System.out.println("sChar[" + i + "] >>> : " + sChar[i]);
			}
		} 
	}
	
	public void charToken(String sVal) {
		System.out.println("charToken(String sVal sVal >>> : " + sVal);
		
		if (sVal != null && sVal.length() > 0) {
			
			StringTokenizer st = new StringTokenizer(sVal, "@^ |");
			
			while (st.hasMoreTokens()) {
				System.out.println(">>> : " + st.nextToken());
			}
			
//			for (int i=0; st.hasMoreTokens(); i++) {
//				System.out.println(i + "번째 : " + st.nextToken());
//			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String sVal = "a b^c,d ef,g|h^i,jk|l,m^no";
		System.out.println("sVal >>> : " + sVal);
		
		sVal = sVal.replace(',', '@');
		System.out.println("sVal >>> : " + sVal);
		
		Exam_String_2 ex2 = new Exam_String_2();
		ex2.charSplit(sVal);
		ex2.charToken(sVal);
	}
}

Notes

  • split 1.4 이후부터 생김

 

728x90