선택문 및 반복문 / junit5 / dashboard / stack
선택문 & 반복문
- if
- switch/case
- for
- while
if문 & for문 예제
for (int i=0; i<2; i++) {
if (i%2 == 1) {
System.out.println(i+ " : odd");
}else {
System.out.println(i+ " : even");
}
}
switch문 예제
int num = 11;
switch (num%10) {
case 1:
System.out.println("case 1");
break;
case 2:
System.out.println("case 2");
break;
default:
System.out.println("default");
break;
}
while문 예제
int i = 5;
while (0<i) {
System.out.println(i+" is bigger than 0");
i -= 1;
}
0. JUnit 5 학습
구성
JUnit 5 은 세 컴포넌트로 구성되어 있습니다.
- JUnit Platform
- JUnit Jupiter
- JUnit Vintage
JUnit Platform
JVM위에서 테스트 프레임워크 실행하기 위한 기본 모듈입니다. 테스트 프레임워크를 개발하기 위한 테스트엔진 API를 정의합니다.
Junit Jupiter
테스트와 extension을 쓰기위한 모델입니다. (programming model과 extionsion model의 조합)
Junit Vintage
테스트엔진이 junit3,4 테스트를 실행하기 할 수 있도록 도와줍니다.
샘플 코드
@Test 어노테이션을 통해 손쉽게 junit을 구현할 수 있습니다.
...
class MyFirstJUnitJupiterTests {
private final Calculator calculator = new Calculator();
@Test
void addition() {
assertEquals(2, calculator.add(1, 1));
}
}
어노테이션 종류
- @Test : 해당 메서드가 테스트 메서드임을 나타냅니다.
- @BeforeAll : 해당 메서드가 모든 @Test, @RepeatedTest, @ParameterizedTest, and @TestFactory 보다 먼저 실행됩니다.
- @AfterAll : 해당 메서드가 모든 @Test, @RepeatedTest, @ParameterizedTest, and @TestFactory 메서드가 샐힝된 후 실행됩니다.
- @DisplayName : 커스텀 display name을 만듭니다.
출처 : https://junit.org/junit5/docs/current/user-guide/
과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.
import org.kohsuke.github.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
public class Main {
private static String token = "personal token";
public static void main(String[] args) {
try {
GitHub github = new GitHubBuilder().withOAuthToken(token).build();
GHRepository repository = github.getRepository("id/repo");
List<GHIssue> issues = repository.getIssues(GHIssueState.ALL);
int totalIssue = issues.size();
HashMap<String, Float> map = new HashMap<>();
for(GHIssue issue : issues) {
List<GHIssueComment> comments = issue.getComments();
for(GHIssueComment comment : comments) {
String user = comment.getUser().getLogin();
if (map.containsKey(user)) {
map.replace(user, map.get(user)+1.00F);
}else {
map.put(user, 1.00F);
}
}
}
for(String user: map.keySet()) {
Float rate = map.get(user)/totalIssue*100;
if (rate > 100) {
rate = 100.00F;
}
String outputFormat = String.format("%s 참여율 : %.2f", user, rate);
System.out.println(outputFormat);
}
}catch (Exception e) {
System.out.println("error "+ e);
}
}
}
과제 2. LinkedList를 구현하세요.
LinkedList에 대해 공부하세요.
- LinkedList의 내부 요소들이 메모리상에 연속적으로 존재하지 않고, 일종의 포인터를 사용해 연결된다.
- 각 요소(노드)는 실제 데이터가 저장되는 부분과 다음 요소(노드)의 위치 정보가 저장되는 포인터(next)로 구성된다.
- 단방향과 양방향 타입의 LinkedList가 존재한다.
정수를 저장하는 ListNode 클래스를 구현하세요.
public class ListNode {
private int data;
private ListNode next;
ListNode(int data) {
this.data = data;
this.next = null;
}
}
ListNode add(ListNode head, ListNode nodeToAdd, int position)를 구현하세요.
ListNode remove(ListNode head, int positionToRemove)를 구현하세요.
boolean contains(ListNode head, ListNode nodeTocheck)를 구현하세요.
public class LinkedList {
private ListNode head;
LinkedList() {
this.head = null;
}
LinkedList(ListNode head) {
this.head = head;
}
public ListNode add(ListNode head, ListNode nodeToAdd, int position) {
if (head == null) {
head = nodeToAdd;
} else {
ListNode node = head;
for (int i=0; i<position-1; i++) {
node = node.next;
}
nodeToAdd.next = node.next;
node.next = nodeToAdd;
}
return head;
}
public ListNode remove(ListNode head, int positionToRemove) {
ListNode node = head;
for (int i=0; i<positionToRemove-1; i++) {
if (node == null) {
return head;
}
node = node.next;
}
if (node.next.next == null) {
node.next = null;
} else {
node.next = node.next.next;
}
return head;
}
boolean contains(ListNode head, ListNode nodeTocheck) {
ListNode node = head;
while (node != null) {
if (nodeTocheck.data == node.data) {
return true;
}
node = node.next;
}
return false;
}
}