프로그래밍기초 제6주 실습과제

       

함수2, 디버깅

       

아래 모든 문제에 적용되는 지시 사항

  • 클래스 선언문 바로 위에 그 클래스에 대한 설명을 주석으로 넣으시오.
  • main 함수 외의 함수에도 주석을 넣으시오. main 함수에는 주석을 달지 않아도 됩니다.
  • 주석의 첫 부분은 /** 로 시작하고 끝 부분은 */로 마칩니다.
  • 주석을 적어 넣지 않거나 주석의 내용이 부실한 경우 감점합니다.

       

P1 (프로그램 실행 추적(tracing))

아래 프로그램 SquareTest를 보세요. 프로그램이 시작되면 14번 줄부터 순차적으로 한 문장씩 실행됩니다. 이 프로그램의 18번 줄과 31번 줄에 작은 동그라미 표시가 있습니다. 작은 동그라미가 있는 18번 줄과 31번 줄에서 프로그램이 잠시 멈춘다고 생각합시다. 프로그램이 실행되는 동안 18번 줄과 31번에 여러 번 도달하게 됩니다. 18번 줄과 31번 줄에 도달하면 그 때마다 18번 줄, 혹은 31번 줄을 실행하기 전에 잠시 멈춘다고 생각합시다. 그리고 그 순간 프로그램에 있는 여러 변수들의 상태(값)를 종이에 기록합니다. 그러면 Figure 1과 같은 표가 만들어집니다. 이 표에서 x 표시는 그 순간 해당 변수가 존재하지 않는다는 의미입니다.

img

img

Figure 1

아래 프로그램 Summations2에도 20번 줄과 37번 줄 등 두 곳에 작은 동그라미가 있습니다. 이 프로그램에 대해 위에서와 같이 두 줄에서 프로그램이 멈출 때마다 변수 값을 차례로 적어 Figure 2의 표를 완성하시오. 어느 순간 어떤 변수가 존재하지 않는다면 x표시를, 변수가 존재하지만 그 값이 정해지지 않은 상태라면 ? 표시를 적으시오. 변수 from과 to는 main 함수에도 있고 sum 함수에도 있는데, 이들은 이름만 같을 뿐, 서로 관계없는, 전혀 별개의 변수들임에 주의하시오. 복사하여 편집할 수 있는 Summatins2 소스 코드가 이 문서의 끝부분에 있습니다.

img

img

Figure 2

Figure 2 표를 완성하여 이미지 파일로 저장하시오. 파일 이름은 SummationStates.jpg로 지으시오. 이 그림 파일이 week6 패키지에 포함되게 하시오. 그림 파일을 만들어 파일시스템의 임의의 위치(가령 바탕화면)에 저장한 후 그 파일을 마우스로 끌어 이클립스의 week6 패키지로 가져오면 됩니다. copy할 것인지 물으면 ok로 대답하면 됩니다.)


       

P2 (프린트 문장 삽입을 이용한 디버깅)

위 P1 문제에서 작성한 Summations2 추적표가 올바른지 프린트 문장을 프로그램에 삽입하여 확인해 보겠습니다. 이 방법은 프로그램에 문제가 있을 때 어디에 어떤 문제가 있는지 추적하기 위해 흔히 사용하는 방법입니다. Summation2 클래스를 복사하여 Summation3 클래스를 만들고, Summation3 클래스의 37번 줄 바로 위에 아래와 같은 프린트 문장을 삽입하시오.

System.out.println("          from=" + from + ", to=" + to + ", i=" + i + ", sumResult=" + sumResult);

또, 20번 줄 바로 위에 아래와 같은 프린트 문장을 삽입하시오.

System.out.println("count=" + count + ", from=" + from + ", to=" + to);

두 개의 프린트 문장이 삽입된 Summation3 프로그램을 실행하여 p1 문제에서 작성한 추적표가 올바른지 확인하시오.

이 문제에 대한 결과물은 Summations3.java 파일입니다. 그 외에 따로 제출할 것은 없습니다.


       

P3 (디버거(debugger))

위 P1 문제에서 작성한 Summations2 추적표가 올바른지 디버거를 이용하여 확인하시오. 먼저, <디버거 사용법="">을 읽어 보시오.

[디버거 사용법]

25번 줄에서 프로그램이 멈추게 하려면 줄 번호 바로 왼쪽 부분을 더블클릭한다. 그러면 그 곳에 작은 동그라미가 생긴다. 이렇게 하면 25번 줄에 브레이크 포인트(break point)가 설정된 것이다. 한 번 더 더블클릭하면 브레이크 포인트가 해제된다. 브레이크 포인트를 여러 곳에 설정할 수도 있다.

img

브레이크 포인트를 하나 이상 설정한 상태로 벌레 버튼을 누른다.

img

img

그러면 eclipse 창 배치가 바뀌고, 프로그램이 시작되어 진행하다가 브레이크포인트에서 그 문장을 실행하기 전에 멈춘다.

아래 그림에서 편집창의 빨간색 네모 안에 작은 파란 화살표가 보이는데 이것이 현재 서 있는 위치를 나타낸다.

오른쪽 위의 빨간 네모 부분에는 여러 변수들의 현재 값이 보인다. 이 정보가 가장 중요하며 디버깅에 도움이 된다. 단, 현재 실행되고 있는 함수의 변수들만 보인다.

img

이 때 세 가지 조작이 주로 사용된다.

img

1번은 계속 실행하라는 명령이며 이 버튼을 누르면 다음 번 브레이크포인트에서 정지한다.

2번은 step-into 명령이다. 위 그림의 25번 문장에서는 sum 함수를 호출하는데 이 버튼을 누르면 sum 함수의 첫 문장으로 들어간다.

3번은 step-over 명령이다. 위 그림의 25번 문장에서 이 버튼을 누르면 sum 함수로 들어가지 않고, 다음 줄, 그러니까 26번 문장으로 가서 (26번 문장을 실행하기 전에) 멈춘다.

프로그램이 중간에 멈춰 있는 상태에서 브레이크포인트를 모두 해제하고 1번을 누르면 프로그램이 끝까지 실행된다.

프로그램이 중간에 멈춰 있는 상태에서 위 그림의 1번과 2번 사이의 빨간 네모 버튼을 누르면 프로그램이 현재 상태에서 프로그램이 종료된다.

이렇게 세 가지 버튼을 필요에 따라 누르면서 화면 오른쪽 위에 보이는 변수들의 값의 변화를 관찰하면 프로그램의 잘못된 부분을 찾을 수 있다. 프로그램이 한 줄 한 줄 진행함에 따라 현재 위치 표시 화살표가 그에 맞춰 이동한다(아래 그림).

img

디버거를 사용하다가 다시 원래의 eclipse 창 배열로 돌아가고 싶으면, 오른쪽 맨 위에 있는 Java 버튼을 클릭한다(아래 그림).

img

일단, Summation2 프로그램의 20번 줄과 37번 줄에 브레이크포인트를 설정하고, Debug 버튼을 눌러 실행한 후, 프로그램이 정지하면 변수 값을 관찰하시오. 또, Resume 버튼을 눌러 프로그램이 실행되게 하시오. 그러면 다시금 브레이크포인트에서 정지합니다. 이런 식으로 프로그램의 정지 시점마다 변수 값의 변동을 관찰하시오. P1에서 작성한 추적표가 맞는지 확인하시오.

img Debug 버튼 img Resume 버튼
   

프로그램이 끝나면 20번 줄의 브레이크포인트는 남겨두고 37번 줄의 브레이크포인트는 제거하시오. 그리고 Debug를 실행한 후 20번 줄에서 멈추면 Step into 버튼을 여러 번 눌러 프로그램 흐름과 변수 값 변화를 관찰하시오. 언제든 Resume 버튼을 누르면 프로그램이 다음 번 브레이크포인트까지 실행됩니다.

img

프로그램을 끝낸 뒤 20번 줄의 브레이크포인트가 설정되어 있는 상태에서 Debug를 실행한 후, 20번 줄에서 멈추면 Step over 버튼을 여러 번 눌러 프로그램 흐름과 변수 값 변화를 관찰하시오.

img

이 문제에서는 아무 것도 제출하지 않습니다.

앞으로 프로그램을 작성할 때 무엇인가 문제가 생기면 디버거를 사용하여 프로그림 실행 과정을 추적하면 잘못된 곳을 비교적 쉽게 찾을 수 있습니다.


       

P4

아래와 같이 작동하는 프로그램을 작성하시오. 클래스 이름은 MaxSquareTest로 지으시오.

  • 키보드로부터 음이 아닌 정수를 입력 받는다.
  • 입력 받은 수보다 작거나 같은 최대 정수제곱수를 찾아 출력한다.
  • 음수가 입력될 때까지 위 작업을 반복한다. 음수가 입력되면 프로그램을 끝낸다.

프로그램 실행 예는 아래와 같습니다.

img

maxSquare라는 이름의 함수를 정의하고 이 함수를 이용하는 main 함수를 작성하시오. maxSquare는 아래 API에 맞춰 작성하시오.

img

[참고] 문자열 안에 따옴표를 넣으려면 아래 예와 같이 백슬래시 문자를 이용해야 합니다.

img


       

P5 (2단계 함수 호출)

제4주 실습과제 9번 문제는 십진수를 이진수로 바꾸는 프로그램(Dec2Bin)을 작성하는 문제입니다. 그 문제를 다시 한 번 읽어보고 모범답안 코드를 참고하여 아래 과제를 수행하시오. 새로 작성하는 클래스의 이름은 Dec2Bin2로 지으시오.

[모범답안 코드 : Dec2Bin.java]

img

Dec2Bin에서는 main 함수에서 모든 일을 처리했습니다. Dec2Bin2에서는 별도의 함수를 작성하고 main은 이 별도의 함수를 호출하는 방식으로 작업하게 합니다.

(1) 십진수로 표현된 주어진 자연수 n을 이진수로 바꾸려면, 우선 n보다 작거나 같은 2의 거듭제곱수들 중 가장 큰 수를 찾아야 합니다. n이 13일 때는 그 수가 23이고, n이 9일 때와 8일 때는 그 수가 23이고, n이 35일 때는 그 수가 25입니다. 주어진 n에 대해, n보다 작거나 같은 2의 거듭제곱수들 중 가장 큰 수를 찾아주는 함수를 아래 API에 맞추어 작성하시오.

(2)

img

(3) 십진수로 표현된 주어진 자연수 n을 이진수로 바꾸어 문자열(String)로 반환하는 함수를 작성하시오. 이 함수를 구현할 때, 위에서 작성한 maxPower 함수를 사용하시오.

img

[힌트] 이진수 문자열 만들기

이진수가 가령, 1, 0, 1의 순서로 만들어졌다고 해 봅시다. 우선, 문자열 타입 변수를 하나 선언하고 빈 문자열로 초기화합니다. 그리고 그 문자열에 1을 더합니다. 또, 0을 더합니다. 그리고 1을 더합니다. 그러면 “101” 문자열이 만들어집니다.

img

출력: img

(4) 제4주 실습과제 9번 문제와 똑같이 작동하도록 main 함수를 작성하시오. main 함수는 위에서 작성한 toBinary 함수를 호출하도록 하시오. Dec2Bin2 클래스는 main, toBinary, maxPower 등 세 개의 함수로 구성됩니다.


       

P6

주어진 정수가 몇 자리 수인지 알아내는 프로그램을 작성하시오. 클래스 이름은 NumberOfDigitsTest로 지으시오.

실행화면은 아래와 같습니다.

img

img

img

img

[힌트]

정수 123이 세 자리 수라는 것을 어떻게 알 수 있을까요?

아래는 123을 10의 거듭제곱수들로 “정수 나눗셈”을 한 값을 보여줍니다.

123/100000 = 0

123/10000 = 0

123/1000 = 0

123/100 = 1

자리 수인 123은 100000, 10000, 1000 등으로 나누면 몫이 0이지만, 100(10의 2제곱)으로 나누면 몫이 0이 아닙니다.

다른 예를 봅시다.

1234/100000 = 0

1234/10000 = 0

1234/1000 = 1

자리 수인 1234는 1000000, 100000, 10000 등으로 나누면 몫이 0이지만, 1000(10의 3제곱)으로 나누면 몫이 0이 아닙니다.

그러니까, n자리 수는

10의 9제곱으로 나누면 몫이 0이고,

10의 8제곱으로 나누면 몫이 0이고,

10의 7제곱으로 나누면 몫이 0이고,

. . .

10의 n-1제곱으로 나누면 몫이 0이 아닙니다.

10자리 정수는 10의 9거듭제곱으로 나누면 몫이 0이 아닙니다.

아래 표를 보면 가장 int 타입 정수 중 가장 큰 수나 가장 작은 (음수) 수는 10자리입니다. 그래서 10의 9제곱부터 따져 본 것입니다.

img

[알고리즘]

int 타입 정수 n이 몇 자리 수인가 알아내려면 n을 10의 9제곱으로 나누어 보아 몫이 0이 아니면 열 자리 수라고 판단할 수 있습니다.

그렇지 않으면, 다시 n을 10의 8거듭제곱으로 나누어 보아 몫이 0이 아니면 아홉 자리 수라고 판단합니다.

그렇지 않으면, 다시 n을 10의 7거듭제곱으로 나누어 보아 몫이 0이 아니면 여덟 자리 수라고 판단합니다.

. . .

그렇지 않으면, 다시 n을 10의 1거듭제곱으로 나누어 보아 몫이 0이 아니면 두 자리 수라고 판단합니다.

그렇지 않으면, n이 한 자리 수라고 판단합니다.

프로그램을 작성하려면 우선 10, 100, 1000, 10000, 100000, … 등의 수가 필요합니다. 그러니까 10의 i 거듭제곱수를 만들어주는 함수를 먼저 만들어야 하겠습니다. 아래에 API에 맞추어 작성하시오.

img

powerOfTen(3)을 호출하면 10의 3거듭제곱, 즉 1000이 반환됩니다.

powerOfTen(9)을 호출하면 10의 9거듭제곱, 즉 1,000,000,000이 반환됩니다.

이제 주어진 int 타입 정수가 몇 자리 수인지 알아내는 함수를 작성합니다.

img

이 함수에서 위 [알고리즘]을 사용해, 주어진 수 n의 자릿수를 알아냅니다. 이 때 10의 제곱수들이 필요하므로 powerOfTen 함수를 이용합니다. 그러니까 numberOfDigits 함수 내에서 10의 제곱수가 필요할 때마다 powerOfTen 함수를 호출하면 됩니다.

[알고리즘]은 if, else if, else if, … 형태로 표현되어 있지만, 실제로 이 <알고리즘> 코드로 구현할 때 아홉 번 if else를 사용하는 것은 별로 좋은 방법이 아닙니다. 아래와 같이 for 문장을 사용하면 간단히 구현할 수 있습니다.

int i;
for(i=9; n을 10 i제곱으로 나눈 몫이 0인가?; i--);
// 위 문장 끝에 세미콜론이 있으므로 for문장을 도는 동안 아무 일도 하지 않음.
// for 문장의 목적은 n을 10의 몇 거듭제곱으로 나눌 때 처음으로 몫이 0이 아닌 값이 되는지 알아내는 데 있음.
// 어떤 조건이 만족되면 for 문장을 끝내고 아래로 내려오나?

// for 문장이 끝나고 다음 줄로 내려 온 상태에서는 i에 어떤 값이 들어 있을까? 그 i에 대해 아래 명제가 성립한다.
// n을 10의 i 거듭제곱으로 나누면 몫이 0이 아니다.
// 그러면 n은 (i+1)자리수 이다.
return i + 1;

NumberOfDigitsTest 클래스는 main, numberOfDigits, powerOfTen 등 세 개의 함수로 구성됩니다.


       

P7

주어진 정수의 각 자리 숫자를 차례로 출력하는 프로그램을 작성하시오. 클래스 이름은 DigitSplitter로 지으시오.

실행화면은 아래와 같습니다. 출력에서 각 자릿수 사이에 빈칸이 있음에 유의하세요.

img

img

img

img

[힌트]

네 자리 수 2345의 각 자리 숫자를 추출하려면 어떻게 해야 할까요?

아래와 같이 하면 됩니다.

2345/1000 = 2

2345%1000 = 345

345/100 = 3

345%100 = 45

45/10 = 4

45%10 = 5

5/1 = 5

위 알고리즘을 사용하여 주어진 수 n의 각 자릿수를 추출하려면, 우선 n이 몇 자리 수인지 알아야 합니다. 2345같이 네 자리 수이면 그 수를 1000(10의 3제곱)으로 나눈 몫과 나머지를 구하고, 그 나머지를 다시 100으로 나눈 몫과 나머지를 구하는 과정을 진행합니다. 23456과 같이 다섯 자리 수라면 그 수를 10000(10의 4제곱)부터 나누기 시작해야 합니다. 여섯 자리 수라면 10의 5제곱부터 나누기 시작해야 합니다. n이 몇 자리 수인지 알아보려면 p6에서 작성한 numberOfDigits함수를 사용하면 됩니다. 다른 클래스에 선언된 함수를 호출하려면 클래스_이름.함수_이름( ) 형식으로 적어줍니다. 그러니까 DigitSplitter 클래스 내에서 n이 몇 자리 수인지 알아보려면 NumberOfDigitsTest.numberOfDigits(n)과 같이 적어줍니다. 그러면 n의 자릿수가 int 타입으로 반환됩니다.


       

P8

주어진 정수가 소수(prime number)인지 여부를 판별하는 프로그램을 작성합니다.

소수(prime number)란 2 이상 정수 중 1과 자기자신 외의 약수를 갖지 않는 수입니다.

  • 2는 소수이다. 1과 2 자신 외에는 약수를 갖지 않는다. (2는 짝수 중 유일한 소수이다.)
  • 3도 소수이다. 1과 3 자신 외에는 약수를 갖지 않는다.
  • 4는 2로 나누어 떨어지므로 1과 4 자신 외에 약수 2를 갖는다. 따라서 소수가 아니다.
  • 6은 1과 6 자신 외에 약수 2와 3을 갖는다. 따라서 소수가 아니다.

그러니까, 어떤 수 n이 소수인지 판별하려면 아래와 같이 하면 됩니다.

  • n이 2로 나누어 떨어지는지, 3으로 나누어 떨어지는지, 4로 나누어 떨어지는지, …, (n-1)로 나누어 떨어지는지 차례로 살펴본다.

  • 만약 이 중 어느 하나라도 나누어 떨어지는 수가 있으면 n은 소수가 아니다. 나누어 떨어지는 수가 하나도 없으면 n이 소수이다.

이것을 코드로 적으면 아래와 같습니다.

img

int 타입 변수는 십진수 아홉 자리 수까지만 저장할 수 있으므로 (10자리 수 중 작은 수들은 저장 가능), 아홉 자리 수보다 더 큰 수도 소수인지 판별할 수 있게 하기 위해 long 타입 변수를 사용했습니다.

코드에 정수를 적으면 int 타입 리터럴로 인식됩니다. 예를 들면, 34, -12, 0, 9836485는 모두 int 타입 리터럴입니다.

int 타입 리터럴 37은 long 타입 변수 n에 저장해도 문제없습니다. long 타입 변수는 int 타입보다 큰 그릇이므로 37이 long 타입으로 자동형변환되어 저장됩니다.

위 코드를 실행하면 아래와 같은 출력을 얻습니다.

img

n에 37 대신 36을 넣고 위 코드를 실행하면 아래와 같은 출력을 얻습니다.

img

위 코드는 잘 작동하지만 더 빨리 판별하는 (성능이 더 좋은) 코드로 개량할 수 있습니다.

36을 1보다 큰 두 약수의 곱으로 나타내봅시다.

2 x 18 = 36, 3 x 12 = 36, 4 x 9 = 36

6 x 6 = 36

9 x 4 = 36, 12 x 3 = 36, 18 x 2 = 36

세째 줄에 있는 각 곱셈 식에 있는 두 약수는 첫째 줄에 있는 두 약수의 순서만을 바꾼 것입니다.

그러니까, 36이 1과 자기자신 외의 약수를 갖는지 알아보려면, 36을 2부터 6 (= img)까지의 수로만 나누어 보면 됩니다.

6 (= img)보다 더 큰 수로 나누어 보는 것은 같은 일을 한 번 더 하는 셈입니다. 예를 들어, 3x12 = 36이므로 36을 3으로 나누어 떨어지는지 알아보는 것과, 36을 12로 나누어 떨어지는지 알아보는 것은 같은 것입니다. 3으로 나누어 떨어진다면 12로 나누어도 떨어지기 마련입니다.

37이 1과 자기자신 외의 약수를 갖는지 알아보려면 37을 2부터 6 (= img)까지의 수들 중 어느 하나로 나누어 떨어지는지 살펴보면 됩니다.

36 이상 49(=7x7) 미만 수들은 모두 이렇게 판별할 수 있습니다. 2부터 6 (= img)까지의 수들 중 어느 하나로 나누어 떨어지는지 살펴보면 됩니다.

49 이상 64(=8x8) 미만 수들은 그 수를 2부터 7 (= img)까지의 수들 중 어느 하나로 나누어 떨어지는지 살펴보면 됩니다.

그러니까, 어떤 수 n이 소수인지 판별하려면,

n이 2부터 n-1까지의 정수로 나누어 떨어지는지 차례로 살펴보는 대신,

2부터 img까지의 정수로 나누어 떨어지는지 살펴보면 됩니다.

만약 img이 정수가 아니라면 img보다 작은 정수들 중 가장 큰 수까지만 살펴보면 됩니다.

이것을 코드로 적으면 아래 그림과 같습니다.

img

n이 36 이상 49 미만의 정수라면, i는 2부터 6까지 변하면서 반복문을 실행합니다.

(1) 주어진 2 이상인 자연수가 소수(prime number)인지 판별하는 함수를 위 두가지 방법 각각으로 작성하시오. 아래 API에 맞춰 작성하시오. 클래스 이름은 Prime으로 지으시오.

(2)

img

img

또, 위 함수 두 개를 이용하여 2 이상, 20 이하 자연수가 소수인지 판별하여 결과를 출력하는 main 함수를 작성하시오. 출력 예는 아래와 같습니다.

img

아래와 같이 나오면 안 됩니다.

img

(3) n이 소수인지 판별하기 위해 n이 2부터 n-1까지의 정수로 나누어 떨어지는지 살펴보는 isPrime1 함수와, 2부터 img까지의 정수로 나누어 떨어지는지 살펴보는 isPrime2 함수는 성능 차이가 얼마나 날까요? 실험을 통해 알아봅시다.

우선, 프로그램이 도는 데 얼마나 시간이 걸리는지 측정하는 방법을, 아래 예를 통해, 공부합니다. 아래 코드는 덧셈을 999번 수행하는데 시간이 얼마나 걸리는지 측정합니다.

img

System.currentTimeMilles( )를 호출하면 현재 시간이 ms 단위로 반환됩니다. 덧셈을 시작할 때의 시간을 기록해 두고, 덧셈이 끝날 때의 시간을 재서 두 시간의 차이를 구했습니다.

(System.currentTimeMilles( )는 System 클래스에 있는 static 함수인 currentTimeMilles를 호출 문장입니다.)

이제 소수를 구하는 두 함수의 성능 차이를 실험을 통해 알아봅시다.

Prime 클래스를 복사하여 PrimeAlgorithmComparison라는 이름의 클래스로 저장하고 새 클래스에서 작업하시오.

n을 아래 값으로 설정하고 n이 소수인지 판별하여 결과를 출력하도록 프로그램을 수정할 것입니다.

long n = 3033333343L;

(int 타입은 아홉 자리 수밖에 표현할 수 없는데 위 수는 열 자리 수이므로 int 타입으로 표현할 수 없습니다. 프로그램에서 열 자리 정수를 그냥 적으면 int 타입으로 인식되므로 컴파일 에러가 발생합니다. long 타입으로 인식되게 하려면 위 예와 같이 숫자 뒤에 L을 붙여줍니다.)

main 함수에서는 n이 소수인지를 isPrime1 함수와 isPrime2 함수를 이용해 판별하면서 각 함수의 실행시간이 얼마인지 측정하여 출력합니다. 물론 두 번의 판별은 결과가 같습니다.

실행시간을 측정할 때는, main 함수 내에서, 함수를 호출하기 전에 시간을 읽어 저장하고, 함수가 리턴된 후에 시간을 읽어 시간 차를 구하면 됩니다.

컴퓨터 성능에 따라 프로그램을 실행하는데 몇십 초 정도가 걸릴 수 있으니 조금 기다려야 합니다.

화면 출력을 캡쳐하여 이미지 파일로 만들고 이 이미지 파일을 패키지에 포함시키시오.

[출력 예]

img

효율이 다소 떨어지더라도 깨끗하고 단정한 코드가 일반적으로 좋은 코드이긴 합니다.

그러나, 조금만 머리를 쓰면, 프로그램이 그다지 복잡해지지 않으면서도, 획기적으로 계산 시간이 단축되는 수가 많습니다.

[힌트]

Boolean 타입 함수를 구현하는 예

img

이 예에서 isPositive가 함수 이름으로도 사용되고 변수 이름으로도 사용되었습니다. 이름이 같지만 하나는 함수고 하나는 변수이므로 혼동되지 않습니다.

[보충문제] 이 문제는 풀지 않아도 되며 과제 결과로 제출하지 않습니다.

자연수를 소인수분해(prime factorization)하는 프로그램을 작성하시오.

img

img

img

img

img

6066666686를 소인수분해할 때 시간이 몇초 이상 걸린다면 프로그램이 비효율적으로 작성된 것입니다. 조금만 개선하면 순식간에 결과를 내 줍니다. (P8 문제처럼)        

[문제 끝]


       

Summations2 소스 코드

아래 코드는 이미지가 아니고 텍스트이므로 복사할 수 있습니다.

package week6;

/**
 \* 임의의 두 정수 사이의 정수들의 합을 구하는 프로그램
 *
 \* @author 정충교
 *
 */

public class Summations2 {
    public static void main(String[] args) {
           int count = 1;
           int from, to;

           while (count <= 2) {
                from = count;
                to = count + 2;

                System.out.println("Summation from " + from + " to " + to + " = " + sum(from, to));
                count++;
           }
      }

      /**
      \* 주어진 구간의 자연수의 합을 구한다.
      *
      \* @param from 구간의 시작 값.
      \* @param to  구간의 끝 값.
      \* @return 주어진 구간의 자연수의 합.
      */

      public static int sum(int from, int to) {
           int sumResult = 0;
           int i;

           for (i = from; i <= to; i++) {
                sumResult += i;
           }
           return sumResult;
      }
}

       

[참고 자료]

코딩 스타일 - 중괄호 위치

중괄호 위치에 따라 아래와 같이 두 가지 스타일이 있습니다.

(A)

img

(B)

img

(A), (B) 중 어느 스타일을 선택해도 좋습니다. 단, 한 가지를 선택해서 일관성 있게 사용하는 게 좋습니다.

eclipse 편집기에서는 기본적으로 (A) 스타일로 코드를 편집해 줍니다.

이것을 (B) 스타일로 편집하게 하려면 아래와 같이 설정해 줍니다.

Window - Preferences를 선택하면 아래와 같은 대화창이 뜬다. 아래 그림에 맞춰 설정해 준다.

img

img

img

img

       

끝.