728x90

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

Todo.

4-1 선택문

4-2 반복문

Assgnment.

0. JUnit5 학습하기

1. live-study 대시보드 만드는 코드 작성

2. LinkedList 구현

3. Stack 구현

4. ListNode를 사용 Stack 구현

5. Queue 구현

4-1 선택문

주어진 조건으로 if문과 switch문으로 나뉘어 진다. 두 방법은 간단하므로 넘어간다. switch문은 다양한 방법이 있으니 3주차에서 한 글을 보면 될듯

4-2 반복문

기본적으로 while문과 for문이 있음.

while(boolean 조건식){
    조건이 true일때 계속 반복 된다.
    조건이 false이면 while문이 종료 된다.
    break; 를 만나도 종료가 된다.
    continue; 를 만나면 가장 가까운 반복문으로 진행한다.
} 

do{
    일단 한번 진행하고나서
    조건이 true일때 계속 반복 된다.
    }while(조건);

for문에는 여러가지가 있다.

1. 기본

기본적인 for문
for(int i = inital value; i < iterate time; i++){
    do something.
    continue, break 모두 사용 가능하다.
}

2. Label 사용

lable : for(조건식){
    do something
    for(조건식){
        break label; // 이 경우에는 label이 달린 for문이 중단된다.
        continue label://이 경우에는 label이 달린 for문의 continue가 진행된다.
        }
    }

3. Enhanced for문 (For each)

for(Type 변수 : Collection<Type> or Type[] array){
    변수를 활용하여 do somethings.
}

코드
int[] Arr = {1,2,3,4,5,6,7,8,9};
int sum = 0;
for(int v : Arr){
    sum += v;
}

A-0 JUnit 5

JUnit 5의 user-guide를 기반으로 합니다.

1. JUnit 5의 특징

  • JUnit은 Java 8 이상에서 동작하고, 자바용 단위 테스트 작성을 위한 것이다.
  • 접근 제어자가 변경이 가능하다.
  • Extention 하나로 여러 규칙을 통합하고 조합이 가능하다.

2. 어노테이션

  • @Test : Test 메서드 임을 나타 내는 것이다.
  • @TestFactory : 동적 테스드들 위한 것.
  • @DisplayName("test name") : 디스플레이 네임을 정의.
  • @BeforeEach : 각각의 테스트 메서드 전에 실행. (JUnit4 : @Before)
  • @AfterEach : 각각의 테스트 메서드 후에 실행. (JUnit4 : @After)
  • @BeforeAll : 모든 테스트 메서드들 전에 실행. (JUnit4 : @BeforeClass)
  • @AfterAll : 모든 테스트 메서드들 후에 실행됩니다.(JUnit4 : @AfterClass)
  • @Nested : nested, non-static 테스트 클래스임을 나타냄.
  • @Tag("tag name") : 테그들을 정의.
  • @ExtendWith : custom extensions을 등록할때 사용
  • @Disable : 메서드 를 비활성화 할때 사용.(JUnit4 : @ignore)
  • @Order(정수 값) : 우선순위 지정

3. Assertion

람다식을 사용 할 수 있게 되었음.

  • assertTrue & assertAll

    class AssertionsDemo {
    
        private final Calculator calculator = new Calculator();
    
        private final Person person = new Person("Jane", "Doe");
    
        @Test
        void standardAssertions() {
            assertEquals(2, calculator.add(1, 1));
            assertEquals(4, calculator.multiply(2, 2),
                    "The optional failure message is now the last parameter");
            assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- "
                    + "to avoid constructing complex messages unnecessarily.");
        }
    
        @Test
        void groupedAssertions() {
            // In a grouped assertion all assertions are executed, and all
            // failures will be reported together.
            assertAll("person",
                () -> assertEquals("Jane", person.getFirstName()),
                () -> assertEquals("Doe", person.getLastName())
            );
        }
  • assertThat
    Third-party 라이브러리로 hamcrest를 사용해야 한다.

    import static org.hamcrest.CoreMatchers.equalTo;
    import static org.hamcrest.CoreMatchers.is;
    import static org.hamcrest.MatcherAssert.assertThat;
    
    import example.util.Calculator;
    
    import org.junit.jupiter.api.Test;
    
    class HamcrestAssertionsDemo {
    
        private final Calculator calculator = new Calculator();
    
        @Test
        void assertWithHamcrestMatcher() {
            assertThat(calculator.subtract(4, 1), is(equalTo(3)));
        }
    
    }

A-1 live-study 대시보드 만드는 코드 작성

  • 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
  • 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
  • Github 자바 라이브러리를 사용하면 편리합니다.
  • 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.
public class dashBoard{
    static private final String token = "token";
    static private int cnt;
    public static void dashBoard() throws IOException {
        GitHub gitHub = new GitHubBuilder().withOAuthToken(token).build();
        GHRepository ghRepository = gitHub.getRepository("whiteship/live-study");

        List<GHIssue> issues = ghRepository.getIssues(GHIssueState.ALL);//이슈 다 가져오기
        cnt = issues.size();
        Map<String , Integer> participant = new HashMap<>();
        Set<String> member = new HashSet<>();

        for (GHIssue issue : issues){
            List<GHIssueComment> comments = issue.getComments();
            for(GHIssueComment comment: comments){
                member.add(comment.getUser().getLogin());
            }
            for (String tmp : member){
                if(!participant.containsKey(tmp))
                    participant.put(tmp,1);
                else participant.put(tmp,participant.get(tmp)+1);
            }
        }
        BufferedWriter bf = new BufferedWriter(new OutputStreamWriter(System.out));
        participant.forEach((key, value)->{
            double percent = (double)(value*100)/cnt;
            try {
                bf.write(key+" : "+String.format("%.2f",percent)+"%\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        bf.close();
    }
}

2. LinkedList 구현

  • LinkedList에 대해 공부하세요.
  • 정수를 저장하는 ListNode 클래스를 구현하세요.
  • ListNode add(ListNode head, ListNode nodeToAdd, int position)를 구현하세요.
  • ListNode remove(ListNode head, int positionToRemove)를 구현하세요.
  • boolean contains(ListNode head, ListNode nodeTocheck)를 구현하세요.
public class ListNode {
    int data;
    ListNode next;
    public ListNode() {
    }
    public ListNode(int data) {
        this.data = data;
    }
    public ListNode add(ListNode head, ListNode nodeToAdd, int position){
        ListNode list = head;
        for (int i = 0; i < position-1; i++) {
            list = list.next;
        }
        nodeToAdd.next = list.next;
        list.next = nodeToAdd;

        return head;
    }
    public ListNode remove(ListNode head, int positionToRemove){
        ListNode list = head;
        ListNode dnode;
        if (positionToRemove == 0){
           dnode = list;
           head = list.next;
           dnode.next = null;
           return dnode;
        }
        for (int i = 0; i < positionToRemove-1; i++) {
            list = list.next;
        }
        dnode = list.next;
        list.next = dnode.next;
        dnode = null;
        return dnode;
    }
    public boolean contains(ListNode head, ListNode nodeTocheck){
        while (head.next != null){
            if (head.data == nodeTocheck.data)
                return true;
            head = head.next;
        }
        return false;
    }
}

3. Stack 구현

  • int 배열을 사용해서 정수를 저장하는 Stack을 구현하세요.
  • void push(int data)를 구현하세요.
  • int pop()을 구현하세요.
public class Customstack {
    int[] stack;
    int top;

    public Customstack(int size) {
        this.stack = new int[size];
        top = -1;
    }
    public void push(int data){
        stack[++top] = data;
    }
    public int pop(){
        if (top == -1)
            return top;
        return stack[top--];
    }
}

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

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

 

public class ListNodeStack {
    ListNode listNode;
    int top;
    public ListNodeStack() {
        listNode = new ListNode();
        top = -1;
    }
    public void push(int data){
        listNode.add(listNode,new ListNode(data),top++);
    }
    public int pop(){
        if (top == -1)
            return top;
        return listNode.remove(listNode,top--).data;
    }
}

5. Queue를 구현하세요.

 

 

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

배열을 이용

public class ArrayQueue {
    int top,end;
    int[] queue;

    public ArrayQueue(int size) {
        queue = new int[size];
        top=end=0;
    }
    public void push(int data){
        queue[end++] = data;
    }
    public int pop(){
        if (top == end)
            return -1;
        return queue[top++];
    }

}

ListNode 사용

public class ListNodeQueue {
    ListNode listNode;
    int top,end;

    public ListNodeQueue() {
        listNode = new ListNode();
        top=end=0;
    }
    public void push(int data){
        listNode.add(listNode,new ListNode(data),top++);
    }
    public int pop(){
        if (top==end)
            return -1;
        return listNode.remove(listNode,end++).data;
    }
}

 

728x90

+ Recent posts