#3-1 다음 연산의 결과를 적으시오
public class Exercise1 {
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); //true
System.out.println(y += 10 - x++);
System.out.println(x += 2);
System.out.println(!('A' <= c && c <= 'Z')); //false
System.out.println('C' - c); //2 67-65
System.out.println('5' - '0'); //53-48(0)
System.out.println(c + 1); //66
System.out.println(++c); //66 'B'
System.out.println(c++); //66 'B'
System.out.println(c);
}
}
1.
'1+x<<3' 는 x의 값이 2이므로 '1+2<<33'가 된다. 덧셈연산자(+)보다 쉬프트연산자(<<)가 순위가 낮으므로 '
3<<33'이다. int는 32bit이므로 33번 쉬프트하지 않고 1번만 쉬프트한다.
'3<<1'은 3에 '2의 1제곱' 인 2를 곱하는 것과 같은 결과를 얻으므로 '3*2'가 되어 결국 6이 된다.
(왼쪽으로 2번 밀기)
2.
x = 2 , y= 5 라서 이 식은 'true || false && false' 이 된다.
'and(&&)' 'or(||)' 'false && false' 가 되고 최종결과는 가 된다 'true || false' 가 되고 최종 결과는 true
3.
y += 10 -x++를 풀어쓰면, 'y = y+(10 - x++)'이 된다.
x++은 후위형이기 때문에 x의 값이 증가되지 않은 상태에서 (10-x) 는 계산되고 x의 값은 1증가된다.
그래서 (10-2)로 계산되고, x의 값은 1증가하여 3이 된다. y의 값은 5이므로 식은 'y=5+(10-2)' 가 되어 y에 13이 저장된다.
4.
'x+=2'는 'x=x+2'와 같다. 이전의 식에서 x의 값이 1증가하였으므로 이제 x의 값은 3이다. 3+2=5
5.
!('A'<=c&& c<='Z')는 문자 c가 대문자인지 확인하는 식이다.
c가 'A'이므로 'A'<='A' && 'A' <='Z' 가 되고 양쪽 조건식이 true이므로 true && true = true다.
여기에 논리부정연산!을 수행해 true->false로 바뀐다.
6.
이항연산자는 피연산자가 int보다 작은 타입(byte, short, char)인 경우 int로 변환한 다음 연산을 한다.
c의 값이 'A'이므로 'C'-c는 'C'-'A' 가 되고, 이것들이 int로 변환되어 '67-65' 가 되고 결과는 2
7.
'5'-'0'->'53'-48' 이 되어 결과는 5
8.
c+1->'A'+1 . 이항연산자의 성질(int보다 작은 타입은 int로 변환후 연산)때문에
'A'는 65로 변환되어 '65+1'이 되고 66을 결과로 얻는다.
*단지 변수 c에 저장된 값을 읽어서 수식을 계산한 것이므로 변수c의 저장된 값은 아무런 변화가 없다.
9.
단항연산자인 '++'은 이항연산자와 달리 int보다 작은 타입도 형변환을 하지 않는다.
이항 연산자는 연산을 위해 피연산자 스택‘ (operand stack)’ 을 사용하는데 이 과정에서 형변 환이 발생하는 것이다.
반면에 단항연산자인 증가연산자 ++은 피연산자 스택 을 사용하지 않으므로 형변환도 발생하지 않는다.
그래서 println 은 변수 c를 숫자(int) 로 출력하는 것이 아니라 문자로 출력한다.
변수 c에 저장된 문자가 실제로 저장된 것은 'A' ( 'A' 의 문자코드인 65)이므로 문자코드의 값이 1증가되어
66('B')의 문자코드 이 변수 에 저장된다.
변수 c에 저장된 것은 문자코드. 즉 정수값이다. println 은 이 값을 타입에 따라 어떻게 출력할지를 결정한다.
만일 문자타입이면 저장된 값(문자코드) 에 해당하는 문자를 출력하고 숫자라면 숫자로 출력한다.
10.
단항연산자 이 후위형인 경우에는 println()에 의해서 변수c 가 출력된 후에 c에 저장된 값이 증가하므로 문자 'B'가 출력된 후에 변수 c의 값이 1증가해서 문자 'C' 가 저장된다.
11.
위 식 진행 후 마지막 c 값인 'C' 출력
#3-2
아래의 코드는 사과를 담는데 필요한 바구니 버켓 의 수를 구하는 코드이다. 만일 사과의 수가 123개이고 하나의 바구니에는 10개의 사과를 담을 수 있다면 13개의 바구니가 필요할 것이다 (1)에 알맞은 코드를 넣으시오
public class Exercise2 {
public static void main(String[] args) {
int numOfApples = 123;
int sizeOfBucket = 10;
int numOfBucket = numOfApples / sizeOfBucket + ((numOfApples % sizeOfBucket) > 0 ? 1 : 0);
System.out.println("필요한 바구니 수:" + numOfBucket);
}
}
int/int 형은 123/10=12.3이 아닌 정수값만 남기고 버림을 해서 12가 된다. 여기에 소수점이 있다면 바구니가 하나 더 필요하단 뜻이기에, 사과 개수 나누기 바구니크기의 나머지가 0보다 크면 1을 반환해 +해준다.
->((numOfApples % sizeOfBucket) > 0 ? 1 : 0);
#3-3
아래는 변수 num의 값에 따라 ‘양수 ’, ‘음수 ’, ‘0’ 을 출력하는 코드이다.
삼항 연산자를 이용해서 (1) 에 알맞은 코드를 넣으시오 .
public class Exercise3 {
public static void main(String[] args) {
int num =10;
System.out.println(num >0 ? "양수" : (num <0 ? "음수": "0"));
}
}
삼항연산자를 사용하면 2가지 경우의 수를 처리할 수 있다.
삼항연산자에 삼항연산자를 포함시키면 3가지 경우의 수를 처리할 수 있다.
num의 값이 0보다 크면 양수 를 출력하고 끝나지만 num의 값이 0보다 작거나 같으면 괄호안의 삼항연산자가 수행된다 여기서 num의 값이 0보다 작으면 음수 가 출력되고 그렇지 않으면 (num의 값이 이면) '0' 이 출력된다.
#3-4
아래는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 ‘456’ 이면 ‘400’ ,
‘111’ 이면 ‘100’ 된다. (1)에 알맞은 코드를 넣으시오.
답: num/100*100
#3-5
변수 num의 값 중에서 일의 자리를 1로 바꾸는 코드이다. 만일 변수 num의 값이 333이라면 331이 되고, 777이라면 771이 된다. (1)에 코드를 넣으시오.
답
num/10*10+1
#3-6
아래는 변수 num의 값보다 크면서도 가장 가까운 10의 배수에서 변수 num의 값을 뺀 나머지를 구하는 코드이다.
예를 들어, 24의 크면서도 가장 가까운 10의 배수는 30이다. 19의 경우 20이고, 81의 경우 90이 된다. 30에서 24를 뺀 나머지는 6이기 때문에 변수 num의 값이 24라면 6을 결과로 얻어야 한다. (1)에 알맞은 코드를 넣으시오.
답 (num+10)/10*10%num
#3-7
아래는 화씨(Fahrenheit) 를 섭씨(Celcius) 로 변환하는 코드이다.
변환공식이 'C' = 5/9 ×(F - 32)' 라고 할 때 에 알맞은 코드를 넣으시오.
단 변환 결과값은 소수점 셋째자리에서 반올림해야한다 .(Math.round() 를 사용하지 않고 처리할 것 )
답
public class Excercise7 {
public static void main(String[] args) {
int fahrenheit = 100;
float celcius = celcius=(int)(((5/9f*(fahrenheit-32))*100)+0.5)/100f;
System.out.println("Fahrenheit:"+fahrenheit);
System.out.println("Celcius:"+celcius);
}
}
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
아래 코드의 문제점을 수정해서 실행결과와 같은 결과를 얻도록 하시오.
답
public class Exercise8 {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = (byte) (a + b);
// int 보다 작은 타입은 int로 계산되기에 byte로 형변환해준다.
char ch = 'A';
ch = (char) (ch + 2);
// int로 계산되어서 char로 형변환
float f = 3 / 2f; // float로 형변환
long l = 3000 * 3000 * 3000L; // long타입으로 형변환
float f2 = 0.1f;
double d = 0.1;
boolean result = (float) d == f2;
// f2->double은 오차가 있어서 d를 float으로 형변환
// double 값을 유효 자리수가 적은 float으로 형변환
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);
}
}
#3-9
다음은 문자형 변수 ch가 영문자(대문자 또는 소문자)이거나 숫자일 때만 변수 b 의 값이 true가 되도록 하는 코드이다. (1) 에 알맞은 코드를 넣으시오.
답
public class Exercise9 {
public static void main(String[] args) {
char ch = 'z';
boolean b = (('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ('0' <= ch && ch <= '9'));
System.out.println(b);
}
}
#3-10
다음은 대문자를 소문자로 변경하는 코드인데, 문자 ch에 저장된 문자가 대문자인 경우에만 소문자로 변경한다.
문자코드는 소문자가 대문자보다 32만큼 더 크다. 예를 들어 'A'의 코드는 65이고 'a'의 코드는 97이다.
(1)~(2) 에 알맞은 코드를 넣으시오.
답
public class Exercise10 {
public static void main(String[] args) {
char ch = 'A';
char lowerCase = ('A' <= ch && ch <= 'Z') ? (char) (ch + 32) : ch;
// ch에 32 더한후 이 결과가 int이므로 형변환해준다.
System.out.println("ch:" + ch);
System.out.println("ch to lowerCase:" + lowerCase);
}
}
'JAVA > 연습문제' 카테고리의 다른 글
[JAVA] 명품 자바 Open challenge 2 (0) | 2021.06.11 |
---|---|
[JAVA] Java의 정석 chapter 2 변수 (0) | 2021.06.06 |