안녕하세요. Brad입니다. 오늘은 좌표계산기 step5를 진행하였습니다. 진행을 하면서 고민했던 부분, 그것을 해결하기 위한 노력. 그리고 피드백 받은 부분에 대해 정리하였습니다.
고민했던 부분
사용자가 입력한 점 중에서 같은 위치의 점(
Point)를 어떻게, 어디에서 체크할까?- equals(), hashCode() 미리 정의해두고
Set<Point>을 이용하여 들어오는Point개수와Set안에 있는Point개수 비교하여 다르면 오류 발생!
- equals(), hashCode() 미리 정의해두고
오류 메시지는 Domain에 있는 것이 좋을까? View에 있는 것이 좋을까?
- 로직과 관련되어 있기 때문에 Domain에 있는게 적합할 것 같기도 하고, 메시지만 전달한다는 점에서 View에 있어야할 것 같기도 하고.. 근데 Domain에 있는게 적합할 것 같긴한데요.
- 기존에 위와 같이 생각한 이유는
throw new IllegalArgumentException()하기 전에 오류 메시지를 따로 출력해야한다고 생각했기 때문입니다. 하지만 코드스쿼드 멤버 NNN으로부터 Exception 괄호() 안에 오류 메시지를 직접 입력하고 상위 catch문에서getMessage()를 통해 직접 입력한 오류 메시지를 출력할 수 있다는 것을 알게되었습니다. 이렇게 오류 메시지를 전달하는게 제일 깔끔할 것 같습니다. - 오류 처리와 관련해서는 '로또' 과제에서 또 다시 배운다고 하는데 지금 단계에서 바로 적용못해 아쉽네요.
implements를 받은 클래스에서 접근제한자를 어떤 것을 쓰는게 좋을까?- 인터페이스 클래스는 외부에 접근되는 것이기 때문에 접근제한자
public이 default로 설정됩니다. 그렇기 때문에 이 인터페이스 클래스를 받는 쪽에서도public으로 사용되게 강제됩니다.
- 인터페이스 클래스는 외부에 접근되는 것이기 때문에 접근제한자
테스트코드에서 예외발생 상황은 어떻게 테스트할 수 있을까?
- @Test 어노테이션 옆에
(expected = 예외클래스.class)를 적어줌으로써 테스트 할 수 있습니다. - 아래는 오늘 작성했던 테스트코드 중 하나입니다.
@Test(expected = IllegalArgumentException.class) public void isValid() { List<Point> points; points = Arrays.asList(new Point(10, 10), new Point(10, 10), new Point(14, 15)); TextParser.isValid(points); }- @Test 어노테이션 옆에
피드백
Point p1 = new Point(5, 7);
Point p2 = new Point(12, 14);
Point p3 = new Point(11, 3);
Point p4 = new Point(6, 4);
points.add(p1);
points.add(p2);
points.add(p3);
points.add(p4);
Arrays.asList()를 사용하면 이런 코드를 좀 더 깔끔하게 구현할 수 있다.
Arrays.asList()를 사용하면 다음 한줄로 줄일수 있습니다.
points = Arrays.asList(new Point(5, 7), new Point(12, 14), new Point(11, 3), new Point(6, 4));
또는 이렇게도 넣을 수 있습니다.
Point[] p = {new Point(5, 7), new Point(12, 14), new Point(11, 3), new Point(6, 4)};
points = Arrays.asList(p);
기본적으로 Arrays.asList는 Oracle Docs에서 아래와 같이 정의를 하고 있습니다.
Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.) This method acts as bridge between array-based and collection-based APIs, in combination with
Collection.toArray(). The returned list is serializable and implementsRandomAccess.
여기에서 fixed-size로 반환되기 때문에 size()나 get() 을 사용할 수는 있으나 새로운 값을 넣으려면 오류가 발생합니다. 따라서 이 경우 새로운 객체를 생성하면 됩니다. 위의 경우 아래와 같이 나타낼 수 있습니다.
Point[] p = {new Point(5, 7), new Point(12, 14), new Point(11, 3), new Point(6, 4)};
points = new ArrayList<>(Arrays.asList(p));
points.add(new Point(12,12));
오늘 추가적으로 공부한 부분
'TIL' 카테고리의 다른 글
| Today's Dev Notes(2018-10-18) (0) | 2018.10.19 |
|---|---|
| Today's Dev Notes(2018-10-16) (0) | 2018.10.16 |
| Today's Dev Notes(2018-10-12) (0) | 2018.10.12 |
| Today's Dev Notes(2018-10-10) (0) | 2018.10.10 |
| Today's Dev Notes(2018-10-08) (0) | 2018.10.09 |