[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일

댓글남기기