[Java 기초문법] by Professional Java Developer Career Starter: Java Foundations @ Udemy
Math operations
public class MathStuff {
public static void main(String[] args) {
System.out.println(8 * 8 / 8 /4);
}
}
=> 2
public class MathStuff {
public static void main(String[] args) {
System.out.println(7 / 4);
}
}
=> 1
= fractional parts just thrown up
public class MathStuff {
public static void main(String[] args) {
System.out.println(7f / 4);
}
}
=> 1.75
위에서는 int 타입을 default로 인식
f를 입력함으로써 float type을 determine해줌으로써
float 결과값이 측정되도록 햊ㅁ
또 하나의 방법은 Casting
괄호를 사용해 telling Java that it now be treated as double
public class MathStuff {
public static void main(String[] args) {
System.out.println((double)7 / 4);
}
}
=> 1.75
재밌는 점은 이렇게 하면 순서상으로 먼저 int 계산 이후 그다음에 소수점 표현
public class MathStuff {
public static void main(String[] args) {
System.out.println((double)(7 / 4));
}
}
=> 1.0
default 값을 먼저 변수 설정에서 해주고 계산할 수도 있다.
public class MathStuff {
public static void main(String[] args) {
int num1 = 7;
double num2 = 4;
System.out.println(num1 / num2);
}
}
=> 1.75
modulo
public class MathStuff {
public static void main(String[] args) {
System.out.println(4 % 2);
}
}
=> returns remainer =>0
public class MathStuff {
public static void main(String[] args) {
int x = 1 ;
System.out.println(x);
x = x + 1 ;
System.out.println(x);
}
}
return
1
2
public class MathStuff {
public static void main(String[] args) {
int x = 1 ;
System.out.println(x);
x ++ 1 ; // => x = x+ 1 OR X+=1
System.out.println(x);
}
}
return
1
2
public class MathStuff {
public static void main(String[] args) {
int x = 1 ;
System.out.println(x++);
System.out.println(x);
}
}
return
1
2
=> 먼저 x를 출력하고 나서 그 다음에 ++ 연산이 되기 때문에
public class MathStuff {
public static void main(String[] args) {
int x = 1 ;
System.out.println(++x);
System.out.println(x);
}
}
return
2
2
public class MathStuff {
public static void main(String[] args) {
boolean myFlag = true;
System.out.println(!myFlag);
}
}
! => Negate the value of what's to be prited
=> return false
Math Functions
math 관련 함수들
public class MathStuff {
public static void main(String[] args) {
System.out.println(Math.abs(-5));
}
}
=> 5
public class MathStuff {
public static void main(String[] args) {
System.out.println(Math.ceil(5.0));
System.out.println(Math.ceil(5.1));
System.out.println(Math.ceil(-5.7));
}
}
5.0
6.0
-5.0
public class MathStuff {
public static void main(String[] args) {
System.out.println(Math.floor(5.0));
System.out.println(Math.floor(5.1));
System.out.println(Math.floor(-5.7));
}
}
5.0
5.0
-6.0
public class MathStuff {
public static void main(String[] args) {
System.out.println(Math.round(5.0));
System.out.println(Math.round(5.1));
System.out.println(Math.round(-5.7));
}
}
5
5
-6
public class MathStuff {
public static void main(String[] args) {
int num1 = 3;
int num2 = 5;
System.out.println(Math.min(num1,num2));
}
}
3
public class MathStuff {
public static void main(String[] args) {
int num1 = 2;
int num2 = 3;
System.out.println(Math.pow(num1,num2));
}
}
8.0
랜덤함수 => 일종의 pseidprandom 이다.
public class MathStuff {
public static void main(String[] args) {
System.out.println(Math.random());
System.out.println(Math.random());
System.out.println(Math.random());
System.out.println(Math.random());
System.out.println(Math.random());
}
}
0.890112420340004
0.007477175387426205
0.43299890453355516
0.8008114692293339
0.5393542419758628
public class MathStuff {
public static void main(String[] args) {
System.out.println((int)(Math.random() * 10));
System.out.println((int)(Math.random() * 10));
System.out.println((int)(Math.random() * 10));
System.out.println((int)(Math.random() * 10));
System.out.println((int)(Math.random() * 10));
}
}
1
7
6
0
7
루트 계산
public class MathStuff {
public static void main(String[] args) {
System.out.println(Math.sqrt(81));
}
}
9
public class MathStuff {
public static void main(String[] args) {
System.out.println(Math.E);
}
}
2.718281828459045
More on Random Numbers
Math 함수에서 random을 구하는 것보다 더 효율적인 것은 Random 모듈을 이용하는 것이다.
import java.util.Random;
public class MathStuff {
public static void main(String[] args) {
Random random = new Random();
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
}
}
2
1
4
3
5
9
바운더리를 정해주는 것으로 쉽게 랜덤 숫자를 구할 수 있다.
이 함수는 seed를 supply를 제공할 수 있는 기능이 있다.
그런데 이 함수여도 역시 not very suitable for highly secure things like encryption and things of that sort.
그런 경우라면 사실
Rather use
SecureRandom
import java.security.SecureRandom;
import java.util.Random;
public class MathStuff {
public static void main(String[] args) {
SecureRandom random = new SecureRandom();
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
System.out.println(random.nextInt(10));
}
}
7
1
1
5
0
This approach is meant to generate a better, more even distribution of random numbers such that it could be utilized for certain secure functions that you may be implementing.
원의 넓이를 구해보자
A = PI * r^2
public class MathStuff {
public static void main(String[] args) {
System.out.println(carcAreaOfCircle(3));
}
/**
* This method calculates the area of a circle
* It uses the formula : Area = PI * radius^2
* @param radius
* @return
*/
public static double carcAreaOfCircle(double radius){
return Math.PI * Math.pow(radius, 2);
}
}
구심력을 구해보자 (Centripetal Force)
첫번째 공식 :
public static double calcPathVelocity(double radius, double period){
double circumference = 2 * Math.PI * radius;
return circumference / period;
}
두번째 공식 :
public static double calcCentripetalAccel(double pathel, double radius){
return Math.pow(pathel, 2) / radius;
}
세번째 공식 :
public static double calcCentripetalForce(double mass, double acc){
return mass * acc;
}
public class MathStuff {
public static void main(String[] args) {
System.out.println(calcAreaOfCircle(3));
System.out.println(calcPathVelocity(0.8, 3));
System.out.println(calcCentripetalAccel(1.67, 0.8));
System.out.println(calcCentripetalForce(0.2,3.504));
}
public static double calcAreaOfCircle(double radius){
return Math.PI * Math.pow(radius, 2);
}
public static double calcPathVelocity(double radius, double period){
double circumference = 2 * Math.PI * radius;
return circumference / period;
}
public static double calcCentripetalAccel(double pathel, double radius){
return Math.pow(pathel, 2) / radius;
}
public static double calcCentripetalForce(double mass, double acc){
return mass * acc;
}
}
정리 해본다면 ?
각각의 함수들에 private 처리
종합한 함수를 public으로 새롭게 create
public class MathStuff {
public static void main(String[] args) {
System.out.println(calcCentripetalForce(.2,.8,3));
}
private static double calcAreaOfCircle(double radius){
return Math.PI * Math.pow(radius, 2);
}
private static double calcPathVelocity(double radius, double period){
double circumference = 2 * Math.PI * radius;
return circumference / period;
}
private static double calcCentripetalAccel(double pathVel, double radius){
return Math.pow(pathVel, 2) / radius;
}
private static double calcCentripetalForce(double mass, double acc){
return mass * acc;
}
public static double calcCentripetalForce(double mass, double radius, double period){
double pathVelocity = calcPathVelocity(radius, period);
double centripetalAccel = calcCentripetalAccel(pathVelocity, radius);
double centripetalForce = calcCentripetalForce(mass, centripetalAccel);
return centripetalForce;
}
}
Comparing numbers
public class MathStuff2 {
public static void main(String[] args) {
int num1 = 5;
int num2 = 3;
System.out.println(num1 == num2);
}
}
false
public class MathStuff2 {
public static void main(String[] args) {
int num1 = 5;
int num2 = 3;
System.out.println(num1 > num2);
}
}
true
BigDecimal을 다루는 방법
Solution is a class : BigDecimal
public class MathStuff2 {
public static void main(String[] args) {
float num1 = 2.15f;
float num2 = 1.10f;
System.out.println(num1 - num2);
}
}
1.0500001
=> fundamental data types which are not class manupulated
BigDecimal 함수에서 string으로 변수를 넣어준다.
하지만 이때 num3과 num4는 primitive한 타입이 아니기 때문에 에러 발생
import java.math.BigDecimal;
public class MathStuff2 {
public static void main(String[] args) {
float num1 = 2.15f;
float num2 = 1.10f;
BigDecimal num3 = new BigDecimal("2.15");
BigDecimal num4 = new BigDecimal("1.10");
System.out.println(num1 - num2);
System.out.println(num3.subtract(num4));
}
}
1.0500001
1.05
import java.math.BigDecimal;
public class MathStuff2 {
public static void main(String[] args) {
System.out.println(new BigDecimal(".03828435").divide(new BigDecimal("5.321")));
}
}
계산할 수 없다는 에러가 나온다.
precision과 Roundingmode를 지정해주기
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class MathStuff2 {
public static void main(String[] args) {
MathContext mc = new MathContext(5, RoundingMode.HALF_UP);
System.out.println(new BigDecimal(".03828435").divide(new BigDecimal("5.321"), mc));
}
}
0.0071950
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class MathStuff2 {
public static void main(String[] args) {
MathContext mc = new MathContext(7, RoundingMode.HALF_UP);
System.out.println(new BigDecimal(.054798).sqrt(mc));
}
}
0.2340897
만약 Bigdecimal을 사용하면서도 str이 아닌 그냥 숫자를 넣는다면 사실상 low level에서 fraction이 근사값으로 들어가기 때문에 의미가 없다
BigDecimal num1 = new BigDecimal(3.141592);
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class MathStuff2 {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("1024");
System.out.println(num1.doubleValue());
}
}
1024.0
이자를 계산해보자 Calculting Compound Interest
참고 사이트 : http://moneychimp.com/calculator/compound_interest_calculator.htm
Bigdecimal을 이용할 때 string type으로 인풋이 되므로 formula를 string으로 기입하고 시작하자.
import java.math.BigDecimal;
public class CompounInterestCalc {
public BigDecimal calculate(String principal, String rate, int period, String contribution){
}
}
단순히 순서만 놓고 계산을 했을 때
import java.math.BigDecimal;
public class CompoundInterestCalc {
/**
* Balance(Y) = P(1 + r)Y + C[ ((1 + r)Y - 1) / r ]
*/
public static void main(String[] args) {
BigDecimal balance = CompoundInterestCalc.calculate("10000.00", ".08", 10, "1000");
System.out.println(balance);
}
public static BigDecimal calculate(String principal, String rate, int period, String contribution){
BigDecimal a = BigDecimal.ONE.add(new BigDecimal(rate)); // (1 + r)
BigDecimal b = a.multiply(new BigDecimal(period)); // (1 + r)Y
BigDecimal c = b.subtract(BigDecimal.ONE); // ((1 + r)Y -1)
BigDecimal d = c.divide(new BigDecimal(rate)); // ((1 + r)Y -1) / r
BigDecimal e = d.multiply(new BigDecimal(contribution)); // c[((1 + r)Y -1) / r ]
BigDecimal f = a.multiply(new BigDecimal(principal)).multiply(new BigDecimal(period));
BigDecimal g = f.add(e);
return g;
}
}
230500.0000
=> works !
사실 붙여넣기한 formula에서 Y가 multiplied 된 게 아니고 exponent되었던 것이기 때문에 수정이 필요
import java.math.BigDecimal;
public class CompoundInterestCalc {
/**
* Balance(Y) = P(1 + r)Y + C[ ((1 + r)Y - 1) / r ]
*/
public static void main(String[] args) {
BigDecimal balance = CompoundInterestCalc.calculate("10000", ".08", 10, "1000");
System.out.println(balance);
}
public static BigDecimal calculate(String principal, String rate, int period, String contribution){
BigDecimal a = BigDecimal.ONE.add(new BigDecimal(rate)).pow(period); // (1 + r)^period
BigDecimal c = a.subtract(BigDecimal.ONE); // ((1 + r)Y -1)
BigDecimal d = c.divide(new BigDecimal(rate)); // ((1 + r)Y -1) / r
BigDecimal e = d.multiply(new BigDecimal(contribution)); // c[((1 + r)Y -1) / r ]
BigDecimal f = a.multiply(new BigDecimal(principal)); // (1+r)^period * principal
BigDecimal g = f.add(e);
return g;
}
}
36075.81243863770071040000
표현되는 숫자 format해주기
간단한 모듈을 사용할 수 있는데
지역에 따라 해당 지역에 맞는 currency를 반환해준다.
public static void main(String[] args) {
NumberFormat moneyFormatter = NumberFormat.getCurrencyInstance();
BigDecimal balance = CompoundInterestCalc.calculate("10000", ".08", 10, "1000");
System.out.println(moneyFormatter.format(balance));
}
₩36,076
변경하기
NumberFormat moneyFormatter = NumberFormat.getCurrencyInstance(Locale.US);
$36,075.81
그런데 만약 이 formatter 배치를 좀 더 효율적으로 하려면 ?
+
실제 돈을 넣고 계산해보는 것처럼 만들려면 ?
리팩터 기능에서 field를 선택하고
field declaration으로 선택 후 hit enter
that way we can use this moneyFormatter everywhere in the code
또한 이렇게 함으로써 표현이 맞추어지기 때문에 변수도 조절해주어야 한다.
소숫점 자리 표현 해주기
public static void main(String[] args) throws ParseException {
DecimalFormat df = new DecimalFormat("#.##");
BigDecimal balance = CompoundInterestCalc.calculate("$10,000", ".08%", 10, "$1,000");
System.out.println(df.format(balance));
}
20116.37
public static void main(String[] args) throws ParseException {
DecimalFormat df = new DecimalFormat(",###.##");
BigDecimal balance = CompoundInterestCalc.calculate("$10,000", ".08%", 10, "$1,000");
System.out.println(df.format(balance));
}
20,116.37
만약에 마이너스를 표현하고 싶다면 ?
public static void main(String[] args) throws ParseException {
DecimalFormat df = new DecimalFormat("$#,###.##;$(#)");
BigDecimal balance = CompoundInterestCalc.calculate("$10,000", ".08%", 10, "$1,000");
System.out.println(df.format(balance.negate()));
}
$(20,116.37)
패딩을 주는 방법
DecimalFormat df = new DecimalFormat("$#,###.00;$(#)");
퍼센트에 format을 주고 싶다면
public static void main(String[] args) throws ParseException {
DecimalFormat pf = new DecimalFormat("#%");
System.out.println(pf.format(0.08));
}
또하나의 방법은 printf()를 쓰는 것.
System.out.printf("$%,(.2f\n",balance);
$20,116.37
wrapper
아래와 같은 형식으로 유저 인풋을 받을 수 있다.
public class wrapper {
public static void main(String[] args) {
int age = Integer.parseInt(args[0]);
System.out.printf("you will be %d years", age + 10);
}
}
Numeric wrapper 를 사용하는 예시
public class wrapper {
public static void main(String[] args) {
int num1 = 7;
Integer num1B = Integer.valueOf(num1); // auto-boxing
Double myDouble = Double.valueOf("2343.12");
Float myFloat = Float.valueOf("23.23f");
Byte myByte = Byte.valueOf("23");
storeDate(num1);
}
public static void storeDate(Object obj){}
}
These wrapper types are particularly useful when you nee to pass a primitive
to method that is expecting object or vice versa.
storeData 함수는 takes in any of data and stores it somewhere generically