[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일
댓글남기기