변경 전 내용

/**
 * 이 클래스는 사용자가 지정한 최대 값까지 소수를 생성한다. 사용된 알고리즘은
 * 에라토스테네스의 체다.
 * <p>
 * 에라토스테네스: 기원전 276년에 리비아 키레네에서 출생 ...
 * 설명 ...
 * <p>
 * 알고리즘은 상당히 단순하다. 2에서 시작하는 정수 배열을 대상으로
 * 2의 배수를 모두 제거한다. 다음으로 남은 정수를 찾아 이 정수의 배수를 모두 지운다.
 * 최대 값의 제곱근이 될 때까지 이를 반복한다.
 * 
 * @author Alphonse
 * @version 13 Feb 2002 atp
 *
 */

public class GeneratePrimes {
    
    /**
     * @param maxValue는 소수를 찾아낼 최대 값
     * @return int[]
     */
    public static int[] generatePrimes(int maxValue) {
        if(maxValue >= 2) { // 유일하게 유효한 경우
            // 선언
            int s = maxValue + 1; // 배열 크기
            boolean[] f = new boolean[s];
            int i;
            
            // 배열을 참으로 초기화
            for(i=0; i<s; i++) {
                f[i] = true;
            }
            
            // 소수가 아닌 알려진 숫자를 제거
            f[0] = f[1] = false;
            
            // 체
            int j;
            for(i=2; i<Math.sqrt(s)+1; i++) {
                if(f[i]) {  // i가 남아있는 숫자라면 이 숫자의 배수를 구한다.
                    for(j=i*2; j<s; j+=i) {
                        f[j] = false;   // 배수는 소수가 아니다.
                    }
                }
            }
            
            // 소수 개수는?
            int count = 0;
            for(i=0; i<s; i++) {
                if(f[i]) {
                    count ++;   // 카운트 증가
                }
            }
            
            int[] primes = new int[count];
            
            // 소수를 결과 배열로 이동한다.
            for(i=0, j=0; i<s; i++) {
                if(f[i]) {  // 소수일 경우
                    primes[j++] = i;
                }
            }
            
            return primes;  // 소수 반환
        } else {    // maxValue < 2
            return new int[0];  // 입력이 잘못되어 비어 있는 배열을 반환한다.
        }
    }
}

변경 할 내용


쓸데 없는 역사 설명 주석은 제거한다.

단순하다? 불필요한 설명 제거한다

저자와 버전? Git 에서 관리가 가능하므로 제거 다만 CopyRight 가 필요할 경우는 최상단에 따로 추가한다

클래스이름이 마치 함수 같다 클래스 이름 변경

JavaDocs 같은 설명 제거한다 불필요하다 함수만 보면 딱 알 수 있다.

예외처리를 먼저 해주면 좋을것 같다.
 else {    // maxValue < 2
            return new int[0];  // 입력이 잘못되어 비어 있는 배열을 반환한다.
        }
이 부분을 최상단으로 옮겨 알고리즘의 예외경우를 먼저 제거한다.

변수 이름이 너무 단순하다 변수 이름을 정확하게 수정한다.

주석과 추가 줄바꿈으로 의미 문단이 나눠져있는 부분들을 모아 함수로 변경한다.

변경 한 내용

using System;
using System.Collections.Generic;
using System.Linq;

public class PrimeGenerator // 에라토스테네스의 체 알고리즘 사용
{
    private static List<bool> crossedOuts = new List<bool>();
    private static int minmumValue = 2;

    public static List<int> GeneratePrimes(int maxValue)
    {
        if (maxValue < minmumValue) {
            return null;
        }
        else {
            InitializeCrossedOuts(maxValue);
            CrossOutMultiples(maxValue);
            return GetPrimes();
        }
    }

    private static void InitializeCrossedOuts(int maxValue)
    {
        for (int i = 0; i < minmumValue; i++) {
            crossedOuts.Add(true);

        }

        for (int i = minmumValue; i < crossedOuts.Count(); i++) {
            crossedOuts.Add(false);
        }
    }

    private static void CrossOutMultiples(int maxValue)
    {
        int limit = GetCrossOutIterationLimit(maxValue);
        for (int i = minmumValue; i <= limit; i++) {
            if (IsNotCrossed(i)) {
                CrossOutMultiplesOf(i, maxValue);
            }
        }
    }

    private static int GetCrossOutIterationLimit(int maxValue)
    { // 배열에 있는 모든 수는 배열 크기의 제곱근보다 작은 소수의 인수이므로 제곱근보다 더 큰 숫자의 배수는 제거할 필요가 없다.
        double iterationLimit = Math.Sqrt(maxValue);
        return (int)iterationLimit;
    }

    private static bool IsNotCrossed(int index)
    {
        return crossedOuts[index] == false;
    }

    private static void CrossOutMultiplesOf(int value, int maxValue)
    {
        for (int multiple = value * 2; multiple < maxValue; multiple += value) {
            crossedOuts[multiple] = true;
        }
    }

    private static List<int> GetPrimes()
    {
        var result = new List<int>();
        for (var i = minmumValue; i < crossedOuts.Count(); i++) {
            if (IsNotCrossed(i)) {
                result.Add(i);
            }
        }

        return result;
    }
}

변경 전 내용

/**
 * 이 클래스는 사용자가 지정한 최대 값까지 소수를 생성한다. 사용된 알고리즘은
 * 에라토스테네스의 체다.
 * <p>
 * 에라토스테네스: 기원전 276년에 리비아 키레네에서 출생 ...
 * 설명 ...
 * <p>
 * 알고리즘은 상당히 단순하다. 2에서 시작하는 정수 배열을 대상으로
 * 2의 배수를 모두 제거한다. 다음으로 남은 정수를 찾아 이 정수의 배수를 모두 지운다.
 * 최대 값의 제곱근이 될 때까지 이를 반복한다.
 * 
 * @author Alphonse
 * @version 13 Feb 2002 atp
 *
 */

public class GeneratePrimes {
    
    /**
     * @param maxValue는 소수를 찾아낼 최대 값
     * @return int[]
     */
    public static int[] generatePrimes(int maxValue) {
        if(maxValue >= 2) { // 유일하게 유효한 경우
            // 선언
            int s = maxValue + 1; // 배열 크기
            boolean[] f = new boolean[s];
            int i;
            
            // 배열을 참으로 초기화
            for(i=0; i<s; i++) {
                f[i] = true;
            }
            
            // 소수가 아닌 알려진 숫자를 제거
            f[0] = f[1] = false;
            
            // 체
            int j;
            for(i=2; i<Math.sqrt(s)+1; i++) {
                if(f[i]) {  // i가 남아있는 숫자라면 이 숫자의 배수를 구한다.
                    for(j=i*2; j<s; j+=i) {
                        f[j] = false;   // 배수는 소수가 아니다.
                    }
                }
            }
            
            // 소수 개수는?
            int count = 0;
            for(i=0; i<s; i++) {
                if(f[i]) {
                    count ++;   // 카운트 증가
                }
            }
            
            int[] primes = new int[count];
            
            // 소수를 결과 배열로 이동한다.
            for(i=0, j=0; i<s; i++) {
                if(f[i]) {  // 소수일 경우
                    primes[j++] = i;
                }
            }
            
            return primes;  // 소수 반환
        } else {    // maxValue < 2
            return new int[0];  // 입력이 잘못되어 비어 있는 배열을 반환한다.
        }
    }
}