-
이것이 자바다 | 3강_연산자JAVA/이것이 자바다 2022. 1. 13. 17:55
연산자
- 대부분의 연산자: 왼쪽에서 오른쪽
- 단항 연산자, 부호 연산자, 대입 연산자: 오른쪽에서 왼쪽
연산자 우선순위
- 단항>이항>삼항 연산자
- 산술>비교>논리>대입 연산자
-short타입 값을 부호 연산하면 int타입으로 됨
short s = 100; short result = -s; //컴파일 에러
-올바르게 고친 코드
short s = 100; int result = -s;
증감 연산자
package chap03; public class chap03_1 { public static void main(String[] args) { int x = -100; int result1 = +x; int result2 = -x; System.out.println("result1 =" + result1); System.out.println("result2 =" + result2); short s = 100; //short result3 = -s; //컴파일 에러 int result3 = -s; System.out.println("result3=" + result3); } }
논리 부정 연산자
package chap03; public class chap03_2 { public static void main(String[] args) { boolean play = true; System.out.println(play); play = !play; System.out.println(play); play = !play; System.out.println(play); } }
비트 반전 연산자
byte v1 = 10; byte v2 = ~v1; //컴파일 에러 int v2 = ~v1; //-11 (정상작동)
byte v1 = 10; int v2 = ~v1 + 1; //-10
Integer.toBinaryString()
- 정수값을 총 32비트의 이진 문자열로 리턴하는 메소드
- 앞의 비트가 모두 0이면 0은 생략되고 나머지 문자열만 리턴 ->
- 32개의 문자열을 얻기 위해서는 아래의 메소드 필요
public static String toBinaryString(int value) { String str = Integer.toBinaryString(value); while(str.length() < 32) { str = "0" + str; } return str; }
비트 반전 연산자
package chap03; public class chap03_3 { public static void main(String[] args) { int v1 = 10; int v2 = ~v1; int v3 = ~v1 + 1; System.out.println(toBinaryString(v1) + "(십진수:" + v1 + ")"); System.out.println(toBinaryString(v2) + "(십진수: " + v2 + ")"); System.out.println(toBinaryString(v3) + "(십진수: " + v3 + ")"); System.out.println(); int v4 = -10; int v5 = ~v4; int v6 = ~v4 + 1; System.out.println(toBinaryString(v4) + " (십진수: " + v4 + ")"); System.out.println(toBinaryString(v4) + " (십진수: " + v5 + ")"); System.out.println(toBinaryString(v4) + " (십진수: " + v6 + ")"); } public static String toBinaryString(int value) { String str = Integer.toBinaryString(value); while(str.length() < 32) { str = "0" + str; } return str; } }
산술 연산자
- 피연산자가 모두 정수타입, int타입보다 크기가 작은 타입 -> int타입으로 변환 후, 연산 => 산출 타입은 int
- 피연산자가 모두 정수 타입, long타입 존재 -> long타입으로 변환 후, 연산 => 산출타입은 long
- 피연산자 중 실수타입(float, double)이 존재 -> 크기가 큰 실수 타입으로 변환 후 연산 => 산출 타입은 실수 타입
char 타입 연산
package chap03; public class chap03_4 { public static void main(String[] args) { char c1 = 'A' + 1; char c2 = 'A'; //char c3 = c2 + 1; //컴파일 에러(int타입을 char타입 변수에 대입할 수 없기 때문) char c3 = (char) (c2 + 1); //강제 타입 변환 System.out.println("c1: " + c1); System.out.println("c2: " + c2); System.out.println("c3: " + c3); } }
산술 연산 전에 오버플로우 탐지
package chap03; public class chap03_5 { public static void main (String[] args) { try { int result = safeAdd(2000000000, 2000000000); System.out.println(result); } catch(ArithmeticException e) { //예외처리 System.out.println("오버플로우가 발생하여 정확하게 계산할 수 없음"); } } public static int safeAdd(int left, int right) { if((right>0)) { if(left>(Integer.MAX_VALUE - right)) throw new ArithmeticException("오버플로우 발생"); } return left + right; } }
NaN Infinity 연산
5 / 0.0 // Infinity 5 % 0.0 // NaN
"NaN"을 체크하고 연산 수행
// "NaN" 문자열의 문제점 package chap03; public class chap03_6 { public static void main(String[] args) { String userInput = "NaN"; double val = Double.valueOf(userInput); //Double.valueOf 메소드에 의해 double타입 NaN으로 변환 double currentBalance = 10000.0; currentBalance = 10000.0; currentBalance += val; System.out.println(currentBalance); } }
*Double.isNaN() 메소드 이용 -> val의 값이 NaN인지 검사, ==연산자 이용하면 안 됨 (NaN은 != 연산자를 제외한 모든 연산자 사용할 경우false 리턴함)
문자열 연결 연산자
//문자열 연결 연산자 package chap03; public class chap03_7 { public static void main(String[] args) { String str1 = "JDK" + 6.0; String str2 = str1 + " 특징"; System.out.println(str2); String str3 = "JDK" + 3 + 3.0; String str4 = 3 + 3.0 + "JDK"; System.out.println(str3); System.out.println(str4); } }
0.1 과 0.1f
0.1 == 0.1f -> false
false인 이유 : 이진 포맷의 가수를 사용하는 모든 부동소수점 타입은 0.1을 정확히 표현할 수 없어서 0.1f 는 0.1의 근사값으로 표현되기 때문
문자열 비교
package chap03; public class chap03_8 { public static void main(String args[]) { String strVar1 = "신민철"; String strVar2 = "신민철"; String strVar3 = new String("신민철"); System.out.println(strVar1 == strVar2); System.out.println(strVar1 == strVar3); System.out.println(); System.out.println(strVar1.equals(strVar2)); System.out.println(strVar1.equals(strVar3)); } }
삼항 연산자
package chap03; public class chap03_9 { public static void main(String[] args) { int score = 85; char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C'); System.out.println(score + "점은 " + grade + "등급입니다."); //85점은 B등급입니다. } }
'JAVA > 이것이 자바다' 카테고리의 다른 글
이것이 자바다 | 5강_참조타입 (0) 2022.01.25 이것이 자바다 | 4강_연습문제 (0) 2022.01.24 이것이 자바다 | 4강_조건문과 반복문 (0) 2022.01.17 이것이 자바다 | 2강_변수와 타입 (0) 2022.01.09 이것이 자바다 | 1강_자바 시작하기 (0) 2022.01.07