▶ 산술연산자
숫자 연산을 할 수 있는 연산자
<연산자 종류>
+ : 더하기 (산술의 더하기와 문자열 합치기 연산이 가능하다.)
- : 빼기
* : 곱하기
/ : 나누기(몫)
% : 나누기(나머지)
1) 더하기(+)
int num1 = 10;
int num2 = 20;
int result; //연산의 결과를 담을 변수
result = num1 + num2;
System.out.println(result);
result = num2 + 30;
System.out.println(result);
/*
+ 연산기호는 산술의 더하기와 문자열 합치기 연산이 가능하다.
*/
System.out.println("num1:"+10); // 이때 + 기호는 문자열 합치기 연산
System.out.println("abc" + 10 + 20);
System.out.println("abc" + (10 + 20));
2) 빼기(-)
num1 = 5;
num2 = 3;
result = num2-num1;
System.out.println(result);
3) 곱하기
result = num1 * num2;
System.out.println(result);
4) 나누기(/)
num1 = 6;
num2 = 4;
double dResult = num1 / num2;
System.out.println(dResult);
double dResult2 = (double)num1 / num2;
System.out.println(dResult2);
결과는 1.0이 나옴
=, / 연산자가 두개인데 연산자 우선순위로 (int)/(int) 1이 먼저 나오고
이 값을 대입하기 때문에 double로 받더라도 1.0에 담긴다.
1.5로 값을 받으려면 나누는 값 중 최소 1개를 double로 바꿔줘야 한다.
나누기 연산은 연산의 결과를 int/int를 하게되는 경우
소수점을 버린 정수 연산으로 결과를 도출해낸다.
만약 소수점까지 필요한 경우
반드시 피연산자 둘중하나를 실수타입으로 형변환 한 후 사용할 수 있다.
이때 강제 형변환은 필요시 작은타입을 크게도 만들 수 있다.
5) 나머지(%)
나머지 연산은 값을 몫으로 나눈 나머지값을 도출한다.
num1 = 6;
num2 = 4;
result = 6 % 4;
System.out.println(result);
주로 값이 몇의 배수인지 확인할 때 많이 사용하는 연산자
num1 = 7;
if(num1 % 2 == 0) {
System.out.println(num1 + "의 값은 짝수입니다.");
}else {
System.out.println(num1 + "의 값은 홀수입니다.");
}
▶나눗셈 연산시 발생할 수 있는 여러 문제들
- 실수로 나눗셈 연산시 발생
- 실수로 나누기 또는 나머지 연산시 발생
0으로 나눌 경우는 오류가 발생하니 try/catch 로 처리하면 되고
0.0으로 나눌 경우는 0.0은 0.000000001 과 같은 쓰레기값이라
Infinity 가 뜸.
▼ Infinity란,
값을 0.0으로 나눌때 발생하는 알 수 없는 값
double dNum1 = 0.0;
int iNum2 = 10;
System.out.println(iNum2/dNum1);
그러니 밑처럼 검증하기
dResult = iNum2/dNum1;
boolean bResult = Double.isInfinite(dResult);
System.out.println(bResult);
dResult값이 Infinity이면 true, 아니면 false를 반환
▼ NaN란,
값을 0.0으로 나눈 나머지를 구할 때 발생하는 알 수 없는 값
Not a Number
dResult = 10 % 0.0;
System.out.println(dResult);
bResult = Double.isNaN(dResult);
System.out.println(bResult);
dResult값이 NaN이면 true 아니면 false를 반환
단항 연산자는 피연산자의 왼쪽에 위치한다.
부호연산자
- +, - 음수, 양수를 나타내는 연산기호
- 양수를 의미하는 +기호는 우선순위가 제일 높다.
- 부호연산의 처리는 기본 int 타입이다.
int num1 = -10;
int result = -num1;
System.out.println(result);
▶ 증감연산자
- 변수 안의 값을 1씩 증가 또는 1씩 감소시키는 연산자
- ++,-- 기호를 사용함
전위 증가 연산자
num1 = 10;
result = ++num1;
System.out.println(result);
후위 증가 연산자
num1 = 10;
result = num1++; // 1. result = num1 -> 2. num1 = num1 + 1
System.out.println(result);
System.out.println(num1);
num1 = 10;
System.out.println(++num1); // 11
System.out.println(num1++); // 11
System.out.println(num1); // 12
num1 = 10;
System.out.println(--num1); //9
System.out.println(num1--); //9
System.out.println(num1); //8
int x = 14;
int y = 8;
int z = ++x + y++; // 3. =, 1. ++(전위), 2. + , 4. ++(후위)
z = 23;
▼ 오버플로우 : 위로 담을 수 없는 값의 크기
byte bNum = 125;
bNum++; //126
bNum++; //127
bNum++; //128 -> 오버플로우 발생 -> -128
bNum++; //129 -> -127
System.out.println(bNum);
2진수에서는 1 + 1이면 0이 되면서 앞의 한자리를 올리게 됨
1+9 = 10 이 되는것과 같은 원리
127은 0 1 1 1 1 1 1 1
여기서 끝자리의 1에 1을 더하면서 앞의 자리수를 올리니
1 0 0 0 0 0 0 0 으로 바뀌면서 -128이 됨
▼ 언더플로우 : 아래로 담을 수 없는 값의 크기
bNum = -128;
bNum--;
System.out.println(bNum); --> 127
-128은 0 1 1 1 1 1 1 1
여기서 첫자리의 1에 1을 빼면서 뒤의 자리수를 바꾸면서
0 1 1 1 1 1 1 1 으로 바뀌면서 127이 됨
▶비교연산자
- 피연산자와 값 또는 크기를 비교하여 boolean 타입인 true, false를 산출
1)크기비교 연산자
종류 : <, >, <=, >=
피연산자 1번을 기준으로 피연산자 2번의 크기를 비교한다.
int num1 = 10;
int num2 = 20;
boolean result;
result = num1 < num2; // 10 < 20
System.out.println(result);
System.out.println(5 < 10);
result = num1 <= 10;
System.out.println(result);
실수의 크기비교 또는 값의 비교에서는 타입이 다르면
같은 값을 대입하더라도 같다라는 결과가 산출되지 않는다.
float fNum = 3.14f;
double dNum = 3.14;
result = fNum <= dNum;
System.out.println(result);
부동소수점 문제로 float과 double의 값에 같은 값을 쓰더라도 같다고
나오지 않는다.
2)동등비교 연산자
== : 값이 같은지
!= : 값이 같지 않은지
num1 = 65;
char num3 = 'A'; // A에 대한 유니코드값(65)
/*
char 타입은 내부적으로는 유니코드 정수값을 가지므로
정수와 값의 비교가 가능하다
*/
result = num1 == num3;
System.out.println(result);
▼ int와 double 비교
int num3 = 1;
double num4 = 1.0; //double은 정확히 1.0을 갖지 않는다
boolean result5 = (num3 == num4);
/*
int == double 비교시 int는 double로 자동 형변환되며
이때는 같은 double 1.0이기 때문에 같은 값을 갖는다.
*/
System.out.println("result5:" + result5); //true
▼ 문자열 비교
String str1 = "가";
String str2 = new String("가");
System.out.println(str1);
System.out.println(str2);
result = str1 == str2;
System.out.println(result);
결과는 false가 나온다.
String str3 = "가";
result = str1 == str3;
System.out.println("str1과 str3 비교:"+result);
이 경우는 true
new String으로 할 경우 Heap메모리 영역에 저장되고
리터럴을 사용하여 String을 생성할 경우
String constant pool이라는 영역에 생성되기 때문에
문자열은 동등비교 연산자인 == 기호로 비교가 불가능하다.
이 경우 비교할 때는 동등비교 연산자 대신 equals()와 !equals()를 사용
'Java' 카테고리의 다른 글
[Java] 비트연산자 (0) | 2024.07.22 |
---|---|
[Java] 논리연산자 (0) | 2024.07.22 |
[Java] 변수와 타입 (0) | 2024.07.20 |
[Java] 자바 시작 (0) | 2024.07.19 |
[Java] BufferedReader, BufferedWriter (0) | 2024.06.29 |