[220923] JAVA 과제

younseo1016·1일 전
0

JAVA

목록 보기
1/2

JAVA 언어 과제

앞으로 공부해야하는 JAVA가 어떤 언어인지, 어떤 특성을 가졌는지 공부해보기 위한 기초 과제이다!

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

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

A1. 풀이과정

변수 var1 = 5, var2 = 2일 때
double var3=var1/var2 를 풀어보면,
double은 실수형 데이터 타입이기 때문에 5/2 하여 2.5가 나올 것이라고 예상할 수 있지만,
var1, var2는 int의 정수형 데이터이다.
int의 연산자 / 나누기는 - 피연산자의 나누기 연산 후 몫만 반환한다. (일반적인 나누기 계산처럼 분수나 소수 계산을 하지 않고, 해당하는 몫의 값만 반환한다.)
var1/var2 = 2가 되고, double 형으로 표현하게 되면, 2.0이 된다.
따라서 첫 번째 double var3=var1/var2 식으로 나오는 변수 var3의 값은
var3 = 2.0 이다.

int war4=(int)(var3var2); 를 풀어보면,
var3
var2는 2.0 X 2로 4.0의 double 데이터타입을 갖게 된다.
여기서, 앞의 (int)로 정수형 데이터타입으로 변경해주었기 때문에
int war4=(int)(var3*var2);를 하면 4가 나온다.

따라서 System.out.println(var4); 를 하면 출력결과가 5가 아닌 4가 되는 것이다.

<팀 고찰>
5로 나오게 하려면! 어떻게 하면 될까
(1) 1. int -> double로 바꿔주기
(2) double var3=var1/var2; 나누기 기호 앞에 1.0을 곱해주는 것
(3) double var3= (double) var1/var2;



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

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

A2. 풀이과정

두 번째 문제를 풀기 위해서는 연산자에 대한 개념을 알아야 한다.

형식의미
++xx를 먼저 1 증가시킨 후 그 값을 사용하는 것
x++x를 먼저 1 감소시킨 후 그 값을 사용하는 것
--xx값을 먼저 사용 후 1 증가
x--x값을 먼저 사용 후 1 감소
+xx부호 유지
-xx부호 변경

따라서 int z = (++x) + (y--); 식의 ++x는 11이고, y--는 20 이므로
System.out.println(z); 출력 결과값은 31이다.

증감연산자를 좀 더 정확하게 이해하고 싶어 위 문제에 다른 ++, -- 코드를 추가해서 출력해 보았다.

public class Ques01 {
    public static void main(String[] args) {
        int x=10;
        int y=20;
        int a=y--;
        int b=(--y);
        int c=x++;
        int d=++x;
        int z = (++x) + (y--);
        System.out.println(z);
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);

    }
}

그런데, 결과가 이상했다.
System.out.println(z); = 31 로 문제 푼것과 같이 결과가 잘 나왔는데
System.out.println(a); = 20
System.out.println(b); = 18
System.out.println(c); = 10
System.out.println(d); = 12 로 연산자가 뒤에 붙는 것은 증감연산자와 결과값이 같게 나왔는데 앞에 붙는 것은 -1이나 +1이 되는 것이 아닌 -2, +2 가 되는것을 확인하였다.

왜 이렇게 나오는지 이유를 깨달았다. (조금 뒤 정리 후 수정할 예정) (팀원들과 이야기해보기)



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

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

A3. 풀이과정

우선 이 문제를 해결하기 위하여, Mathod.random() 메소드의 이해가 필요하다!

public class MathRandom {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(Math.random());
        }
    }
}
0.7823854813094799
0.49640570238092907
0.067599990277046
0.44941068326020195
0.497710163140329
0.11137880365687514
0.14057930772566296
0.17204060024288914
0.7575185314824725
0.7603088285833096

Process finished with exit code 0

Method.random() 이란 함수는 double형으로, 0.0이상, 1.0미만 사이의 값을 출력하는 함수이다.
이 함수를 이용하여 주사위의 숫자인 정수 1부터 6까지를 표현하려면 어떻게 해야 할까?
Method.random() 함수 앞에 int를 붙여 정수형으로 바꿔주고, 값을 6 곱해준다. 0.0~1.0 사이의 값이기 때문에, 마지막에 +1을 해주어야 1~6까지의 정수 표현이 가능하다.

while문과 Math.random() 메소드를 사용하여 이 문제를 풀어보자

public class Ques03 {
    public static void main(String[] args) {
        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;
            }
        }
    }
}

우선 while을 이용하여 조건은 무조건 true 조건이 되게 한다.
dice1, dice2는 각각 (int)(Math.random()*6) +1; 로 표현하여 1~6의 정수를 랜덤으로 갖게 한다.
System.out.println("("+dice1+","+dice2+")"); 로 출력하고,
break를 사용하여 dice1 + dice2 가 5의 값을 가지게 되었을 때 멈추게 하였다.

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

Process finished with exit code 0

생각보다 엄청 긴 결과가 나왔는데..! 합이 5가 되었을 때 정상적으로 멈추는 것을 확인할 수 있다.



[정리해볼 개념]

  1. 변수의 종류
  2. 연산자 개념 정리
  3. Math.random()매소드 개념 다시 한번 정리하기 / 어디에 쓰일 수 있을지
  4. while문에 대한 이해
  5. System.out.println(); ()사이의 표현식에 대한 이해

앞으로 더 힘들어 지겠지만, 지금까지는 문제푸는거 너무 재밌다!!
새로 배정받은 조의 분위기가 첫날인데도 벌써부터 너무 좋다 😀 2주차 화이팅!

0개의 댓글