2021 02 03
2021-02-03¶
Test Code¶
- 왜 필요한가? - 테스트 코드를 System.out으로 하나하나 main method에 작성한다면, - 클래스 크기, 복잡도 증가 - 메서드 이름을 통한 의도 불분명 - 테스트 결과 수동으로 확인
- JUnit은? - 개발자를 위한 유닛 테스팅 제공 (참고: https://junit.org/junit5/) - 유닛 테스팅: 특정 모듈이 의도된 대로 작동하는지 검증 - 하나의 jar 파일로 제공 - jar(java archive): 여러개의 자바 클래스 파일, 클래스가 사용하는 리소스 및 메타데이터 하나의 파일로 모음 - 각 테스트 마다 새로운 클래스 인스턴스 생성하여 테스트간 의존성 없앰
- 필수 Annotation (JUnit 5.x 버전 기준) - @Test: 해당 메서드를 테스트 대상으로 지정 - @Test(timeout=5000): 5000ms 이내로 테스트 성공해야함 - @Test(expected=RuntimeException.class): RuntimeException이 발생해야 성공 - @BeforeAll: 해당 테스트 클래스 초기화할 때 딱 한번 선행되어 실행 (static 필수) - @AfterAll: 해당 테스트 클래스 내 모든 테스트 메서드 수행 후 딱 한번 후행되어 실행 (static 필수) - @BeforeEach: 모든 테스트 메서드 실행 이전에 실행 - @AfterEach: 모든 테스트 메서드 실행 다음에 실행
- 필수 Assertion 메서드 (참고: http://junit.sourceforge.net/javadoc/org/junit/Assert.html) - assertArrayEquals(a, b): 배열이 일치하는가? - assertEquals(a, b): 객체가 같은 [값]을 갖는가? - assertSame(a, b): 객체가 같은 [주소값]을 갖는가? - assertTrue(a): 해당 조건이 참인가? - assertNotNull(a): 해당 객체가 null이 아닌가?
Annotation¶
- 정의 - 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것 - 해당 프로그램에 미리 정의된 종류와 형식으로 작성해야만 의미가 있음 - 문서화, 컴파일러 체크, 코드 분석을 위한 용도로 사용됨 - 주석처럼 프로그래밍 언어에 영향 X, 유용한 정보를 제공 - java의 설정 파일 XML... 설정과 소스코드 분리하지 말고 합치자 - 애너테이션 붙이기 시작 -> 설정에 대한 정보 추가 (안드로이드 떠올리기)
- 표준 애너테이션 - @Override: 컴파일러가 같은 이름의 메서드가 조상에 있는지 확인, 없으면 에러 출력 - @Deprecated: 다른 것으로 대체되었으니 더 이상 사용 X - @FunctionalInterface: 컴파일러가 '함수형 인터페이스'를 올바르게 선언했는지 확인, 오류면 에러 출력 - @SuppressWarnings: 컴파일러가 보여주는 경고메시지 나타나지 않게 억제 - ex) @SuppressWarnings({"deprecation", "unchecked"}), @SuppressWarnings("rawtypes)
정규 표현식¶
- 정의 - 정규식은 텍스트 데이터 중에서 원하는 패턴과 일치하는 문자열을 찾아내기 위해 사용 - 정규식은 미리 정의된 기호와 문자를 이용해서 작성 - import java.util.regex.; // Pattern과 Matcher가 속한 패키지*
- Pattern & Matcher
- Pattern: 정규식을 정의하는데 사용
- compile 메서드에 정규식을 매개변수로 넘겨 Pattern 객체 획득
ex) Pattern p = Pattern.compile("c[a-z]*");- Matcher: 정규식을 데이터와 비교하는 역할 - 정규식으로 비교할 대상을 매개변수로, Pattern 클래스의 matcher를 호출해 Matcher 객체 획득
ex) Matcher m = p.matcher(data[i]);- Matcher 객체에 boolean matches() 호출해 정규식에 부합하는지 확인 <br> *ex) if(m.matches())* - find()를 통해 패턴과 일치하는 부분 찾을 시 true, 다시 find() 호출을 통해 이전 패턴 발견 지점부터 매칭 시작 <br> *ex) while(m.find())* - 반면 group(int index) 같은 경우는 패턴 발견 지점을 그룹화하여 index=1 부터 순서대로 접근 가능 <br> *group(0) 이나 group()은 전체 문자열 반환*