-
[Java 자바] 3. 연산자 ② 이항 연산자, 삼항 연산자Programming/Java 2022. 7. 27. 09:00반응형
연산자 이전글: https://erinh.tistory.com/entry/Java-5-연산자단항-연산자
3-4. 이항 연산자
: 피연산자가 두 개인 연산자
3-4-1. 산술 연산자 ( +, -, * , /, % )
연산식 설명 피연산자 + 피연산자 덧셈 연산 피연산자 - 피연산자 뺄셈 연산 피연산자 * 피연산자 곱셈 연산 피연산자 / 피연산자 좌측 피연산자를 우측 피연산자로 나눗셈 연산 피연산자 % 피연산자 좌측 피연산자를 우측 피연산자로 나눈 나머지를 구하는 연산 🎉 산술연산자는 피연산자들의 타입이 동일하지 않을 경우, 아래 규칙에 따라 피연산자의 타입을 일치 시킨 후 연산 수행
⓵ 피연산자들이 모두 정수 타입이고, int 타입보다 크기가 작을 경우 모두 int 타입으로 변환 후 int 타입으로 산출
ex) byte + byte -> int + int = int
⓶ 피연산자들이 모두 정수 타입이고, long 타입이 있을 경우 모두 long 타입으로 변환 후 long 타입으로 산출
ex) int + long -> long + long = long
⓷ 피연산자 중 실수 타입(float, double)이 있을 경우, 크기가 큰 실수 타입으로 변환 후 연산 및 해당 실수 타입으로 산출
ex) int + double -> double + double = double
[ ❗️Syntax Alert] 산술연산자 규칙에 따른 산출 타입을 지켜주지 않으면 컴파일 에러 발생
- char 타입을 연산할 경우에도 int 값으로 반환하기 때문에 주의!byte b1 = 1; byte b2 = 2; byte sumByte = b1 + b2; // int로 변환되어 산술되고 int값으로 산출되기 때문에 컴파일 에러 발생
// int, double 연산 int int1 = 10; int int2 = 4; int result1 = int1 / int2; // 2 출력 double result2 = int1 / int2; // 2.0 출력(연산 후에 2를 실수화하기 때문에) double result3 = (double)int1 / int2; // 2.5 출력(피연산자 중 하나라도 double이어야 함) // char 연산 char c1 = 'A'; char c2 = 'B'; int i1 = 2; System.out.println(c1 + c2); // 아스키코드값 65 + 66 = 131 출력 System.out.println(c1 + i1); // 아스키코드값 65 + 2 = 67 출력 char c3 = (char)(c1 + i1); System.out.println(c3); // C 출력, 타입 변환을 통해 char형 반환 가능
[ 오버플로우 ]
- 데이터타입을 초과하는 값이 입력될 경우, 데이터 손실이 발생한다.
- 이후, 이런 것을 방지하기 위해 try catch 구문을 통해 오버플로우를 탐지하여 예외처리 할 수 있다.public class OverflowExample { public staic void main(String[] args) { int x = 1_000_000; int y = 1_000_000; int z = x * y; // long으로 받아야 함. int로 받을 경우 값 손실 발생 System.out.println(z); } }
[ 부동소수점 ]
- 정확한 계산을 할 때는 int 타입을 활용하여 계산하는 것이 좋다.
- double 형태를 사용할 경우 부동소수점에 의해 계산에 있어 오차가 발생한다.
(부동소수점이 발생하는 이유: 컴퓨터는 2진수로만 값을 표현하기 때문에 변환 과정에서 오차가 발생)
// double 사용시 int i1 = 1; double d1 = 0.1; int i2 = 7; double result = i1 - (d1 * i2); // 0.29999999999999993 출력
[ NaN과 Infinity 연산 ]
- / 또는 % 연산자 사용시 좌측 피연산자가 정수 타입일 경우 우측 피연산자는 0을 사용할 수 없다.
5 / 0 // ArithmeticException 예외 발생 5 % 0 // ArithmeticException 예외 발생
- 실수 타입인 0.0 또는 0.0f로 나눌 경우 예외가 아닌 Infinity 또는 NaN 이 출력된다.
5 / 0.0 // Infinity, 실수 값을 0으로 나누면 무한히 나누어질 수 있기 때문에 Infinity 출력 5 % 0.0 // NaN, 존재하지 않고, 숫자가 아니기 때문에 NaN(Not a Number) 출력 // 프로그램에서 연산의 결과가 Infinity or NaN인지 확인하는 법 // Double.isInfinite(변수) , Double.isNaN(변수) // 이를 활용해 이후 Double 타입의 인풋을 받을 경우, 입력 값에 오류가 없는지 점검할 수 있다. int x = 5; double y = 0.0; double z1 = x / y; double z2 = x % y; if(Double.isInfinite(z1) || Double.isNaN(z2)) { System.out.println("값 산출 불가"); } else { System.out.println(z1 + z2); }
3-4-2. 문자열 연결 연산자 ( + )
: 문자열을 서로 결합하는 연산자
[ ❗️Syntax Alert] 문자열과 숫자가 혼합된 + 연산식은 피연산자의 위치에 따라 값이 달라질 수 있음.
"Java" + "3.0"; // Java3.0 출력 "Java" + 1 + 2.0; // Java12.0 출력 1 + 2.0 + "Java"; // 3.0Java 출력
3-4-3. 비교 연산자 ( <, <=, >, >=, ==, != )
: 대소 또는 동등 관계를 비교하여 boolean 타입인 true/false를 산출
구분 연산식 설명 동등비교 피연산자1 == 피연산자2 두 피연산자의 값이 같은지 검사 피연산자1 != 피연산자2 두 피연산자의 값이 다른지 검사 크기 비교 피연산자1 > 피연산자2 피연산자1이 큰지를 검사 피연산자1 >= 피연산자2 피연산자1이 크거나 같은지를 검사 피연산자1 < 피연산자2 피연산자1이 작은지를 검사 피연산자1 <= 피연산자2 피연산자1이 작거나 같은지를 검사 - 비교연산자도 연산을 수행하기 위해 피연산자의 타입을 일치시키기 위한 타입 변환이 자동으로 일어난다.
'A' == 65; // true, char타입을 int타입으로 변환 3 == 3.0; // true, int타입을 double타입으로 변환 // 예외! // 0.1f는 이진 포맷의 가수를 사용하는 부동소수점 타입으로 0.1의 근사값으로 표현되어 0.1보다 큰 값이 됨 0.1 == 0.1f; // false // 이를 계산하기 위해서는, double 타입을 강제로 타입 변환을 하여 연산하거나 int로 변환하여 비교해야 함 (float)0.1 == 0.1f; // true (int)(0.1*10) == (int)(0.1f*10); // true
- String 타입 동등비교시에는 equals() 메소드를 사용하는 것이 좋다.
- 동등비교부호로 비교시에는 같은 값이나 false 값이 출력될 수도 있다.
String str1 = "테스트"; String str2 = "테스트"; String str3 = new String("테스트"); str1 == str2; // true (동일 참조값이므로 true) str1 == str3; // false // new로 생성한 새로운 String 객체의 경우 다른 참조값을 생성하기 때문에 str1, str2와는 다른 참조값임 // 따라서, string의 문자열만 비교하고 싶다면 equals() 메소드를 사용해야 한다. str1.equals(str2); // true str1.equals(str3); // true
3-4-4. 논리 연산자 ( &&, ||, &, |, ^, !)
- 논리 연산자의 피연산자는 boolean 타입만 사용 가능
구분 연산식 결과 설명 AND
(논리곱)true &&
또는
&true true 피연산자가 모두 true일 경우에만
연산 결과가 true
* &&는 앞의 값만 보고 결론이 나면 다음 피연산자는 계산하지 않음
* &은 두 피연산자를 모두 평가하여 결과 산출true false false false true false false false false OR
(논리합)true ||
또는
|true true 피연산자 중 하나만 true이면
연산 결과는 true
* ||, |도 &&, &와 같음true false true false true true false false false XOR
(배타적
논리합)true ^ true false 피연산자가 하나는 true, 다른 하나가 false일 경우에만
연산 결과는 truetrue false true false true true false false fakse NOT
(논리부정)! true false 피연산자의 논리값을 바꿈 false true 3-4-5. 비트 연산자 ( &, |, ^, ~, <<, >>, >>>)
- 비트 연산자는 데이터를 비트 단위로 연산한다. 즉, 0과 1이 피연산자가 된다.
- 따라서 정수 타입만 비트 연산을 할 수 있으며, double, float 타입은 연산이 불가하다.
[ 비트 논리 연산자 ( &, |, ^, ~) ]
구분 연산식 결과 설명 AND
(논리곱)1 & 1 1 두 비트 모두 1일 경우에만 연산 결과가 1 1 0 0 0 1 0 0 0 0 OR
(논리합)1 | 1 1 두 비트 중 하나만 1이면 연산 결과는 1 1 0 1 0 1 1 0 0 0 XOR
(배타적
논리합)1 ^ 1 0 두 비트 중 하나는 1이고 다른 하나가 0인 경우
연산 결과 11 0 1 0 1 1 0 0 0 NOT
(논리부정)~ 1 0 보수 0 1 [ ❗️Syntax Alert] 비트연산자는 피연산자를 int 타입으로 자동 타입 변환후 연산 수행하므로, 결과는 int 타입으로 반환된다.
⓵ & (AND) 연산
⓶ | (OR) 연산
⓷ ^ (XOR) 연산
⓸ ~ (보수)
[ 비트 이동 연산자 ( <<, >>, <<< ) ]
구분 연산식 설명 이동
(Shift)a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동
(빈자리는 0으로 채워진다.)a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
(빈자리는 정수 a의 최상위 부호 비트와 같은 값으로 채워진다.)a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
(빈자리는 0으로 채워진다.)3-4-6. 대입 연산자 ( =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= )
: 대입 연산자는 오른쪽 피연산자의 값을 좌측 피연산자인 변수에 저장
구분 연산식 설명 단순 대입 연산자 변수 = 피연산자 우측의 피연산자의 값을 변수에 저장 복합 대입 연산자 변수 += 피연산자 변수 = 변수 + 피연산자 변수 -= 피연산자 변수 = 변수 - 피연산자 변수 *= 피연산자 변수 = 변수 * 피연산자 변수 /= 피연산자 변수 = 변수 / 피연산자 변수 %= 피연산자 변수 = 변수 % 피연산자 변수 &= 피연산자 변수 = 변수 & 피연산자 변수 |= 피연산자 변수 = 변수 | 피연산자 변수 ^= 피연산자 변수 = 변수 ^ 피연산자 변수 <<= 피연산자 변수 = 변수 << 피연산자 변수 >>= 피연산자 변수 = 변수 >> 피연산자 변수 >>>= 피연산자 변수 = 변수 >>> 피연산자 [ ❗️Syntax Alert] 대입연산자는 모든 연산자들 중에서 가장 낮은 연산 순위로, 제일 마지막에 수행
- 대입연산자는 연산의 진행 방향이 오른쪽에서 왼쪽으로, a = b = c = 5; 는 다음 순서로 진행.
3-5. 삼항 연산자
- 세 개의 피연산자를 필요로 하는 연산자
- ? 앞의 조건식에 따라 콜론(:) 앞 뒤의 피연산자가 선택된다고 해서 조건연산식이라고도 불림
- if 문으로 변경 사용 가능하나, 한 줄에 간단하게 작성할 때 사용하면 유용
// 문법 // 조건식 ? true일때실행할코드 : false일때실행할코드 int score = 95; char grade = (score > 90) ? 'A' : 'B';
반응형'Programming > Java' 카테고리의 다른 글
[Java 자바] 4. 조건문과 반복문 ② 반복문, for문, while문, do-while문 (0) 2022.07.30 [Java 자바] 4. 조건문과 반복문 ① 조건문, if, if-else, else if, switch (0) 2022.07.30 [Java 자바] 3. 연산자 ① 연산자 우선순위, 단항 연산자 (0) 2022.07.26 [Java 자바] 2. 변수와 타입 ② 데이터 타입, 타입 변환 (0) 2022.07.26 [Java 자바] 2. 변수와 타입 ① 변수의 선언, 사용, 읽기 (0) 2022.07.26