[출처] 자바의 정석 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

+ Recent posts