[TIL - 0910] 다시 시작 - Tree, 단위테스트, POJO

트리

  • 말 그대로 나무형태 구조 : 뻗아나가는 계층적인 구조, 루트 노드(오직 1개), 브랜치 노드, 리프 노드(더 이상 자식노드가 없는)
  • 사용하는 곳 : (빠른)검색 관련(이진 탐색)
  • 탐색(순위) 방법 : 중간 노드를 기준으로 이름이 정해짐, 자식 노드(왼/오)는 각각이 트리일 수 있음
    1. 전위 : 중간 노드 - 왼쪽 노드 - 오른쪽 노드 순
    2. 중위 : 왼쪽 노드 - 중간 노드 - 오른쪽 노드 순
    3. 후위 : 왼쪽 노드 - 오른쪽 노드 - 중간 노드 순

직접 구현

  • 배열 사용하지않고(크기 고정, 크기를 늘리기 위해서 더 많은 시간, 인덱스 계산해야함), 객체 간 연결을 사용해서 구현
  • 쉬워보였지만 재귀적으로 처리를 해야해서 금방 구현이 되지않음, 처음부터 코드를 깔끔하게 유지하려고 하니 실력이 좋지 못해서 오히려 더 오래 걸림(기능 만들고 조금씩 고쳐나가는 것으로)
    • OrderStrategy 분리 : 탐색 방법에 따라 조건문으로 처리하다보니 코드 스멜이 나서 분리해봄 - 개선할 곳은 여전히….(pre/in/post order에서 거의 똑같은 코드이고 부모 노드의 값이 언제 추가되냐 차이니깐 LinkedList를 사용했으니 index로 추가할 수 있어서 코드 중복을 줄여버릴 수 있음), 조건문이 여러개로 늘어나면 객체 분리할 수 있는지 체크해야함
public class InOrder implements OrderStrategy {
    private static OrderStrategy STRATEGY = new InOrder();

    private InOrder() {
    }

    static OrderStrategy of() {
        return STRATEGY;
    }

    @Override
    public List<Integer> order(Tree tree) {
        LinkedList<Integer> numbers = new LinkedList<>();

        if (tree.isExistLeft()) {
            numbers.addAll(tree.leftOrder());
        }

        numbers.add(tree.getValue());

        if (tree.isExistRight()) {
            numbers.addAll(tree.rightOrder());
        }
        return numbers;
    }
}

만들면서

  • 단위테스트 간에는 간섭을 일으켜서는 안됨 : 서로 독립된 테스트 케이스인데, 서로 영향 받는다고 의식해서 코딩하는 것 자체가 말이 안됨

스프링

POJO

  • 특정 기술에 종속되지않고, 단위 테스트가 가능한 일반적인 자바 객체 코드 : 스프링 빈으로 등록해도 되고, 그대로 사용해도 되고(스프링의 장점)
    • 자바의 기본으로 돌아가자
public class Car {

    private Position position;
    
    // 무빙 전략 - 일반적으로 사용해도 되고, 스프링빈으로 등록해도 되고
    private MoveStrategy moveStrategy;

    public Car(MoveStrategy moveStrategy) {
        this.moveStrategy = moveStrategy;
    }

    public int move(int value) {
        if (moveStrategy.canGo(value)) {
            position.move();
        }
        return position.getCurrentPosition();
    }
}