본문 바로가기
Java/기초 Java

[기초 자바] 구구단 만들기

by 호두빵 2021. 4. 8.

자바를 배우는 사람들이라면 기초 단계에서 누구나 한 번쯤 만들고 넘어갔을 구구단입니다. 구구단을 뗀지는 10년이 넘었는데 막상 구구단을 직접 만들어보려니 호락호락하지는 않습니다. 그러나 코드를 찬찬히 살펴보면서 뜯어봅시다.

 

첫번째 for문을 잘 들여다봅시다. 첫번째 for(초기식;조건식;증감식)을 보면 k가 2일때부터 10보다 작은 수(=9)가 될때까지 하나씩 늘어나게 됩니다. 2단 3단 할때의 앞 숫자가 k입니다. k가 2일때 printOneDan(2)가 되고 이는 밑에 static함수로 또 다시 묶여있습니다. 이런 식으로 9단까지 만들어지는 것입니다.

 

그렇다면 바로 밑에 static void printOneDan(int dan)을 봅시다.

여기서도 for문을 활용했는데 첫번째 for문과 마찬가지이지만 차이점은 i가 1부터 시작한다는 것입니다. 당연히 2x1 =2를 하지 않고 2x2=4부터 시작하는 사람은 없을 테니까요. 곱하기 바로 다음에 나오는 숫자가 i라고 보면 됩니다. 이제 2단에서 9단까지 하는 것도 알게 되었으니 다음은 실제로 계산하는 부분이 등장해야할 타이밍이겠죠? 가장 밑에 printDan을 봅니다. 각 단과 1~9까지의 숫자를 곱한 것을 int mul로 받습니다. 그리고 나서 System.out.println(dan + "x" + v + "=" + mul);이라고 적어주면 주르르륵 계산이 실행됩니다. 중간 중간에 탭을 넣은 것은 가시성을 위한 것으로 무조건 해야 하는 것은 아닙니다. 그러나 해주면 보기에도 좋고 일단은 이 정도로 만들 수 있다는 것에 뿌듯함을 느낄 수도 있습니다.

 

그러나 여기서 문제점이 또 하나 발생한다. 너무 안 예쁜 모양으로 밑으로만 죽죽죽 내려간다는 것입니다. 실제로 위의 코드를 작성해서 실행해보면 스크롤을 한참 내려야 9 x 9 = 81을 마주할 수 있습니다.

 

어떻게 만드는지는 알았으니 조금 더 예쁜 모양으로 만들어봅시다!

 

[2][3][4]
[5][6][7]
[8][9]

순서를 그대로 따라가봅시다. main함수에서 for문을 도는데, 2에서 시작해서 3씩 추가, 10이 되기 전에 함수가 종료됩니다. 그렇다면 main함수에서 실행되는 것은 printOneDan(2), printOneDan(5), printOneDan(8)이 되겠죠? 

 

그렇다면 printOneDan(2) 안에서는 어떤 일이 벌어질까요? 여기서도 곱하기 다음에 나오는 1에서 9까지 반복문이 돕니다. 2x1...2x9까지요. 근데 main함수를 보면, 우리는 구구단 전체를 하고 싶은데 main함수를 보면 2단, 5단, 8단밖에 안 내 줄 것만 같습니다. 그렇기 때문에 for(int j = 0; j<3;j++)이 등장하게 되는 것입니다. j는 0,1,2가 생깁니다.2단일 경우에는 dan이 2, j가 0,1,2이고, dan + j의 값이 10보다 작기 때문에 하단 이미지의 첫 줄이 찍히게 됩니다. 이렇게 한줄씩 계속 찍으면 2~4단까지는 온전히 찍히게 됩니다.

여기서 궁금해지는 지점은 만약 8~9단일 경우에는 어떻게 될까인데요, for문에서 이미 dan+j<10이라는 조건을 걸어줬기 때문에 예를들어 dan은 9이고 j는 2인 끝지점에 도달하더라도 dan+j<10이라는 조건을 충족하지 못하므로 출력이 되지 않습니다. 최대로 가능한 것은 dan은 9이고 j는 0인 경우 / dan이 8이고 j가 1인 경우가 되겠네요!