Java의 정석 Chapter3 연습문제

Geun Bo Kim·2023년 3월 8일
0
post-thumbnail

* 자바의 정석 공부 및 연산자에 관한 연습문제 풀이

Chapter3 연습문제 [3-1 ~ 3-6]

[3-1] 다음 중 형변환을 생략할 수 있는 것은? (모두 고르시오)

1.b = (byte)i; 2.ch = (char)b; 3.short s = (short)ch;

4.float f = (float)|; 5.short s = (short)ch;

답:4,5

풀이 :

  • byte < int 이므로, 형변환 생략 불가.
  • byte < char 이므로, 형변환 생략 가능.
  • char의 범위는 0 ~ 65535,
  • short의 범위는 -32768 ~ 32767로 다르기 때문에 형변환 생략불가.
  • long < float 이므로, 형변환 생략 가능.
  • char < int 이므로, 형변환 생략 가능.

[3-2] 다음 연산의 결과를 적으시오.

class Exercise3_2 {
	public static void main(String[] args) {
		int x = 2;
		int y = 5;
		char c = 'A'; // 'A' 65 의 문자코드는
        System.out.println(1 + x << 33);
        System.out.println(y >= 5 || x < 0 && x > 2);
        System.out.println(y += 10 - x++);
        System.out.println(x+=2);
        System.out.println( !('A' <= c && c <='Z') );
        System.out.println('C'-c);
        System.out.println('5'-'0');
        System.out.println(c+1);
        System.out.println(++c);
        System.out.println(c++);
        System.out.println(c);
	}
}```

[3-3] 아래는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 '456'이라면 '400'이 되고, '111'이라면 '100'이 된다. (1)에 알맞은 코드를 넣으시오.

class Exercise3_3 {
	public static void main(String[] args) {
		int num = 456;
		System.out.println(/* (1) */);
	}
}

답: num/100*100

풀이 :

456 / 100 -> 4
4 100 -> 400
111 / 100 -> 1
1
100 -> 100

[3-4] 아래의 코드는 사과를 담는데 필요한 바구니(버켓)의 수를 구하는 코드이다 만일 사과의 수가 123개이고, 하나의 바구니에는 10개의 사과를 담을 수 있다면, 13개의 바구니가 필요할 것이다. (1)에 알맞은 코드를 넣으시오.

class Exercise3_4 {
	public static void main(String[] args) {
		int numOfApples = 123; // 사과의 개수
		int sizeOfBucket = 10; // ( ) 바구니의 크기 바구니에 담을 수 있는 사과의 개수
		int numOfBucket =(/*  (1)   */) ;
		
        System.out.println("필요한 바구니의 수 :"+numOfBucket);
	}
}

답 : numOfApples/sizeOfBucket + (numOfApples%sizeOfBucket > 0 ? 1 : 0)

풀이 :

  • 소수점 첫째 자리에 0.5를 더하면, Math.round는 값을 무조건 올림하여 반환.
  • 삼항연산자를 사용.

[3-5] 아래는 변수 num의 값에 따라 '양수', '음수', '0'을 출력하는 코드이다. 삼항 연사자를 이용해서 (1)에 알맞은 코드를 넣으시오.

Hint:삼항 연산자를 두 번 사용하라.


class Exercise3_5 {
	public static void main(String[] args) {
		int num = 10;
		System.out.println(/*  (1)  */);
	}
}

답 : num > 0 ? " ":(num < 0 ? " " : "0")

풀이 :

  • 연산자를 사용하면 2가지의 경우의 수를 처리할 수 있다.
  • 삼항연산자를 사용하면 3가지 경우의 수를 처리할 수 있다. num의 값이 0보다 크면, '양수'를 출력하지만, num의 값이 0보다 작거나 같으면 괄호안의 삼항연산자가 수행 된다.

[3-6] 아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다. 변환공식이'C=5/9 ×(F - 32)'라고 할 때, (1)에 알맞은 코드를 넣으시오. 단, 변환 결과값은 소수점 셋째자리에서 반올림해야한다. (Math.round()를 사용하지 않고 처리할 것)

public class Exercise3_6 {
    public static void main(String[] args) {
    int fahrenheit = 100;
    float celcius = (/* (1) */);

        System.out.println("Fahrenheit:"+fahrenheit);
        System.out.println("Celcuis:"+celcius);
    
    }
}

답 : (int)((5/9f (fahrenheit - 32))100 + 0.5) / 100f

풀이 :

먼저 화씨를 섭씨로 바꾸는 공식은 '5/9f * (fahrenheit - 32)'이다. 5/9의 결과 는 0이기 때문에 두 피연산자 중 어느 한 쪽을 반드시 float나 double로 해야만 실수 형태의 결과를 얻을 수 있다. 그래서 정수형 리터럴인 9대신 float타입의 리터럴인 9f를 사용 하였다.

  • float celcius = (int)((5/9f (fahrenheit-32)) 100 + 0.5) / 100.0f;

소수점 셋째자리에서 반올림을 하려면 다음의 과정을 거쳐야한다.

    1. 100 . 값에 을 곱한다
      37.77778 * 100
    1. 1 0.5 . 의 결과에 를 더한다
      3777.778 + 0.5 → 3778.278
    1. 2 int . 의 결과를 타입으로 변환한다
      (int)3778,278 → 3778
    1. 3 100f .(100 .) 의 결과를 로 나눈다 으로 나누면 소수점 아래의 값을 잃는다
      3778 / 100f → 37.78

연산자쪽을 공부하며 풀어보면서 현타가 많이왔다... 깊게 갈수록 알아야 할것들이 많지만, 지금은 전체적인 사용법이나
흐름을 이해하는데 더 집중해야겠다.

profile
미래는 개발이다

0개의 댓글