Java / / 2024. 7. 10. 20:23

리팩토링: 코드 최적화의 기술, 소수 구하기

🚀 인터페이스를 구현한 클래스의 인스턴스 없이 사용 가능한 메서드

 

자바에서 스태틱 메서드는 클래스의 인스턴스 없이 호출할 수 있습니다. 이 메서드는 인터페이스에 정의될 수 있으며, 해당 인터페이스를 구현한 클래스들에서도 독립적으로 사용될 수 있습니다. 하지만, 인터페이스의 스태틱 메서드는 상속되지 않는다는 점에 유의해야 합니다. 이는 클래스의 스태틱 메서드와 유사하게 작동하며, 반드시 인터페이스 이름을 통해서만 접근이 가능합니다.

 

🔄 리팩토링 (Refactoring)

 

리팩토링은 소프트웨어 코드를 재구성하거나 변형하여 가독성을 향상시키고 유지보수를 쉽게 만드는 과정입니다. 리팩토링의 핵심은 기능을 변경하지 않고 코드의 구조를 개선하는 데 있습니다. 🎯

 

리팩토링의 목적:

 

1. 가독성 향상: 코드를 더 읽기 쉽게 만들어 다른 개발자들이 이해하기 쉽도록 합니다. 📖

2. 유지보수 용이성: 코드의 분석과 변경을 쉽게 하여 오류 수정이나 새로운 기능 추가를 효율적으로 만듭니다. 🔧

3. 성능 최적화: 코드를 최적화하여 실행 시간과 자원 사용을 개선합니다. ⚡

4. 중복 제거: 코드의 중복을 줄이고 일관성을 유지합니다. 🔄

5. 디자인 패턴 적용: 적절한 디자인 패턴을 적용하여 재사용성을 높이고 구조를 개선합니다. 🛠️

 

주요 리팩토링 기법:

 

메소드 추출 (Extract Method): 긴 메소드를 여러 개의 작은 메소드로 나누어 가독성을 높이고 재사용성을 늘립니다.

변수 추출 (Extract Variable): 복잡한 표현식을 변수로 추출하여 코드의 가독성을 높입니다.

메소드 이동 (Move Method): 메소드를 더 관련된 클래스로 이동하여 기능을 명확하게 분리합니다.

조건문 간소화 (Simplify Conditional): 복잡한 조건문을 단순화하여 코드의 가독성을 높입니다.

루프 간소화 (Simplify Loops): 반복문을 간소화하여 가독성을 높이고 오류 가능성을 줄입니다.

클래스 분리 (Extract Class): 클래스가 너무 많은 책임을 질 때, 관련된 기능을 새로운 클래스로 분리하여 구조를 개선합니다.

 

리팩토링 주의사항:

 

기존 코드 동작 유지: 리팩토링 시 기존 기능이 변하지 않도록 주의해야 합니다.

테스트 케이스 사용: 리팩토링한 코드가 기대한 대로 동작하는지 테스트를 통해 확인합니다.

작은 단계로 진행: 리팩토링은 작은 단계로 진행하여 중간에 문제가 발생했을 때 쉽게 복구할 수 있도록 합니다.

 

리팩토링은 코드의 품질을 높이고 개발 생산성을 향상시키는 중요한 활동입니다. 🎉

 

🧮 소수 찾기: 초기 코드

 

다음은 소수를 찾는 초기 코드입니다:

public class Primenumbers {
	int num = 100;
	public static void main(String[] args) {
		Primenumber pn = new Primenumber();
		int total_count = 0;
		for (int i = 1; i <= pn.num; i++) {
			int count = 0; // 카운트 초기화
										 
			for (int j = 1; j < i; j++) { // j를 현재 i의 숫자까지
				total_count++;
				if (i % j == 0) { // i를 j로 나눠서 나머지 값이 0이면 카운트 증가
					count++;
				}
			}
			if (count == 1) {
				// System.out.println(i);
				System.out.printf("%d \n", i);
			}
		}
		System.out.printf("total_count : %d \n", total_count);
	}
}

 

이 코드는 소수를 찾지만, 성능 개선의 여지가 있습니다.

 

⚡ 리팩토링된 코드: 성능 향상

 

리팩토링된 코드는 에라토스테네스의 체를 사용하여 성능을 개선합니다:

 

public class PrimeNumbers {
    public static void main(String[] args) {
        int limit = 100;
        boolean[] isPrime = new boolean[limit + 1];
        int total_count = 0;
        // Initialize all numbers as prime
        for (int i = 2; i <= limit; i++) {
        	total_count++;
            isPrime[i] = true;
        }
        // Implement Sieve of Eratosthenes
        for (int factor = 2; factor * factor <= limit; factor++) {
        	total_count++;
            if (isPrime[factor]) {
                for (int j = factor * factor; j <= limit; j += factor) {
                	total_count++;
                    isPrime[j] = false;
                }
            }
        }
        System.out.printf("\n Total Count:%d ", total_count);
        // Print all prime numbers
        System.out.println("\nPrime numbers between 1 and 100:");
        for (int i = 2; i <= limit; i++) {
            if (isPrime[i]) {
                System.out.print(i + " ");
            }
        }
    }
}

 

📝 에라토스테네스의 체 알고리즘 설명

 

**에라토스테네스의 체(Sieve of Eratosthenes)**는 특정 범위 내의 모든 소수를 찾는 효율적인 알고리즘입니다. 이 알고리즘은 다음과 같은 단계로 진행됩니다:

 

1. 초기화: 2부터 N까지의 숫자를 모두 포함하는 배열을 생성합니다.

2. 소수 찾기: 소수의 배수들을 지워나가면서 소수를 찾습니다.

3. 소수 출력: 배열에서 지워지지 않은 숫자들이 소수입니다. ✔️

 

이 알고리즘은 많은 소수를 빠르고 효율적으로 찾을 수 있는 방법 중 하나입니다.

 

💡 리팩토링효율적인 알고리즘의 사용은 코드의 성능을 최적화하고 가독성을 높이는 데 중요한 역할을 합니다. 이런 기법을 통해 더 나은 소프트웨어를 개발할 수 있습니다. 🚀

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유