4주차 과제: 제어문


목표

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

학습할 것

선택문
반복문

과제

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

  • 인텔리J, 이클립스, VS Code에서 JUnit 5로 테스트 코드 작성하는 방법에 익숙해 질 것.
  • 이미 JUnit 알고 계신분들은 다른 것 아무거나!
  • 더 자바, 테스트 강의도 있으니 참고하세요~

과제 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()을 구현하세요.

과제 5. Queue를 구현하세요.

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

선택문

선택문은 switch - case 를 쓰는 자바의 실행문중 하나입니다. 보통 조건문( if문 ) 과 비슷한 용도로 사용되며 일부 코드의 경우 서로 호환할 수 있습니다. 

switch-case 문은 정형화된 모습의 제어문으로 다음과 같은 모양을 합니다.


여기서 입력변수가 각 케이스에 맞는 경우 해당 실행문을 실행하고 break를 통해 switch문을 빠져나옵니다. 
default는 지정해준 모든 case에 대해서 맞지 않을 때 실행하며 이는 아래에서 언급 될 if문의 else와 같게 쓰입니다.


여기서 break 문을 뺀다면 다음의 case 문까지 이어서 실행합니다. 
이는 아래에서 언급될 if 조건중 or 을 사용하는 경우와 같게 쓰입니다. 


원하는 달을 입력받아서 해당 월은 며칠인지 계산하려면 이런식으로 가능합니다.
이는 가장 많은 31일에 해당하는 달을 default로 여겨서 아래처럼 줄일 수 있습니다.
(물론 입력을 받는 과정에서 1에서 12사이의 숫자인지 파악하는 계산이 들어가야 할것입니다.)



이와 같이 switch문은 if문에 비해 더 짧게 작성이 가능하고 과도한 괄호사용을 줄여 주어 
가독성에 도움을 줍니다. 따라서 조건이 단순할 때에는 switch-case 문을 사용하는게 좋으나 조건이 복잡한 경우에는 if-else 를 사용하여 조건을 판단해야 할 때가 있습니다.
( 모든 swicth문은 if문으로 전환이 가능하지만 모든 if문이 switch문으로 전환 가능하지는 않습니다. )

조건문

if - else if - else 를 사용하여 조건을 구분하는 실행문입니다. 
사용법은 if 다음에 오는 괄호에 true/false를 리턴하는 조건문을 넣어서 
실행문을 실행할 지 안할지 결정합니다. 


조건이 많을 때는 else if 를 사용하여 조건을 늘립니다.


switch 에서 제시한 변수와 case의 값이 정확이 같아야 하는 switch-case문과 달리 
다양한 조건을 제시할 수 있습니다. 


또는 부등호를 사용하여 수가 어떤 범위에 있는 지 계산할 수 있습니다.
( 몫과 나머지를 이용하면 switch-case문도 어느 정도 범위조건을 줄 수 있지만 if문은 훨씬 더 상세하고 쉽게 가능합니다. )

else-if를 사용하지 않는 간단한 if/else문은 삼항 연산자로 코드의 길이를 줄일 수 있습니다.


이와 같이 간단한 조건에도 5줄을 사용할 때 


삼항 연산자를 사용 하면 한줄로 간단히 처리할 수 있습니다. 

반복문 

반복문은 말 그대로 실행문을 반복 시키는 제어문입니다. 
기본적으로 for문과 while문이 있으며 추가적으로 향상된 for문(for each)과
do while문 그리고 자바8 이상에서 람다식을 이용한 foreach문 등이 있습니다.

    for문

기본적인 for문은 



의 구조를 띕니다.

    초기화식은 조건식에서 사용되는 변수를 선언하고 초기화 하는 곳으로 
    위에서 미리 초기화 된 변수를 사용한다면 빈칸으로 진행할 수 있스니다.

    조건식은 for문을 언제까지 반복할지 결정 합니다. true/false 값을 리턴하는 식이 
    들어가며 한바퀴 루프를 돌 때마다 조건식에 해당하는지 판별하여 실행여부를 나눕니다.

    증감식은 변수를 제어하여 조건식에 매번 다른 변수가 들어갈 수 있게 합니다.

for문의 특징으로는 '반복횟수를 특정하기 쉽다' 라는 것입니다. 
미리 몇번 반복하라고 설계단계에서 알고있을 때 for문을 사용하면 쉽게 제어가 가능합니다.

간단한 곱셈식을 만들어 보겠습니다. 


이는 i라는 변수가 1부터 9까지 1씩 커지며 아래의 출력문을 실행하는 반복문입니다. 
보통 구구단에서는 x9 까지 9번 반복한다는 것을 알고 있을때 for문을 이용해 
총 9회 반복하는 제어문을 구성할 수 있습니다.

    while문

while문은 조건식이 true 일때까지 계속 반복하는 반복문입니다. 
정확한 횟수를 모를 때 자주 사용되며 내부의 증감식을 통해 횟수를 제한 해줄 수 있습니다.
끊임없이 반복하는 무한루프를 구성하기 쉽습니다. 

기본적인 모양은 while(조건식) 으로 조건식이 참인 한 계속 반복합니다. 


while에는 조건식만 존재하기 때문에 외부에서 미리 초기화를 진행해주어야 합니다.
또 증감식을 while문 내부에 넣어서 해당 조건식이 false 일 때 반복문을 끝내도록 설계 할 수 있습니다. 위와 같은경우 우리는 몇번을 더해야 sum이 100을 넘는 지 모르지만 조건을 통하여 횟수를 제어해 줄 수 있습니다. 

    do-while문 

while문과 비슷하게 쓰입니다. 하지만 while( false ) 같은 경우 한번도 진행 하지 않고 
지나가는 반면 do-while문의 경우 조건식을 판별하기 전에 while 내부를 1회 실행 합니다.

    향상된 for문 

배열과 리스트에 한해서 요소를 꺼낼 때 유용한 반복문 입니다. 
배열의 크기만큼 반복하며 모든 요소들을 꺼냅니다. 
사용법은 for(변수타입 변수명 : 배열명) 으로 for문에 비해 간단하게 사용할 수 있습니다.



    lambda를 이용한 foreach문 

자바8부터 추가된 기능으로 화살표연사자를 이용해 간단하게 반복문을 제어할 수 있습니다.


향상된 for문을 사용하더라도 여러줄을 써야 하는것에 반해 단 한줄로 코드를 짤 수 있습니다.  다만 너무 복잡하거나 많이 사용했을 때에는 오히려 가독성이 떨어지는 단점이 있습니다.

Junit 5 


JUnit(제이유닛)은 자바 프로그래밍 언어용 유닛 테스트 프레임워크입니다. 

1. 테스팅 결과를 그대로 남김으로써 추 후 개발자에게 테스트방법 및 클래스의 history를 그대로 넘겨줄 수 있습니다. 
2. @어노테이션을 이용해 간단히 사용합니다.
3. 외부 테스트 프로그램을 작성하여 디버깅 하지 않아도 되며 프로그램 테스트 시 걸리는 시간까지 관리가능 합니다.
4. 각종 JUnit Assert 메서드를 사용하여 테스트 할 수 있습니다.

JUnit5 는 이전버전과 달리 세가지 하위 프로젝트의 여러모듈로 구성됩니다. 
JUnit 5 = JUnit 플랫폼 + JUnit Jupiter + JUnit 빈티지
플랫폼 - JUnit5 에서 테스트를 진행하기 위한 모듈
Jupiter - new assers, new annotations, java8 lambda 등 추가 확장 기능 
빈티지 - JUnit3, JUnit4로 작성된 테스트 수행 지원 

이외에 차이점으로는 자바버전 8이상에서 사용 가능합니다. (JUnit4는 자바5)
어노테이션명칭이 바뀌었으며 
접근제어자를 defalut 로 가집니다 (JUnit4는 public)
Jupiter에 포함된 추가기능으로 람다함수를 사용할 수 있습니다. 


새로운 테스트 프로젝트를 만들어서 몇가지 테스트를 진행하였습니다.


위와 같이 간단한 연산 몇 가지를 만들고 이에 따른 junit test 파일을 생성합니다.


@test 어노테이션을 통해 테스트라는걸 알려주고 aseert 메서드를 사용하거나 
return값을 그대로 이용하여 테스트를 진행할 수 있습니다. 
testDivision_test 같은 경우 생성 모습 그대로 만들었는데 이제 저걸 지우고 
원하는 테스트를 적어서 진행하면 됩니다.


그대로 진행했던 testDivision_test을 제외하고는 성공했고 그에 따른 시간까지 알 수 있습니다.


JUnit 창에 나온대로 콘솔에 나온것을 보아하니 적혀져 있는 순서대로 실행하는건 
아닌 것 같습니다.

JUnit5 부터 사용 가능하다던 lambda 를 이용한 테스트도 하나 진행하였습니다.



출처: https://junit.org/junit5/docs/current/user-guide/
http://junit.sourceforge.net/javadoc/org/junit/Assert.html


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


먼저 프로젝트에 github 라이브러리가 필요합니다.
해당 버전의 라이브러리를 jar 형식으로 다운받아서 테스트 프로젝트에서 불러오기 합니다.


Add External JARs 로 깃허브라이브러리를 불러와서 적용시키고 나면


이렇게 자동완성을 통해서 해당 라이브러리를 import할 수 있습니다. 
사용을 위해서는 개인키 발급 후 적용하는 것이 필요합니다. 
깃허브에 설정에 가면 생성 할 수 있고 해당 키에 줄 수 있는 권한을 설정할 수 있습니다.


이후 생성된 개인키를 테스트 하기 위해 postman을 사용하여 권한을 가진 
모든 api를 출력했습니다.

      Authorization 부분에 개인키를 입력하고 send하면 출력되는것을 볼 수 있습니다.

이제 실제 실행코드를 구현하면 아래와 같이 출력되는걸 확인할 수 있습니다.





















댓글

이 블로그의 인기 게시물

git-receive-pack not permitted on 깃 허브 로그인 관련 문제