국비/Java

2023.02.16 16일차 Java

춘핑이 2023. 2. 16. 17:02

JAVA

2.16 콘솔로 변수 값 출력

Sytsem객체의 out필드가 가지고 있음. 표준 출력스트림로 출력함. 콘솔
자주 사용해서 sysout만쳐도 완성됨.
기본타입 String Object다 가능하다.

2.16.1 println

파라미터 출력 후 엔터 출력
System.out.println("hello");
System.out.println("world");


hello
world

2.16.2 print

파라미터 출력
System.out.print("hello");
System.out.print("world");
helloworld

2.16.3 printf

System.out.printf(문자열 형식, 출력할 값들);

%n, \n: 새로운줄
System.out.printf("새로운 줄 포함%n새 줄에 출력됨");
새로운 줄 포함
새 줄에 출력됨

% [argument index$][flag -,0][width][precision 소수자리수] 반환문자
%시작/ argumentindex 1 $ /'+or-' 정렬/자리수 너비 '숫자'/소수점 자리수 '.숫자' /d형식

%d : 10진법 정수
System.out.printf("10진법 정수 %d", 99);
10진법 정수 99
System.out.printf("%n또 다른 정수 %d", "3000");
conversion에 일치하지않으면 에러남

%f : 10진법 실수
System.out.printf("%n10진법 실수 %f", 3.14);
System.out.printf("%n10진법 실수 %f", 9.999);

%s : 문자열
System.out.printf("%n문자열 %s", "hello");
System.out.printf("%n문자열 %s", "world");
System.out.printf("%n문자열 %s", 3.14); 이건됨 문자열로 만들어서 출력

반환문자의 위치에 출력되고 아규먼트는 순서대로 적용된다.
System.out.printf("%d, %d%n", 3, 5);

argument의 순서를 바꿀 수도 있다.
순서$를 하면 각 순서에 맞게 들어가게 된다.
System.out.printf("나이는 %2$d이고 이름은 %1$s입니다.\n", name, age);

width 출력할때 차지할 문자 칸 수를 말한다.
System.out.printf("%d\n", 300); //300
System.out.printf("%5d\n", 300); // 300 5칸을 차지한다.
System.out.printf("%6s\n", "hello world");
칸수를 넘으면 넘어서 출력한다. 최소한의 칸을 지정하는 것이다.

flag는 -와 0 등을 사용할 수 있다.
- : 왼쪽 정렬
System.out.printf("%d\n", 33); //33
System.out.printf("%5d\n", 33); //_33
System.out.printf("%-5d\n", 33); //33_


0: 0으로 채움(수)
System.out.printf("%05d\n", 99);00099

precision : 소수점 이하 자리수
System.out.printf("%.6f%n", 3.14); //3.140000
System.out.printf("%.3f%n", 3.14); //3.140
System.out.printf("%.3f%n", 3.5555); //3.556

여기작성하는 것들을 format specifiers라고 한다.

3. 연산자

비트 논리 연산자 / 비트 이동연산자 따로 볼사람만 보기

3.1 산술 연산자

+, -, *, /, %

int i1 = 30;
int i2 = 50;

System.out.println(i1 + i2);// 80
System.out.println(i1 - i2);// -20
System.out.println(i1 * i2);// 1500
System.out.println(i1 / i2);// 0 - 정수간의 연산은 결과가 정수
System.out.println(i1 % i2);// 30

정수와 실수의 산술연산의 결과는 실수이다.

int i3 = 10;
double d3 = 3;

System.out.println(i3 + d3);// 13.0
System.out.println(i3 - d3);// 7.0
System.out.println(i3 * d3);// 30.0
System.out.println(i3 / d3);// 3.333

*,/,%가 +,-보다 우선순위가 높다. 사칙연산 규칙을따른다.

int i4 = 5 + 3 / 2; // 6
int i5 = 5 * 3 + 10; // 25
int i6 = 9 + 10 % 3; // 10

3.2 오버플로우와 언더플로우

산술 연산시 오버플로우를 조심해야한다.
overflow : 타입의 최대 허용값 벗어나는것이다.

int a = 1500000000;
int b = 1700000000;

System.out.println(a); //1500000000
System.out.println(b); //1700000000

int c = a + b;
System.out.println(c); //-1094967296 
//Integer가 21억까지 표현가능하기때문임

반대의 경우는 underflow이다.
underflow: 타입의 최소 값 벗어남

int d = -1500000000;
int e = -1700000000;

System.out.println(d); //-1500000000
System.out.println(e); //-1700000000

underflow: 타입의 최소 값 벗어남
int f = d + e;
System.out.println(f); //1094967296

연산에서 이루어지는 오류이다.
우리가 기대하는 값이 아니므로 항상 해당타입의 범위 내에서 연산이 되도록 신경써야한다.
타입을 잘 결정해서 사용해야한다.

3.3 정확한계산은 정수연산으로

실수 연산은 처음부터 근사값으로 저장하기 때문에 정확한 연산이 안될 수도 있다.
실수를 2진법 표현시 다 저장할 수 없어서 근사값을 저장하기 때문이다.

public class C05Double {
    public static void main(String[] args) {
        double a = 0.1; // 2진법 0.00110011001100...
        double b = 0.2; // 2진법 0.00110011...

        double c = a + b;

        System.out.println(c); //0.30000000000000004
    }
}

이를 해결하기 위한 방식 중 하나로 BigDecimal이 있다.
다른 방식으로도 해결이 가능하다.

BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
BigDecimal res = num1.add(num2);
System.out.println(res); //0.3

3.4 나눗셈 연산 후 NaN과 Infinity처리

js에서 Integer와 실수가 나누어지지 않는다. 0으로 나누면 Infinity를 주엇었다.
나눗셈 혹은 나머지연산에서 우측 피연산자가 0일경우 ArithmeticException 예외가 발생한다.

!!!막간 팁!!!
프로그래밍하다가 Exception이 발견되면? 무서워하지말고 메시지를 읽어봐라
어디서 어떤게 발생햇는지 나온다. 클릭하면 위치를 알려주니 그곳으로 가서 해결하자.

실수는 0으로 계산이 가능하다. 의도한거면 의도대로 사용하면된다.
실수를 0으로 나누면 무한대(Infinity)가 나온다. 음수를 나누면 음의 무한대이다.

double a = 0.0;
double b = 3.0;

double c = b / a;
System.out.println(c); //Infinity
s
double d = -3.0;

double e = d /a;
System.out.println(e); // -Infinity

실수를 0으로 나눈 나머지 : NaN

double f = 3.0 % 0.0; //NaN(Not A Number)
System.out.println(f);

무한대이거나 NaN인지 확인하기 위해서는 Double객체의 메소드를 사용하면된다.

//무한대인지 확인하기
boolean isInfinitie1 = Double.isInfinite(c); //boolean 값으로 리턴
System.out.println(isInfinitie1); //true    

//NaN인지확인
boolean isNan = Double.isNaN(f);
System.out.println(isNan) // true;

정수로 나눗셈을 할때 이런 일이 나타나지않도록 잘 설계하자.

3.5 부호 연산자 / 증감연산자

3.5.1 부호연산자

+, - 부호를 바꾸는 연산을 한다.

int x = -100;
x = -x;
System.out.println("x: " + x); //100

byte b = 100;
int y = -b;
System.out.println("y: " + y); //-100

js에서는 +연산자가 String을 숫자로 바꿔주는 연산을 했엇는데
자바에서는 맞지 않는 문법이라 거의 사용할일이 없다.

3.5.2 증감연산자

++ , --
증감연산자가 변수 앞에잇으면 연산후 변수를 리턴
증감연산자가 변수 뒤에 있으면 모든 연산을 끝낸후에 증감한다.

2023.02.16 후기

연산자는 js를 배울때 했던 부분이 많아서 어렵지 않다.