티스토리 뷰

language/java

221214 자바 기초 과제

kirinman 2022. 12. 14. 16:59

Q. 다음 코드를 실행하면 출력 결과로 5를 기대했는데 4가 출력되었습니다. 어디에서 잘못 작성된 것일까요?

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

A. var1 과 var2의 타입이 잘못 설정되었다.

해당 변수들에서 정수 타입인 int를 사용하면, var3에서 2.5를 반환하는 것이 아니라 정수 부분인 2만 반환하게 된다.

 

따라서 원하는 값인 5를 얻기 위해서는 아래와 같이 var1과 var2의 타입을 double이나 float로 설정해야 한다.

double var1=5;
double var2=2;
double var3=var1/var2;

int var4=(int)(var3*var2);
System.out.println(var4);

 

 

Q.다음 코드를 실행했을 때 출력 결과는 무엇입니까? (증감연산자에 대해 알아보세요!)

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

A. 증감연산자가 피연산자의 어떤 부분에 붙는지에 대한 문제였다.

먼저 출력 결과는 31이다.

 

- 먼저 x의 경우 증감연산자가 피연산자의 앞부분에 붙는다.

  따라서 먼저 x의 값에 1을 더해준 후에 int z 의 x값에 들어오게 되어, int z에서의 x는 11이 된다. 

 

- y의 경우 증감연산자가 피연산자의 뒷부분에 붙는다.

  따라서 현재 y값을 그대로 더해주고, 그 다음 y값에서 -1을 해 준다. 따라서 int z에서의 y는 20이 된다.


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

 

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

A.

먼저 Math.random() 메서드에 대한 이해가 필요했다.

Math.random()은 0.0 과 1.0 사이의 범위에 속하는 double값을 반환하는 함수이다.

 

하지만 여기서 주의해야 할 것은 0.0 이상 1.0 미만이라는 것!

그래서 결과 값을 생각해보면, 0.0 ~ 0.9999999...라는 것이다.

부등호로 표현하면 0.0 <= Math.random() < 1.0 

 

일단 우리는 1~6까지의 숫자가 필요하다.

그러면 부등호가 1.0 <= Math.random() < 7.0 

처럼 되어야 하니, (Math.random() * 6) + 1의 식을 생각해 낼 수 있다.

 

이정도면 거의 다 끝낸 셈이지만 그냥 답을 작성하기 보다는 이번에 배운 패키지를 활용해 보고자 했다.

사실 그냥 쓰면 되는데 객체지향 쓰는 걸 연습한다고 생각하고 억지로 나누어 보았다.

 

- 먼저 diceRule이라는 패키지를 만들고 하위에 diceRules이란 클래스를 만든다.

package diceRule;

public class diceRules {
    public void rollDice(){
        while (true){
            int dice1 = (int) (Math.random() * 6) + 1;
            int dice2 = (int) (Math.random() * 6) + 1;
            System.out.println("(" + dice1 + "," + dice2 + ")" );

            if (dice1 + dice2 == 5){
                break;
            }
        }
    }

 

- 그리고 dicePlay라는 클래스를 생성,

diceRule 패키지를 import하고 diceRules사용을 위해 초기화한 뒤 rollDice메서드를 참조하여 사용한다. 

import diceRule.*;

public class dicePlay{
    public static void main(String[] args) {
        diceRules diceRule = new diceRules();

        System.out.println("시작!");
        diceRule.rollDice();
        System.out.println("끝!");
    }
}

 

여기에서 좀 더 세분화해서 diceRules에 아래와 같이 쓸 수도 있는데, 이것은 Math.random()메서드가 while문 밖에 존재하게 되어

요구사항 중 하나인 마지막에 주사위 합산 5를 만들어주는 내용을 보여주지 못해 사용하지 않았다.

(물론 합산 5일때 break해주는 것 까지는 문제가 없다!)

public int dice1(){
    return (int) (Math.random() * 6) + 1;
}
public int dice2(){
    return (int) (Math.random() * 6) + 1;
}
public int rollDice() {
    int diceSum = dice1 + dice2;

    return diceSum;

}
댓글