[Java 기본 원리] 헷갈리는 연산자와 소수점, 날짜 계산
Java의 연산자 우선순위와 헷갈리는 논리/비트 연산, 소수점 처리, 날짜 계산 방법을 상세히 알아보자. 🔍
연산자 우선순위 💡
연산자 순위 고려 예시
// 시프트 연산 vs 나눗셈
int result = 8 >> 1 / 6; // 8 (시프트보다 나눗셈이 먼저)
// 계산과정: 8 >> (1/6) = 8 >> 0 = 8
연산자 우선순위 표
우선순위 | 연산자 | 설명 |
---|---|---|
1 |
() , []
|
괄호/대괄호 |
2 |
! , ~ , ++ , --
|
부정/증감 연산자 |
3 |
* , / , %
|
곱셈/나눗셈 연산자 |
4 |
+ , -
|
덧셈/뺄셈 연산자 |
5 |
<< , >>
|
비트단위 시프트 연산자 |
6 |
< , <= , > , >=
|
관계 연산자 |
7 |
== , !=
|
등호 연산자 |
8 |
& , ^ , |
|
비트단위 논리 연산자 |
9 |
&& , ||
|
논리 연산자 |
10 | ? : |
삼항 연산자 |
11 |
= , += , -= , *= , /= , %= 등 |
대입 연산자 |
헷갈리는 논리, 비트 연산자 ⚡
&, |
이 논리 연산자와 비트 연산자 둘 다 존재하므로 잘 구분해야 함!
논리 연산자 (&&, || vs &, |)
- A && B : A가 false면 바로 종료
- A & B : A가 false여도 B까지 확인 => 이 특징이 중요!
// 단축 평가
if (num > 0 && checkPositive()) { // num이 0 이하면 checkPositive() 실행 안함
System.out.println("양수입니다");
}
// 전체 평가
if (num > 0 & checkPositive()) { // num이 0 이하여도 checkPositive() 실행함
System.out.println("양수입니다");
}
비트 연산자 (&, |)
예시로 보는 비트 연산
int a = 5; // 0101
int b = 3; // 0011
System.out.println(a & b); // 0001 = 1
System.out.println(a | b); // 0111 = 7
헷갈리는 자바 소수점 처리 ⚡
자바는 3E10
이런 형태로 지수 표기를 함.
보통 간단히 System.out.printf("%.1f", result);
로 해결 함.
소수점 관련 함수
Math.round()와 String.format() 비교
- 공통점: 둘다 소수점 n번째 자리까지 반올림!!
- 차이점: 소수점 뒤의 0 절삭유무
- 참고? 올림 : Math.ceil(), 버림 Math.floor();
// 차이점 - 0 절삭 유무
double test = 3000.000;
System.out.println(Math.round(test*1000)/1000); // 3000
System.out.println(String.format("%.3f", test)); // 3000.000
// 원하는 소수점 n번째 표현은? 아래 예시는 n=3
double pi = 3.141592
System.out.println(Math.round(pi*1000)/1000.0); // 3.142
/*
즉,
3.141592*1000 => 3141.592 여기서 round => 3142
3142/1000.0 => 3.142
*/
날짜 계산 💡
Date.getTime() 활용
계산 과정에서 double 타입으로 해줘야 오차가 거의 없다!!
// 날짜 포맷 지정과 파싱
DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date1 = format.parse("2023/01/01 12:00:00");
Date date2 = format.parse("2023/01/02 12:00:00");
// 날짜 차이 계산
double diffInSeconds = (date2.getTime() - date1.getTime()) / 1000.0; // 밀리초->초
double diffInDays = diffInSeconds / (24 * 60 * 60); // 초->일
System.out.println("날짜 차이: " + diffInDays + "일"); // 1.0일
댓글남기기