Java - 기본기

5. 반올림-Math.round(), 비교, 조건, 논리, 대입, 복합 대입 연산자

TerianP 2021. 9. 16.
728x90

1. 반올림 : Math.round()

Math 라이브러리는 각종 계산 관련 클래스들이 모여있는 라이브러리. 말 그대로 수학 계산을 위한 계산기 라이브러리라고 생각하면 쉬울 듯.

여기서 Math.round() 클래스는 실수를 소숫점 첫 째 자리에서 반올림한 정수를 반환하는 클래스

기본 : Math.round(실수 숫자);

int a = 15;
float b = 3.3f;
float c = a/b;
System.out.println(c); // 결과 : 4.5454545

// 첫 째자리에서 반올림
double d = Math.round(c);
System.out.println(d); // 결과 : 5

// 3번째 자리에서 반올림
float d = Math.round(c*100)/100.0f; // *100 / 100.0 을 하는 이유?

c = 4.5454545 인 상태에서 단순히 Math.round() 만 사용하면 첫째자리에서 반올림 되기 때문에 자연수 5가 출력됨.
이때 c *100 을 하면 454.5454545 가 나오고 여기서 Math.round() 를 사용하면 455 가 출력됨.
이후 다시 /100.0 을 하게되면 4.55가 출력됨. 100.0 인 이유는 int / int 가 아닌 int / float 가 되도록 만들기 위해서
결과적으로 4.5454545 의 소숫점 3번째 자리에서 반올림한 결과가 출력됨

System.out.println(e); // 결과 : 4.55

// 4번째 자리에서 반올림
float e = Math.round(c*1000)/1000.0;
System.out.println(e); // 결과 : 4.545

 

- 번외 : 특정 소숫점 자리수까지만 표현

import java.text.DecimalFormat 사용

DecimalFormat form = new DecimalFormat("#.###"); 
// 클래스 선언 이때 정수부분의 #은 하나만 있어도 십의자리 백의자리 모두 표현 가능, 소숫점 이하 #은 원하는 자리수 까지만 표현하면됨 

double haha = 3.141592;

System.out.println(form.format(result)); // 요런식으로 사용

 

2. 비교 연산자 > < ≥ ≤ == ≠

비교 연산자 연산 결과
> 좌변 값이 크면 true, 아니면 false
< 좌변 값이 작으면 true, 아니면 false
>= 좌변 값이 크거나 같으면 true 아니면 false
<= 좌변 값이 작거나 같으면 true 아니면 false
== 두 값이 같으면 true 아니면 false
!= 두 값이 다르면 true 아니면 false
  • 두 피 연산자(숫자형)를 비교해서 ture참 또는 false거짓을 반환
  • 문자열 비교에는 == 대신 비교 [문자열 변수].equals([비교하고 싶은 문자열 변수]) 를 사용해야 한다.
public static void main(String[] args) {
		String a = new String("하하"); // String 만든는 방식은 이렇게도 사용
		String b = new String("하하");
		
		String str1 = "하하";
		String str2 = "하하";
		
		System.out.println(a==b); // false 출력
		System.out.println(a.equals(b)); // 이렇게하면 true
		
		
		System.out.println();
		System.out.println(str1==str2); // 여기는 true
		System.out.println(str1.equals(str2)); // 여기도 true
		
		System.out.println();
		System.out.println(str1.equals(a)); // 여기는 true
		System.out.println(str1==a); // 여기는 false
	}
  • 왜 == 는 false 가 나오고, equals() 했을 때는 true 가 나오는지에 대한 차이는 쉽게 이야기해서 "내용" 을 비교하는지 아니면 "주소값"을 비교하는지에 따라 차이가 있다고 한다.

' == '연산자의 경우에는 비교하는 피 연산자의 주소값을 비교해서 결과를 출력하는 반면, equals() 는 단순히 주소값이 아니라 피 연산자의 "내용"을 비교해서 출력한다고 생각하면 된다.

이때 또 한 가지 추가로 알 수 있는 것은 String a = "하하" 라고 선언 했을 때와 String a = new String("하하") 라고 선언 했을 때가 서로 다른 주소값 갖는다 라는 점인데, 이에 대해서는 나중에 좀 더 적어보도록 하겠다.

 

 

3. 논리 연산자 && ||

조건식을 연결 할 때 사용하는 연산자

  • || (OR 결합) : 피연산자 중 어느 한 쪽이 TRUE면 TRUE 를 결과로 얻는다.
  • && (AND결합) : 피연산자 양쪽 모두 TRUE 이여야 TRUE를 결과로 얻는다.
X Y X || Y X && Y
TURE TRUE TRUE TRUE
TRUE FALSE TRUE FALSE
FALSE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE

1) X 는 10보다 크고, 20보다 작다.

  • 위 문장은 그리고(AND)로 연결된 조건임으로 다음과 같이 표현이 가능하다 ⇒ 10<X && X<20

2) I 는 2의 배수 또는 3의 배수이다.

  • 어떤 수가 의 배수라는 얘기는 2로 나누었을 때 나머지가 0이라는 뜻이다. 그래서 나머지 연산의 결과가 0인지 확인하면 된다. '또는' 으로 두 조건이 연결되었으므로 논리 연산자 '||' 를 사용해야 한다 ⇒ I%2==0 || I%3==0
  • 번외 : 만약 2와 3의 공배수를 찾는 경우라면 아래와 같이 표현이 가능하다. 코드로는 이렇게 표현이 가능 할 듯?
static void calculation() {
		int i;
		
		for(i=1; i<20; i++) {
			if(i%2==0 && i%3==0) {
				System.out.println(i);
			}
		}
	}

3) i 는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.

  • 2의 배수 또는 3의 배수 조건에 6의 배수가 아니라는 조건이 하나 더 붙었다. 이는 곧 i%6≠0 의 의미이고 이 조건을 && 로 연결해야 한다. ⇒ (i%2==0 || i%3==0) && i%6≠0
  • 이때 괄호를 넣은 이유는 && 가 || 보다 우선순위가 높기 때문이다. 만약 괄호가 없다면 && 를 먼저 연산하게 된다.

4) 문자 ch 는 숫자 '0' ~ '9' 이다.

  • 사용자로부터 입력된 문자가 숫자 0 ~ 9 인지 확인하는 식은 다음과 같이 쓸 수 있다.
    • '0' ≤ ch && ch≤'9'
  • 유니코드에서 문자 0 부터 9 까지 연속적으로 배치되어 있기 때문에 가능한 식이다. 문자 '0' 부터 '9' 까지의 유니코드에 대한 내용은 전 글을 참고한다.

5) 문자 ch 는 대문자 또는 소문자 이다.

앞서 4) 와 마찬가지로 문자 'a' 부터 'z' 까지, 그리고 'A' 부터 'Z' 까지도 연속적으로 배치되어 있으므로 문자 ch 가 대문자 또는 소문자인지 확인하는 식은 다음과 같이 쓸 수 있다.

  • ('a' ≤ ch && ch ≤ 'z') || ('A' ≤ ch && ch ≤ 'Z')

4. 논리 부정 연산자 !

true 를 false 로 , false 는 true 로 바꾼다.

  • boolean b = true; , !!b → !!true → !false → true
  • 'ch' < 'a' || ch > 'z' == !('a' ≤ ch && ch ≤ 'z')

 

5. 조건 연산자 ? :

  • 조건식의 결과에 따라 연산 결과를 달리한다.
  • 유일한 3할 연산자
    • 조건식 ? 식1 : 식2 ⇒ 참이면 '식1' 계산 출력 , 거짓이면 '식2' 계산 출력
    • result = (x > y) ? x : y; // 괄호 생략 가능 ⇒ 만약 true 면 result = x , false 면 result = y
static int tree_calculation() {
		int x = 5;
		int y = 6;
		int result;
		
		result = (x>y)?x:y;
		return result;
	}

System.out.println(tree_calculation()); // result = 6

 

6. 대입 연산자 =

  • 오른쪽 피연사자를 왼쪽 피연산자에 저장 후 저장된 값을 반환
  • 모든 연산자는 결과값을 반환
  • 오른쪽에서 왼쪽으로 연산 진행!!!
  • lvalue : 대입 연산자의 왼쪽 피연산자 ⇒ 변수, 배열 등의 저장 공간이 와야함.
  • rvalue : 대입 연산자의 오른쪽 피연산자

 

7. 복합 대입 연산자

대입 연산자와 다른 연산자를 하나로 축약

op= =
i +=3; i = i + 3;
i -=3; i = i -3;
i *=3; i = i*3;
i /=3; i = i/3;
i %=3; i = i%3;
i <<=3; i = i << 3;
i >>=3; i = i >>3;
i &=3; i = i & 3;
i ^=3; i = i ^ 3;
i |=3; i = i | 3;
i *=10+j;    // 매우매우 중요 i = i*(10+j); // 매우매우 중요

댓글