본문 바로가기

Java

java - 산술연산자, 비교연산자

19.11.20. 산술연산자, 비교연산자

베이직자바

2019-11-21 01:15:30


▶산술 연산자

- + : 더하기
- - : 빼기
- * : 곱하기
- / : 나누기
- % : 나머지


이항 연산자는 양쪽의 피연산자의 데이터 타입이 일치해야 연산이 가능하다.

수학과 같이 *, /,% 연산자가 +, - 보다 연산의 우선순위가 높다.

우선순위가 동일할 경우 왼쪽부터 연산이 수행된다.

 

-접미사가 붙지 않은 정수는 int 타입이다.
-접미사가 붙지 않는 실수는 double 타입이다.
-작은 쪽에서 큰 쪽으로 데이터 타입이 변할 때에는 생략 가능.
-피연산자의 타입이 서로 다를 경우 표현범위가 큰 쪽으로 형 변환 후 연산이 수행된다.
-따라서 연산의 결과도 표현범위가 큰 쪽의 타입이 된다.
-데이터가 담겨있는 변수의 데이터 타입이 연산 결과의 데이터 타입과 다를 경우 형 변환이 필요하다.
-연산 결과를 형 변환하기 위해서는 연산 부분은 소괄호로 묶어야 한다.
-int보다 작은 정수타입은 int 로 형 변환 후 연산이 수행된다.

(프로그램 자체가 4byte 이상부터 연산이 가능하도록 되어있다고 함. )

 

i = i + 1;
i += 1;

복합 연산자. 위에 것을 줄여 쓴 것. 연산자가 2개 사용됐다.
더하는 값이 1인 경우에는 더 줄일 수 있다.


++i;       
i++;     

전위형 : 변수가 참조되기 전 수행. 먼저 플러스 한 다음에 읽어오겠다. 

후위형 : 변수가 참조된 후 수행. 먼저 읽은 다음에 플러스 1 할 거야.

 

-숫자 바꾸기
i = i + 2;
i += 2;

 

-연산자 바꾸기

i = i - 1;
i -= 1;

--i;
i--;

i = i * 2;
i *= 2;

i = i /3;
i /= 3;

i = i % 4;
i %= 4;

 

-문제1

다음을 한 줄씩 계산해서 최종 결괏값을 출력해주세요.
1. 123456 + 654321
2. 1번 결과 값 * 123456
3. 2번 결과 값 / 123456
4. 3번 결과 값 - 654321
5. 4번 결괏값 % 123456

 

답 : 

double result = 123456 + 654321;
result = result * 123456;
result /= 123456;
result -= 654321;
result %= 123456;

System.out.println(result);

 

 

문제 2

3개의 int형 변수를 선언 및 초기화 후 합계와 평균을 구해주세요.
(평균은 소수점 둘째 자리에서 반올림.)

 

답 : 

int num1 = 80;
int num2 = 55;
int num3 = 98;

int sum = num1 + num2 + num3;
double avg = (int)(sum/3d * 10 + 0.5) / 10.0;

System.outprintln("합계 : " + sum + " / 평균 : " + avg);

 

▶비교 연산자

- < : 작다
- > : 크다
- <= : 작거나 같다.
- >= : 크거나 같다.
- == :  같다.
- != : 같지 않다.

 

비교 연산자의 결과는 boolean 이다.

산술 연산자와 비교 연산자가 함께 있으면, 산술 연산을 먼저 수행한다.

(= 산술 연산자의 우선순위가 더 높다.)

 

 

-

대소 비교는 boolean을 제외한 기본형 타입만 비교할 수 있지만
등가 비교는 모든 타입을 비교할 수 있다.
b = 'A' == 65;
System.out.println(b);
b= true != false;
System.out.println(b);

-

문자열이 같은 경우 같은 주소를 가진다. 같은 스트링 리터럴은 같은 주소를 가진다 
b= "abc" == "abc";
System.out.println(b);

-
문자열이 같으면 같은 주소를 가지는데,  new 은 새로운 주소를 만드는 거야.
참조형 타입은 저장된 메모리 주소를 비교하기 때문에,
String은 등가 비교 연산자로 내용을 비교할 수 없다.

b = "abc" == new String("abc"); 
System.out.println(b);


-
내용을 비교하기 위한 매서드가 스트링 속에 있다.
b= "abc".equals(new String("abc"));
System.out.println(b);
equals 를 사용하면 String의 내용을 비교할 수 있다.

 

-
b= !"abc".equals("ABC");
같지 않다의 결과를 얻기 위해서는 !(NOT)을 앞에 붙여준다.

 

 

 

*float 과 double

 

b = 10.1f == 10.1;
System.out.println(b);
System.out.printf("%40.39f%n", 10.1f);
f 는 포맷. 21 은 21자리로 표현해줘. 그중 소수점은 20자리.%n은 줄 바꿈.

System.out.printf("%40.39f%n", 10.1);
실수는 값을 정확히 표현하지 못해 근 삿치를 표현한다.
플롯보다는 더블이 좀 더 정확하긴 함.
float과 double은 정밀도가 달라 float 을 double로 형 변환하면
소수점을 정확하게 비교할 수 없다.
double 을 float으로 형 변환해야 정확하게 비교할 수 있다.