반응형
알고리즘 쉽게 하는 법은 대체 뭘까?
그것은 "바로 규칙 찾기" 이다.
간단하게 "작은 그림 그리기" 라고 생각하면 된다.
구체적으로
바뀌는 부분 vs 바뀌지 않는 부분
으로 나눠서 생각하면 되는데,
예를 들어
별찍기 알고리즘을 짜야 할 때
*
**
***
바뀌지 않는 부분은 별을 찍는다는 것
바뀌는 부분은 찍는 별의 개수 가 1개씩 증가하는것
import java.util.ArrayList;
public class Factory {
private static addInterface addInterfaceS = new AddCalculator(); //정적캐시
private static addInterface addInterfaceD = null;
private static ArrayList<Integer> cached_factorial = new ArrayList<Integer>();
public static addInterface getAddInterface() {
if( addInterfaceD == null) {
addInterfaceD = new AddCalculator(); //동적캐시
}
return addInterfaceD;
}
public static int getFactorial(int x) {
if(cached_factorial.get(x-1) != null) {
return cached_factorial.get(x-1);
}
if(x == 1) {
return 1;
}
int cached_value = x + getFactorial(x-1);
cached_factorial.add(cached_value);
return cached_value;
}
// B
public static void main(String[] args) {
addInterface addAble0 = Factory.getAddInterface();
addInterface addAble1 = Factory.getAddInterface();
addInterface addAble2 = Factory.getAddInterface();
addInterface addAble3 = Factory.getAddInterface();
addInterface addAble4 = Factory.getAddInterface();
addInterface addAble5 = Factory.getAddInterface();
addInterface addAble6 = Factory.getAddInterface();
addInterface addAble7 = Factory.getAddInterface();
addInterface addAble8 = Factory.getAddInterface();
addInterface addAble9 = Factory.getAddInterface();
addInterface addAble10 = Factory.getAddInterface();
addInterface addAble11 = Factory.getAddInterface();
System.out.println(addAble0==addAble1);
}
// show(new addInterface() {
//
// @Override
// public int add(int a, int b) {
// return a+b+1;
// }
// });
// show(new addInterface() {
//
// @Override
// public int add(int a, int b) {
// return a+b+2;
// }
// });
//
// show((a,b)->a+b+1);
// show(Factory::getShow);
// }
//
// public int getShow(int a,int b) {
// return a+b;
// }
//
public static int show(addInterface add) {
return add.add(1, 2);
}
}
class addMock implements addInterface{
@Override
public int add(int a, int b){
return a + b;
}
}
// A
interface addInterface {
public int add(int a, int b);
}
// A
class AddCalculator implements addInterface{
@Override
public int add(int a, int b) {
return a+b+5;
}
}
이때 Stream - Stringbuffer 을 사용하여 한번에 받아올 수 있다.
람다식 사용 (ver1.8 이상 )하면 더 간결한 코드로 작성이 가능하다.
java 코딩시 TOP(틀)-DOWN (기능) 의 순으로 코딩하는 것이 좋다.
여기서 람다식이란?
Interface 의존성
먼저
? 기능 하나를 반복해서 사용할 경우 ->
중복히 힘들다 = ?함수를 사용(정적) ->
실행 중간에 바뀌는 부분이 생길 수 있다. = ?외부인자를 변수로 받아온다 ->
요구사항이 늘어난다 = ?클래스 + 외부생성자로 오버로딩(다형성) ->
클래스와 클래스 사이의 의존도가 높아진다 = ?인터페이스를 설계 단계에서 먼저 만든다 + 하위클래스 ->
- 트리깅 = 메인 = 엔트리포인트
- 목킹(mock) = 모조체 = 구현전에 테스트를 위한것
그런데,
기능이 완성 된 후 목킹 대신 실제 코드를 쓸때 전부 replace 해야되는 문제가 발생한다.
따라서,
Factory를 사용하게 되는데
Factory란 getAddInterface로 목킹 테스트가 가능
(사용법 : Factory.getAddInterface)
실제 코드가 들어왔을 때, Factory 내의 return 값 만을 변경해 주면 된다.
동적 캐시 기능 사용 가능( 동적 객체 생성 )
즉, 클래스를 먼저 캐싱 하게된다.
R2DB : 정적 캐시 -> 로딩시 문제가 생길 수 있다.
무슨 말 이냐면!
팩토리얼(!)을 생각해보자
캐싱 = cashed_factorial.add
return
데이터 O -> 가져옴
X -> 거기서 처리함
인터페이스를 중간에서
팩토리 -> 람다식
그래서 인터페이스와 람다식으로 코드를 간결하게 짤 수 있다.
반응형
'IT > All-Day-Algorithms_쫑알쫑알(종일 알고리즘)' 카테고리의 다른 글
[java]합병정렬(Merge_sort) (0) | 2019.03.18 |
---|---|
[java & c]선택정렬(SelectionSort) (0) | 2019.03.17 |
[백준] if문 - 4344번: 평균은 넘겠지 (JAVA) (0) | 2019.01.17 |
[백준]for문 - 1924번: 2007년(java) (0) | 2019.01.15 |
[백준]for문 - 15552번 : 빠른 A+B (java) (0) | 2019.01.15 |