int x = 10; int y = 10; int z = ++x +1 //현재 z 값 = 12, 연산 후 저장 int k = y++ + 1 //현재 k 값 = 11 연산 전 저장
byte v1 = 10;
//byte v2 = ~v1; // 에러
int v2 = ~v1; // 가능
int → int
float → float
double → double
char c1 = 'A' + 1;
// 유니코드에 1을 더해 c1에 저장. 실행 결과 : B
하지만 이런경우는 문제가 된다.
char c2 = 'A';
// char c3 = c2 + 1; //에러
// c2가 이미 int 타입으로 변환이 된 상태이기 때문에 타입이 달라 에러
이런 경우에는 타입을 강제 변환 후 다시 char 타입으로 얻을 수 있다.
char c3 = (char) (c2 + 1);
// 강제변환 후 계산 가능!
int x = 1000000;
int y = 1000000;
int z = x * y;
//z 값 : -727379968 같은 이상한 값이 나온다
위와 같은 경우. 계산 값이 int 범위를 벗어났기 때문에 코드 자체에 에러는 나지 않지만 올바른 값이 나오지 않는다.
// x와 y 중 하나라도 long 타입이어야 하고
// 변수 z가 long 타입이어야 한다
long x = 1000000;
long y = 1000000;
long z = x * y;
//실행결과 올바른 값이 나온다.
public class chap3_checkOverflowExam2 {
public static void main(String[] args) {
try {
int result = safeAdd(2100000000, 200000000);
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("오버플로우 발생"); // 예외발생코드
}
} else {// right<=0 일 경우
if (left < (Integer.MIN_VALUE - right)) {
throw new ArithmeticException("오버플로우 발생"); // 예외발생코드
}
}
return left + right;
}
}
//5/0 // ArithmeticException 예외 발생
//5%0 // ArithmeticException 예외 발생
//컴파일은 되지만, 실행시 ArithmeticException (예외) 발생
try{
//int z = x / y;
int z = x % y;
//0일 경우 ArithmeticException발생 -> 예외 처리로 가게 됨
System.out.println("z: " +z);
} catch(ArithmeticException e) {
//예외 처리
System.out.println("0으로 나누시면 안됩니다")
}
// 산출 값인 z가 올바른 값이 아니라면
// if문을 사용해 실행 흐름을 변경해야 한다.
if(Double.isNaN(z)||Double.isInfinite(z)){
System.out.println("값 산출 불가");
} else{
System.out.println(z+2);
}
String userInput = "NaN";
double val = Double.valueOf(userInput);
double currentBalance = 10000.0;
if(Double.isNaN(val)) {
//NaN을 검사한다
System.out.println("NaN 입력으로 처리 불가");
//NaN일때 실행되는 코드
val = 0.0;
//변수 val은 NaN이 되는 대신 0.0이 된다.
}
currentBalance += val;
//NaN 대신 0.0이 된 val과 연산되어
//currentBalance 의 원래 값이 유지된다.
System.out.println(currentBalance);
String str1 = "JDK " + 6.0;
String str2 = str2 + " 특징";
//str1 : JDK 6.0
//str2 : JDK 6.0 특징
String str1 = "JDK " + 3 + 3.0;
//str1 : JDK 33.0
String str2 = 3 + 3.0 + " JDK";
//str2 : 6.0 JDK
조건식 ? 값 또는 연산식 : 값 또는 연산식
int score = 95;
char grade = (score>90) ? 'A' : 'B'
//위 식과 아래 if문은 실행 결과가 같다.
int score = 95;
char grade;
if(score>90){
grade = 'A';
} else{
grade = 'B';
}