• 다음 코드를 실행하면 출력 결과로 5를 기대했는데 4가 출력되었습니다. 어디에서 잘못 작성된 것일까요?
int var1=5;
int var2=2;
double var3=var1/var2;
int var4=(int)(var3*var2);
System.out.println(var4);

 

추측) 

3번째 줄 int를 int로 나누는 식에서 문제가 생겼으리라고 생각된다. 

int인 5를 int인 2로 나누어서 double에 넣었다고 double인 2.5가 되는 것이 아니라 int를 int로 나눈 결과는 소수점 자리를 자른 int인 2가 결과로 나오며 이를 double로 넣어 단순히 2.0이 되었기 때문에 최종 결과값이 4로 나왔으리라 추측된다.

그러면 3번째 줄의 피연산자를 다 double로 바꿔야 할까? 아니다.

참고로 int와 double를 연산시 double이 하나라도 int보다 범위가 큰 double을 기준으로 계산을 한다. 따라서 double이 아닌 전체 피연산자가 double로 전환되어 계산되므로 피연산자중 하나만 double로 변경하면 해결될거라고 생각된다. 

 

작성 소스코드)

int var1=5;
int var2=2;
double var3= (double) var1/var2;
int var4 = (int)(var3*var2);
System.out.println(var4);
// 5

 

리뷰) 

추측이 맞아 수정한 코드에서는 원래 의도한 5라는 값이 나왔다. double 캐스팅 연산자는 var1앞에 붙어도 var2 앞에 붙어도 하나에 붙어있으면 전체식이 double에 맞춰지므로 두 연산자 중 아무것에나 붙여도 원하는 값이 나온다. 

자료타입에 따른 연산의 변화를 인지하고 있지 않으면 풀 수 없는 문제다. 기억이 나질 않는 다면 아래 포스팅 참조.

 

이 포스팅에서 "타입이 동일하지 않을 경우"를 참고하면 된다.

 

002 - P.O. 2Day / 연산자

03-1 / 연산자와 연산식 연산 개념) c = a + b 연산에 사용되는 표시나 기호를 연산자(operator). ( = , + ) 연산자와 함께 연산되는 데이터를 피연산자(operand). ( c, a, b ) 연산자와 피연산자를 이용하여 연

littlezero48.tistory.com

 

 

+ 규리님의 포스팅을 통해 int인 5를 int인 2로 나눴을 때 int로 들어가면서 소수점이 사라지는 것에 대한 것을 기본 데이터 타입의 메모리 공간으로 인한 연산때의 데이터 손실로 이해 할 수 있었다.  다른 사람들이 풀이한 것도 도움이 많이 되는 거 같다. 열심히 참고하자.

 

[항해99] 2주차 [프로그래밍 기초] - 1DAY

항해99 시작주차 2주차 항해일지 <1day - TIL>

velog.io

 

 


  • 다음 코드를 실행했을 때 출력 결과는 무엇입니까? (증감연산자에 대해 알아보세요!)
int x=10;
int y=20;
int z = (++x) + (y--);
System.out.println(z);

 

추측) 

z = 31 이라고 추측! 더하기 연산과 z에 대입되기 전에 x는 먼저 증가되어 11인 상태로 식에 들어오게 되고 y는 더하기 연산과 z에 대입된 이후에 감소되어 z에 영향을 주지 못한채로 식에는 감소전인 20이 대입되어 결과적으로 31이라는 결과가 도출될 것이라고 생각한다.

 

소스코드) 

int x=10;
int y=20;
int z = 0;
z = (++x);
System.out.println(z);
z = (y--);
System.out.println(z);
z = (++x) + (y--);
System.out.println(z);

// 11
// 20
// 31

 

리뷰) 

추측대로 증감 순간의 차이를 인지해야하는 문제. 증감 연산자가 에 나올 경우 다른 연산자를 수행하기 전에 피연산자를 증감시켜 다른 연산을 수행하기 때문에 그 영향이 대입되는 것이고 증감 연산자가 에 나올 경우 다른 연산자가 수행한 후에 피연산자를 증감시키기 때문에 대입 연산자 보다도 뒤에 실행되어 z값에 대입되지 않는다. 

 

위와 동일한 포스팅이지만 이 포스팅에서 "증감 연산자"를 참고하면 된다.

 

002 - P.O. 2Day / 연산자

03-1 / 연산자와 연산식 연산 개념) c = a + b 연산에 사용되는 표시나 기호를 연산자(operator). ( = , + ) 연산자와 함께 연산되는 데이터를 피연산자(operand). ( c, a, b ) 연산자와 피연산자를 이용하여 연

littlezero48.tistory.com

 

지성님이 주신 추가 문제! 출력하지말고 먼저 추측해보기

int x = 1;
int y = 1;
System.out.println(x);			// 1
System.out.println(++x);		// 2
System.out.println(x++);		// 2		
System.out.println(x);			// 3
System.out.println((++x) + y);		// 4 + 1 결과로 5출력
System.out.println((x++) + y);		// 4 + 1 결과로 5출력 그러나 이후 x는 6값으로 증감

추측한 그대로의 결과값을 얻었다! 

 

 


  • while문과 Math.random() 메소드를 이용해서 2개의 주사위를 던졌을 때 나오는 눈을 (눈1, 눈2) 형태로 출력하고, 눈의 합이 5가 아니면 계속 주사위를 던지고, 눈의 합이 5이면 실행을 멈추는 코드를 작성해보세요. 눈의 합이 5가 되는 조합은 (1,4), (4,1), (2,3), (3,2)입니다.

출력예시)

시작!
(3,6)
(2,6)
(1,4)
끝!

 

추측) 

일단 모든 랜덤 숫자를 출력해 (눈1, 눈2) 형태로 계속 뽑을 수 있는 while문을 작성한다. 그리고 if문을 통해 눈1과 눈2의 합이 5면 true인 조건문을 설정하고 실행문에는 while을 빠져나올 수 있는 break를 사용해 while문을 빠져나오게 만들면 될 거 같다.  

 

소스코드) 

int diceNum1 = 0;
int diceNum2 = 0;

while(true){
    diceNum1 = (int)(Math.random() * 6 + 1);
    diceNum2 = (int)(Math.random() * 6 + 1);

    System.out.println("("+diceNum1+","+diceNum2+")");

    if(diceNum1 + diceNum2 == 5){
        break;
    }
}

// (1,5)
// (1,6)
// (4,3)
// (4,1)

 

리뷰) 

문제 처음 볼때 Math.random()이 출력하는 값 형태에 대한 것을 생각하지 못했다. 기억해두자.

Math.random()은 0.0 이상 1.0 미만double형태의 임의값을 출력한다. 이것을 1이상 6이하의 값으로 어떻게 제한 할 것인가 핵심이라고 본다. 단순히 Math.random()에 6만 곱해주는 것으로는 올바르지 않다.

0.0 * 6 <= 나올수 있는 임의 값 < 1.0 * 6
0.0 6.0

주사위에는 0의 값이 없고 함수에서 6미만 작은 수가 나오기 때문에 주사위의 6이 나오지 못한다. 따라서 +1 값을 통해

0.0 * 6 + 1 <= 나올수 있는 임의 값 < 1.0 * 6 + 1
1.0 7.0

1이상 7미만의 double 값을 구하게 된다. 

그리고 이 식을 int 캐스팅 연산자를 사용하여 소수점을 제하여 정수로 바꿔 각각의 눈으로 출력하고 if문으로 조건을 걸어 break식으로 빠져나오게 하면 된다.

 

 

 

 


 

+ Recent posts