티스토리 뷰

JAVA

[자바 스터디] 4주차 : 제어문

짜비 2022. 1. 15. 23:32

선택문 (조건문)

if문

if (조건식){
    //조건식이 참일 때 수행할 코드
}

자바에서 조건식의 결과는 반드시 boolean 이어야 함을 기억하자.

switch문

if문은 경우의 수가 많아지면 그만큼 if-else문과 조건식이 늘어나서 코드가 복잡해진다. switch문을 사용하면 이런 문제를 해결할 수 있다.

switch(조건식) {
    case 값1 :
        // code
        break;
    case 값2 :
        // code
        break;
    default :
        //code
}

break 를 생략하면 다른 break문을 만나거나 switch문의 ‘}’ block을 만날 때까지 있는 코드를 모두 수행한다는 점을 주의하자.
-> 이런 human fault를 방지하기 위해 Java 12 부터 switch operator를 제공한다.

  • switch 조건식 결과는 정수 혹은 문자열이어야 한다.
  • case문의 값은 정수 상수, 문자열 리터럴만 가능하며, 중복하지 않아야 한다.
int num , result;
result = 2;
num = 3;
final int ONE = 1;

switch (result) {
    case '1':   //상수와 동일. 가능.
    case ONE:   //final. 가능
    case "YES": //문자열 리터럴 가능.(타입 일치해야 함)
    case num:   //변수 불가능
    case 1.0:   //실수 불가능
    default:
}

반복문

for

for (초기화;조건식;증감식){
    //조건식이 참일 경우 수행될 코드
}

enhanced for문

for( 타입 변수명 : 배열 또는 컬렉션){
    //코드
}

배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장된다.

while

    while(조건식) {
        // 조건식 결과가 true일 동안 반복될 코드
    }

가장 먼저 조건식을 평가해서 조건식이 거짓이면 while 문 전체를 벗어나고, 조건식이 참이면 block 내 코드를 수행하고 다시 조건식으로 돌아간다.

do-while

While문과 반대로 block 을 먼저 수행한 후 조건식을 평가. 따라서 block이 최소 한 번 이상 실행되는 것을 보장.

do {
    //조건식이 참일 때 수행될 코드
} while (조건식);    // ; 을 반드시 붙여야 함.

이름 붙은 반복문

Loop1 :
for (int i = 0; i < 10; i++) {
    System.out.println("i = " + i);
    for (int j = 0; j < 5; j++) {
        if (j == 3) {
            System.out.println("j = " + j);
            break Loop1;
        }
    }
}

중첩 반복문일 경우, 반복문에 이름을 붙여서 break할 때 하나 이상의 반복문을 한번에 벗어날 수 있다.

JUnit5

JUnit5 모듈 구성

  • JUnit 플랫폼 : 테스팅 프레임워크 구동을 위한 런처, 테스트 엔진을 위한 API 제공
  • JUnit 주피터 : JUnit 5를 위한 테스트 api와 실행 엔진
  • JUnit 빈티지 : JUnit 3,4 로 작성된 테스트를 Unit 5 플랫폼에서 실행하기 위한 모듈

@Test 어노테이션과 테스트 메서드

  • 테스트로 사용할 클래스 생성. (클래스명은 보통 “Test” 를 접미사로 붙임)
  • 테스트를 실행할 메소드에 @Test 어노테이션을 붙임
  • @Test가 붙은 메서드 내에서, JUnit이 제공하는 검증 메서드를 통해 결과 확인

주요 단언 메서드

  • assertEquals(Object expected , Object actual) : 두 객체 내 정의된 equals() 메소드를 통해 두 객체가 같은지 비교
    • 만약 equals() 를 override하지 않았다면 두 객체가 같은 주소값을 갖는지 확인
  • assertSame(Object expected, Object actual) : 두 객체가 같은 주소값을 갖는지 확인
  • assertTrue(boolean condition) : condition이 true인지 검사
  • assertNull(Object actual) : actual이 null인지 검사
  • fail() : 이 코드라인에 도달하면 테스트를 실패로 처리
  • assertThrows(Class expectedType, Executable executable) : executable을 실행했을 때 expectedType의 익셉션이 발생하는지 검사
  • assertAll() : 검증이 여러 개 있을 때, 하나가 실패하면 바로 모든 검증이 중단된다. 만약 하나의 검증이 실패하더라도 나머지 검증을 완료하고 싶다면 assertAll()을 활용.
  • assertAll( ()-> assertEquals(3, 5/2), ()-> assertEquals(4, 2*2), ()-> assertEquals(6, 11/2) );

@BeforeEach, @AfterEach

  • @BeforeEach : 테스트 실행 전에 필요한 준비 작업 시 사용. (Private X)
    e.g. 임시 파일 생성, 테스트 메서드에서 사용할 객체 생성
  • @AfterEach : 테스트 실행 후 정리할 것이 있을 때 사용. (Private X)
    e.g. 테스트에서 사용한 임시 파일 삭제

JUnit 이 각각의 테스트 메서드를 실행하는 과정

  1. 테스트 메서드를 포함한 객체 생성
  2. @BeforeEach 가 붙은 메서드 실행
  3. @Test 가 붙은 메서드 하나 실행
  4. @AfterEach가 붙은 메서드 실행
  5. 또 다른 @Test 메서드에 대해, 1번부터 반복

public class LifeCycleTest {

    public LifeCycleTest() {
        System.out.println("new LifeCycleTest");
    }

    @BeforeEach
    void setUp() {
        System.out.println("LifeCycleTest.setUp");
    }

    @Test
    void a() {
        System.out.println("LifeCycleTest.a");
    }

    @Test
    void b() {
        System.out.println("LifeCycleTest.b");
    }

    @AfterEach
    void tearDown() {
        System.out.println("LifeCycleTest.tearDown");
    }
}
new LifeCycleTest
LifeCycleTest.setUp
LifeCycleTest.a
LifeCycleTest.tearDown
new LifeCycleTest
LifeCycleTest.setUp
LifeCycleTest.b
LifeCycleTest.tearDown

@BeforeAll, @AfterAll

  • @BeforeAll : 한 클래스 내 모든 테스트 메서드가 실행되기 전에 수행해야 하는 작업. 모든 테스트 메서드 실행 전에 한 번 실행
  • @AfterAll : 모든 테스트 메서드를 실행한 뒤에 한 번 실행

테스트 메서드 간 실행 순서 의존, 필드 공유 금지

  • JUnit이 테스트 순서를 결정. 테스트 순서는 버전에 따라 달라질 수 있으므로, 테스트가 실행 순서에 의존적이면 안 됨.
  • 필드 값을 공유하면, 테스트 메서드 실행 순서에 따라 필드 값이 의도한 대로 변경되지 않을 수도 있음. 따라서 테스트 메서드끼리 필드를 공유하면 안됨. (Static variable 사용하지 않는 것이 좋음)

구현과제

github link

리뷰 영상 배운 점

  • 가독성 있는 코드는 일단 나 자신이 다시 읽을 수 있는 코드
  • Octotree : github repo 편하게 볼 수 있는 chrome extension
  • Junit4 와 Junit5를 함께 쓰지 말자
  • Queue의 method
    • 예외를 던지는 것
    • null을 던지는 것
  • test class는 test 메소드마다 새로 생성됨
    • @TestInstance(TestInstance.LifeCycle.PER_CLASS) 옵션으로 변경 가능
    • @TestMethodOrder(MethodOrder.orderAnnotation.class) : 테스트 메소드 실행 순서 지정 가능
  • 꼬리재귀 최적화, 자바는 지원하지 않음
    • 재귀의 경우, 공간 복잡도가 커질 수 있음. O(n^2) 이상일 경우 주의하자
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함