2020. 12. 4.

4주차 과제: 제어문

https://github.com/whiteship/live-study/issues/4

목표

자바가 제공하는 제어문을 학습하세요.

학습할 것

선택문

반복문

과제

과제 0. JUnit 5 학습하세요.

  • 인텔리J, 이클립스, VS Code에서 JUnit 5로 테스트 코드 작성하는 방법에 익숙해 질 것.

과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.

  • 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
  • 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
  • Github 자바 라이브러리를 사용하면 편리합니다.
  • 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.

과제 2. LinkedList를 구현하세요.

  • LinkedList에 대해 공부하세요.
  • 정수를 저장하는 ListNode 클래스를 구현하세요.
  • ListNode add(ListNode head, ListNode nodeToAdd, int position)를 구현하세요.
  • ListNode remove(ListNode head, int positionToRemove)를 구현하세요.
  • boolean contains(ListNode head, ListNode nodeTocheck)를 구현하세요.

과제 3. Stack을 구현하세요.

  • int 배열을 사용해서 정수를 저장하는 Stack을 구현하세요.
  • void push(int data)를 구현하세요.
  • int pop()을 구현하세요.

과제 4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.

  • ListNode head를 가지고 있는 ListNodeStack 클래스를 구현하세요.
  • void push(int data)를 구현하세요.
  • int pop()을 구현하세요.

(optional) 과제 5. Queue를 구현하세요.

  • 배열을 사용해서 한번
  • ListNode를 사용해서 한번.


선택문

if (조건){
  // 조건이 참(true)이면 블록 내 코드를 실행
}
if (조건){
  // 조건이 참이면 이 블록 내 코드를 실행
} else {
  // 조건이 거짓(false)이면 이 블록 내 코드를 실행
}
if (조건1){
  // 조건1이 참이면 블록내 코드를 실행
} else if (조건2) {
  // 조건1이 거짓이고 조건2가 참이면 이 블록 내 코드를 실행
} else {
  // 조건1 조건2가 모두 거짓일 경우 이 블록 내 코드를 실행
}
switch (조건 값) {
  case 값1:
    // 조건 값 = 값1일 때 실행하고자 하는 명령문
    break;
  case 값2:
    // 조건 값 = 값2일 때 실행하고자 하는 명령문
    break;
  default:
    // 조건이 어떠한 case 값에도 해당하지 않을 때
    // 실행하고자 하는 명령문
    break;
}


반복문

while (조건문) {
  // 조건이 참일 경우 반복하고자 하는 명령문
}
do {
  // do / while 문은 먼저 루프를 한 번 실행한 후 조건식을 확인
} while (조건문)
for (초기식; 조건식; 증감식) {
  // 조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문
}


과제 0. JUnit 5 학습하세요.

참고: JUnit5 사용자 가이드

https://junit.org/junit5/docs/current/user-guide/

JUnit 5란?

JUnit 5 = JUnit 플랫폼 + JUnit Jupiter + JUnit 빈티지

JUnit 플랫폼: JVM 위에서 프레임워크 테스트를 위한 기초역할. TestEngine Api를 제공.

JUnit 쥬피터: 테스트 작성 및 확장을 위한 새로운 프로그래밍 모델과 확장 모델의 조합. 쥬피터 베이스 테스트를 구동하기 위한 테스트엔진.

JUnit 빈티지: JUnit 3와 JUnit 4 기반 테스트 플랫폼 실행을 위한 테스트엔진.


JUnit 5은 Java 8 이상이 필요

IntelliJ 실행 → 'New Project' or 상단 메뉴에서 'File' → 'New Project'

JUnit 5 종속성(dependency) 추가를 위해 Maven이나 Gradle 선택

Gradle:
https://docs.gradle.org/current/userguide/java_testing.html#using_junit5

Maven:
https://maven.apache.org/surefire/maven-surefire-plugin/examples/junit-platform.html

test {	// JUnit 플랫폼 테스트를 위해 추가
    useJUnitPlatform()
}
dependencies {	// JUnit 쥬피터 종속성 추가
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
종속성을 추가하면 인텔리j에서 친절하게 Gradle 변화를 감지하고 로드할 것인지 물어본다.


처음 시작을 위한 gradle 예시 코드
https://github.com/junit-team/junit5-samples/tree/r5.7.0/junit5-jupiter-starter-gradle

main/java → class 'Calculator' 작성

public class Calculator {
  public int add(int a, int b) {
    return a + b;
  }
}

test/java → 테스트 코드 작성. 단축키 클래스 내에서 'Ctrl+Shift+T' 참고 영상

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

class MyFirstJUnitJupiterTests {
  private final Calculator calculator = new Calculator();
  @Test
  void addition() {
    assertEquals(2, calculator.add(1, 1));
  }
}

주석 (Annotations)

@Test
// 테스트 메소드임을 나타냄

@ParameterizedTest
// 파라미터화 테스트 메소드(각각 다른 arguments를 테스트)

@RepeatedTest
// 반복 테스트 템플릿

@TestFactory
// 동적 테스트를 위한 테스트 팩토리 메소드

@TestTemplate
// 등록된 providers가 반환한 

@TestMethodOrder
// 주석이 달린 테스트 클래스의 테스트 메소드 실행 순서를
// 구성하기 위해 사용

@TestInstance
// 주석이 달린 테스트 클래스에서 테스트 인스턴스 수명주기를
// 구성하는데 사용

@DisplayName
// 테스트 클래스 or 테스트 메소드에 사용자 지정 이름을 선언

@DisplayNameGeneration
// 테스트 클래스에 대한 사용자 지정 이름 생성기를 선언

@BeforeEach
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 각각 메소드보다 먼저 실행되어야 함을 표시

@AfterEach
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 각각 메소드 이후에 실행되어야 함을 표시

@BeforeAll
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 모든 메소드보다 먼저 실행 되어야 함을 표시

@AfterAll
// @Text, @RepeatedTest, @ParameterizedTest, or @TestFactory
// 모든 메소드 이후에 실행 되어야 함을 표시

@Nested
// 주석이 달린 클래스가 정적이 아닌 중첩 클래스임을 나타냄

@Tag
// 메소드 or 클래스 레벨에서 테스트 필터링을 위한
// 태그 선언을 위해 사용

@Disabled
// 테스트 클래스 or 메소드를 비활성화하는 데 사용

@Timeout
// 테스트, 테스트 팩토리, 테스트 템플릿 or 
// 라이프싸이클 메소드의 실행 시간 초과 실패에 사용

@ExtendWith
// 확장 선언(클래스, 매소드)등을 등록하는데 사용

@RegisterExtension
// 프로그래밍 적으로 확장성을 등록하는데  사용

@TempDir
// 라이프사이클 메소드, 테스트 메소드의 매개 변수, 필드 주입을 위한
// 임시 폴더 사용을 위해 선언


과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.

https://github.com/Sungjun-HQ/DashboardReader/tree/master/src

class DashboardReaderTest {

    @Test
    void getGHRepositoryTest() throws IOException {

        DashboardReader dashboardReader = new DashboardReader();

        // 접속한 github에서 태스트용 저장소로 이동
        GHRepository repo = dashboardReader.connectGH()
        	.getRepository("whiteship/live-study/");

        // 저장소에서 이슈 상태가 OPEN (ALL, CLOSED)
        List list = repo.getIssues(GHIssueState.ALL);
//        List list = repo.getIssues(GHIssueState.OPEN);

        assertTrue(list.size() > 0);

        Map map1 = new HashMap<>();

        for (GHIssue ghIssue : list) {
            GHUser user;
            List commentsList = ghIssue.getComments();

            if (commentsList.size() > 0) {
                for (GHIssueComment comment : commentsList) {
                    user = comment.getUser();

                    // 유저의 로그인 id 가져오기
                    if (map1.get(user.getLogin()) == null) {
                        map1.put(user.getLogin(), 1);
                    } else {
                        map1.put(user.getLogin(), map1.get(user.getLogin()) + 1);
                    }
                }
            }
        }
        // map1 소수점 출력
        for (String i : map1.keySet()) {
            float progressFloat = map1.get(i);
            progressFloat = progressFloat / 18 * 100;
            System.out.print("name: " + i);
            System.out.println(", progress: " + String.format("%.2f", progressFloat));
        }
    }
}

출력

Starting Gradle Daemon...
Gradle Daemon started in 1 s 264 ms

> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
name: a, progress: 16.67
name: b, progress: 11.11
name: c, progress: 16.67
name: d, progress: 16.67


과제 2. LinkedList를 구현하세요.






댓글 없음:

댓글 쓰기