
자기 자신, 자기 자신의 반수로밖에 나누어떨어지지 않는 1 이외의 정수, 즉 양의 약수가 2개인 수를 의미한다.
소수의 정의는 '1과 자기 자신으로밖에 나누어 떨어지지 않고 자기 자신의 곱셈의 역수가 없는 수'이다. -나무위키
위 나무위키 정의대로 총 3가지 방법으로 소수를 구할 수 있다.
1. 2 ~ N-1 까지 수를 나누어 보고 떨어지는 게 없다면 True를 반환한다.
public boolean isPrime(int N) {
for (int i = 2; i < N; i++) {
if (N % i == 0) return false;
}
return true;
}
2. 자기 자신의 반인 N/2 까지만 검사하기
public boolean divide(int number) {
for (int i = 2; i < number / 2; i++) {
if (number % i == 0) return false;
}
return true;
}
** 3. 루트N까지 나누는 방법
public boolean sqrtPrime(int number) {
for (int i = 2; i*i < number; i++) {
if (number % i == 0) return false;
}
return true;
}
전략패턴이란?
전략 패턴은 프로그램 수행 중에 알고리즘을 선택할 수 있도록 만든 패턴입니다.
선택할 알고리즘이 바로 '전략(Strategy)' 이 되는 것이죠.
그리고 이 전략을 선택하는 주체인 '컨텍스트(Context)' 가 필요 합니다.
Context는 문맥이란 뜻인데요.
이는 문맥에 따라 서로 다른 전략을 선택하기 때문으로 생각됩니다.
Context는 간단히 전략을 수행하는 객체라고 생각합니다.
마지막으로 Context에 Strategy를 주입해주는 '클라이언트(Client)'
가 있습니다. Context기 직접 전략을 선택하지 못하기 때문입니다.
결국 클라이언트가 Context에게 문맥에 맞는 Strategy 를 주입(DI:Dependancy Injection) 해 주어야 합니다.
전체적인 그림을 보면 전략 패턴은 Context로 부터 Strategy를 분리해냈다고 보인다.
Strategy를 주입하는 Client를 사용해서 말입니다.

템플릿 콜백 패턴이란?
전략 패턴 + 익명 내부 클래스 입니다. 내부클래스는 클래스 안에 생성된 클래스입니다. 익명 클래스는 이름이 없는 클래스로 선언과 객체 생성이 동시에 됩니다 전략 패턴에서 정의했던 클래스들을 Client나 Context에 포함 시켜 버린 것이죠.
람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명함수(Anonymous function)을 지칭하는 용어 입니다.
람다의 특징으로는 람다는 이름을 가질 필요가 없고 두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다 대수로 단순화 할 수 있습니다.
람다의 표현식
1.매개변수 ->함수 몸체로 이용하여 사용할 수 있다.
2.함수 몸체가 단일 실행문이면 {}생략 가능
3.함수 몸체가 return문으로만 구성되어 있는 경우 {}괄호를 생략할 수 없다.
() -> {}
() -> 1
() -> { return 1; }
(int x) -> x+1
(x) -> x+1
x -> x+1
(int x) -> { return x+1; }
x -> { return x+1; }
(int x, int y) -> x+y
(x, y) -> x+y
(x, y) -> { return x+y; }
(String lam) -> lam.length()
lam -> lam.length()
(Thread lamT) -> { lamT.start(); }
lamT -> { lamT.start(); }
TemplateCallback pattern 과 Lambda를 이용하여 소수 찾기 적용
interface StatementStrategy{
boolean compare(int a, int b);
} // 전략이 바뀔때마다 다형성이 쉬운 인터페이스로 적용
public class TemplateCallbackPrime {
boolean isPrime(int num, StatementStrategy stmt) {
for (int i = 2; stmt.compare(i, num); i++) {
// 위에 3가지 예재에서 다른 점은 가운데 실행문이므로 이자리에 넣어준다.
if (num % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
TemplateCallbackPrime tcp = new TemplateCallbackPrime();
System.out.println(tcp.isPrime(17,(a,b) -> a*a <b));
} //StatementStrategy 는 인터페이스 이므로 메서드르
//사용하려면 객체를 만들때 마다 정의해줘야한다.
}
pn.isPrime(17, new StatementStrategy() {
@Override
public boolean compare(int a, int b) {
return a*a < b;
}
});
위에 짧은 람다식을 풀어서 익명객체로 작성하면 밑에 코드가 된다.
이렇게해서 간단한 알고리즘에 람다식과 콜백메서드 패턴을 적용해보았다.