[출처] 자바의 정석 3판 연습문제 Chapter 3
모르거나 헷갈리는 문제의 풀이를 정리해봄
3-1) 다음 연산의 결과를 적으시오.
class Exercise3_1 {
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);
}
}
System.out.println(y >= 5 || x < 0 && x > 2);
* 풀이)
위의 식은 'true || false && false'가 된다.
&& 연산자가 || 연산자보다 우선순위가 높으므로 &&연산자를 먼저 연산함.
false && false 이므로 연산 결과는 false가 되고
true || false 의 결과는 true가 되어 정답은 true가 된다.
System.out.println('C'-c);
* 풀이)
이항연산자는 피연산자가 int보다 작은 타입(byte, short, char)인 경우 int로 변환한 다음에 연산을 수행한다.
int로 변환한 계산은 67 - 65가 되고 정답은 2가 된다.
System.out.println('5'-'0');
* 풀이)
역시 이항연산자 계산이므로 각각 53과 48이 되어 정답은 5가 된다.
System.out.println(++c);
* 풀이)
++는 단항연산자 이므로 c가 int로 형변환 되지 않는다.
따라서 형변환되지 않고 문자의 형태로 출력하게 되고 c가 'A' 였으므로 문자코드 값이 1 증가하여 'B'가 된다.
정답은 B이다.
3-7) 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드, 변환 결과값은 소수점 셋째자리에서 반올림 해야한다.
Math.round()를 사용하지 않고 처리할 것
class Exercise3_7 {
public static void main(String[] args) {
int fahrenheit = 100;
float celcius = (int)((5/9f * (fahrenheit - 32))*100 + 0.5) / 100f;
System.out.println("Fahrenheit:"+fahrenheit);
System.out.println("Celcius:"+celcius);
}
}
*풀이)
일단 주어진 조건으로 계산식을 세운다. -> (fahrenheit - 32)*5/9f
소수점 셋째자리에서 반올림을 하는 방법은 다음과 같다.
1. 값에 100을 곱한다.
-> 37.77778 * 100
2. 1의 결과에 0.5를 더한다.
-> 3777.778 + 0.5 -> 3778.278
3. 2의 결과를 int타입으로 변환한다.(소수점을 버리기 위해)
(int)3778.278 -> 3778
4. 3의 결과를 100f로 나눈다.(100으로 나눠버리면 소수점 아래의 값이 버려지기 때문에)
3778 / 100f -> 37.78
3-8) 올바르게 계산하기
class Exercise3_8 {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
char ch = 'A';
ch = (char)(ch + 2);
float f = 3 / 2f;
long l = 3000 * 3000 * 3000L;
float f2 = 0.1f;
double d = 0.1;
boolean result = (float)d==f2;
System.out.println("c="+c);
System.out.println("ch="+ch);
System.out.println("f="+f);
System.out.println("l="+l);
System.out.println("result="+result);
}
}
*풀이)
이항연산은 두 피연산자의 타입을 일치시킨 후 연산을 수행한다는 것, 그리고 int보다 작은 타입은 int로 자동변환한다는것은 반드시 기억하고 있어야 하는 중요한 내용이다! ★★★
byte c = a+b; -> byte c = (byte)(a+b);
a와 b가 모두 byte 타입이므로 이항연산을 할 때 int로 변환된다.
따라서 a+b를 다시 byte로 형변환 해줘야 한다.
ch = ch + 2; → ch = (char)(ch + 2);
이항연산에서 ch가 int로 변환되므로 다시 연산 결과를 char 타입으로 형변환 해줘야 한다.
boolean result = d==f2; → boolean result = (float)d==f2;
비교연산자도 이항연산자이므로 타입을 맞춰줘야 하는데 double과 float의 연산은 float가 double로 자동형변환 된다
그렇게 되면 값에 손실이 생길 수 있기 때문에
double을 float로 형변환 시켜서 정확한 결과를 얻을 수 있게 해준다.
3-10) 문자 ch에 저장된 문자가 대문자인 경우, 소문자로 변경해서 출력하는 코드 작성.
class Exercise3_10 {
public static void main(String[] args) {
char ch = 'A';
char lowerCase = ('A' <= ch && ch <= 'Z') ? (char)(ch+32): ch;
System.out.println("ch:"+ch);
System.out.println("ch to lowerCase:"+lowerCase);
}
}
*풀이)
ch가 대문자인 경우에만 32를 더해줘서 소문자로 만들면 된다.
이 때 이항연산을 해야 하므로 ch+32의 값을 다시 char로 형변환 해주면 된다.
[출처] 자바의 정석 3판 연습문제 Chapter 3
'Java > Java의 정석 연습문제 오답노트' 카테고리의 다른 글
220326 Java - Chapter 8 연습문제 (0) | 2022.03.29 |
---|---|
220326 Java - Chapter 7 연습문제 (0) | 2022.03.26 |
220323 Java - Chapter 6 연습문제 (0) | 2022.03.23 |
220319 Java - Chapter 5 연습문제 (0) | 2022.03.19 |
220318 Java - Chapter 4 연습문제 (0) | 2022.03.19 |