각종 언어 기본 문법/Java 이것이 자바다 확인 문제 풀이

이것이 자바다 확인 문제 풀이 3장, 챕터3, Chapter3

혀니쌤1 2021. 8. 8. 13:59

[신용권의 이것이 자바다 챕터 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 프로그래밍 정복 - 한빛미디어