이것이 자바다 확인 문제 풀이 3장, 챕터3, Chapter3
[신용권의 이것이 자바다 챕터 3 연산자 확인 문제 풀이]
문제1 답: ③
연산식은 하나 이상의 값을 산출 할 수 없다. 예를 들어, 1+1은 무조건 2만 가능하다. 1==3의 결과는 무조건 false이다.
문제2 답: 31
++x의 x는 바로 +1이 적용되어서 11이고
y--의 y는 이후 -1이 적용되어서 여전히 20이다.
11+20을 하므로 31이 답이다.
public class Exercise02 {
public static void main(String[] args) {
int x = 10;
int y = 20;
int z = (++x) + (y--);
System.out.println(z);
}
}
문제3 답: 가
삼항 연산은 아래처럼 진행된다.
(조건)? 맞을때의결과 : 아닐때의결과
!score>90 이 조건이다 : 90을 넘지 않는지를 보아야 한다.
score은 85이므로 조건에 충족하여 "가"를 출력해야한다.
public class Exercise03 {
public static void main(String[] args) {
int score = 85;
String result = (!(score>90))? "가":"나";
System.out.println(result);
}
}
문제4 답:
#1 몫을 구하는 것이니까: pencils/student (순간 파이썬 문법으로 //라고 쓸 뻔)
#2 나머지를 구하는 것이니까: pencils%student
public class Exercise04 {
public static void main(String[] args) {
int pencils = 534;
int students = 30;
int pencilsPerStudent = ( pencils / students );
System.out.println(pencilsPerStudent);
int pencilsLeft = ( pencils % students );
System.out.println(pencilsLeft);
}
}
문제5 답: value/100*100
문제6 답: - double area = (lengthTop + lengthBottom)*height*0.5
곱하기 0.5가 아니라 나누기 2를 해도 되긴 한다. 하지만...
- double area = (double) (lengthTop + lengthBottom)*height/2 → 52.5
- double area = (lengthTop + lengthBottom)*height/2.0 → 52.5
- double area = (lengthTop + lengthBottom)*height/2 → 52.0 (틀린 값 나옴)
int 값들만 가지고 연산을 하는데 52.5라는 소숫점 까지 나타내야 하므로 타입에 신경을 써야한다.
곱하기 0.5를 한다면, 연산식에 하나라도 실수(mistake가 아니라 ㅋㅋ double)가 들어가는 것이므로, 결과가 다 upcasting 된다.
나누기 2.0도 마찬가지다. 2가 아니라 2.0이라고 쓰면 실수가 들어가는 것이다.
하지만, 나누기 2를 한다면 연산식에 float가 하나도 없으므로, (double)이라고 강제 형변환이 필요하다.
public class Exercise06 {
public static void main(String[] args) {
int lengthTop = 5;
int lengthBottom = 10;
int height = 7;
double area = ( (10+5) * 7 / 2.0 );
System.out.println(area);
}
}
문제7 답: true, false
x = 10; y = 5; 라고 했을 때...
(x>7) && (y<==5)는 true 8& true 이므로 결과도 true. &&/AND 연산은 모두 통과해야지 true다
(x%3 == 2) || (y%2 !-1)는 false || false 이므로 결과도 false. ||/OR 연산은 하나만 통과하면 true다
참고로 모두 통과하는 지를 검사하는 AND 연산과 다르게, OR 연산은 하나만 얻어걸리면 true이기 때문에, 뒤에 조건식을 보지 않아도 된다. 하지만 이런식의 효율적인 검사를 위해서는 || 라고 | 한겹이 아닌 || 두겹을 써주어야 한다.
조건1 || 조건2 || 조건3 || 조건4: 실제로 왼쪽부터 검사하여 하나만 true면 더이상 오른쪽 조건식 검사가 없음.
조건1 | 조건2 | 조건3 | 조건4: 무조건 오른쪽 끝까지 다 검사
public class Exercise07 {
public static void main(String[] args) {
int x = 10;
int y = 5;
System.out.println( (x>7) && (y<=5) );
System.out.println( (x%3 == 2) || (y%2 != 1) );
}
}
문제8 답: Double.isNaN(z)
double z = x%y; 단계에서 나누는 y가 0임에도 불구하고 컴파일 에러가 걸리지 않는 다는 것을 참고하자.
이유는 y가 사실 0 정수가 아닌 0.0 실수 이기 때문이다. (만약 0이었다면 arithemetic error를 발생시켰을 것이다)
0.0으로 연산하였기 때문에, 몫은 Infinity가 되고, 나머지는 NaN이 되어버렸다.
public class Exercise08 {
public static void main(String[] args) {
double x = 5.0;
double y = 0.0;
double z = 5 % y;
if( Double.isNaN(z) ) {
System.out.println("0.0으로 나눌 수 없습니다.");
} else {
double result = z + 10;
System.out.println("result: " + result);
}
}
}
※ 출처: 이것이 자바다 신용권의 Java 프로그래밍 정복 - 한빛미디어