Java 제어문, githun api 사용하기

  1. 제어문이란 무엇인가?
  • 기본적으로 자바의 코드는 위에서 아래로 실행한다. 개발자는 이러한 흐름을 제어문을 통해 변경할 수 있다.
  • 제어문은 조건식에 따라 그것이 true이면 제어문에 들어가고 아니면 빠져나온다. 제어문의 조건을 만족할 떄까지 계속해서 반복하는 경우 반복문이라 한다. 반복문과 달리 제어문을 최대 한 차례만 들어가는 경우도 있다. 이는 조건문 / 선택문이라 한다.
  1. 조건문
    2.1 if
  • if의 조건문()이 true일 때 해당 블럭에 있는 코드가 실행된다.
  • else if를 통해 조건을 여러개로 만들 수 있다.
  • 조건에 맞는 값이 없을 경우 else{}블럭을 읽는다. else는 생략해도 되며, 만약 그럴 경우 어떤 블럭의 코드도 읽지 않는다.
  • if문 블럭 안에 if 문을 넣을 수도 있다.
int a = 82;

if(a<0){
    System.out.println("음수입니다.");
    if(a%2==0){
        System.out.println("짝수입니다.");
    }
}else if(a==0){
    System.out.println("0입니다");
    if(a%2==0){
        System.out.println("짝수입니다.");
    }
}else if(a>0) {
    System.out.println("양수입니다.");
    if(a%2==0){
        System.out.println("짝수입니다.");
    }
}else{
	System.out.println("해당하는 값이 없습니다.");
}

2.2 switch

  • 스위치는 변수의 값과 일치하는 블럭을 실행하는 조건문이다. case를 통해 변수와 일치해야 하는 유일한 값이 명시되어 있기 때문에 파악하기는 쉽지만 코드가 길어진다. 그리고 유연한 코딩이 어렵다.
String day = "sunday";
switch (day){
    case "saturday" :
        System.out.println("월요일이다"); break;
    case "sunday" :
        System.out.println("일요일이다"); break;
    default:
        System.out.println("주말이 아니다"); break;
}
  • switch 코드를 보면 break; 가 있다. break는 제어문을 종료한다. 해당 변수와 일치하는 case를 찾으면 이후의 코드는 확인할 필요가 없으므로 break를 통해 제어문을 멈춘다.
  1. 반복문
    3.1 while
  • while은 해당 조건문이 true이면 계속 반복한다.
  • do-while의 경우, while과 동일하나, 무조건 한 번은 실행한다.
int v=0;
while(v!=20){
    v = (int)(Math.random() * 50); // 20이 나올 떄까지 계속 반복한다.
    System.out.println(v);
}

do{ // 최소한 한 번은 실행한다. 앞서의 결과로 v=20이 됐으나, do로 인하여 v가 다시 한 번 값이 바뀌며 while문을 돈다.  
    v = (int)(Math.random() * 50); 
    System.out.println(v);
}while(v!=20);
  • 만약 while문이 계속 true이면 시스템이 멈출 때까지 반복한다. 특별한 목적이 없다면 아래와 같은 코드는 지양해야 한다. 컴파일 오류가 발생하지 않으므로 주의해야 한다.
int i = 0;
while(i==0){
	//...코드들...//
}

3.2 for

  • while과 달리 횟수를 기준으로 한다.
  • 조건문은 (초기화식; 조건식; 증감식)으로 이뤄져 있다. 초기화 된 변수가 조건식이 맞을 때까지 수행한다. 변수는 한 번 실행할 때마다 증감식의 조건에 따라 값이 증감한다. 컴파일 오류가 발생하지 않으므로 주의해야 한다.
  • 초기화식에서 초기화한 변수는 반복문에서 사용할 수 있다. 그러므로 index가 존재하는 배열에서 자주 사용한다.
for(int i=1; i<=12; i++){
    System.out.println(i+"월 입니다.");
}
  • 변수가 조건식을 만족하지 못하면 while의 예와 같이 무한 반복이 될 수 있으므로 주의해야 한다.
for(int i=0; i<1; i--){
	//....코드들....//
}

3.3 break

  • 2.2의 예에서 사용한 것처럼 반복문에서도 break를 사용한다.
  • if문과 함께 사용하여 어떤 조건에 만족하면 반복문을 종료한다.
int vv = 0;
while (true) { // 조건문이 true라서 무한루프가 될 가능성이 있었으나 break로 인해 반복문을 빠져나오는 것을 확인할 수 있다. 
    vv = (int) (Math.random() * 50);
    System.out.println(vv);
    if (vv == 20) break;
}

3.4 continue

  • break는 반복문을 빠져나온다. continue는 자신의 아래에 있는 코드를 실행하지 않고 반복문을 계속한다.
for(int i=0; i<15; i++){
    if(i%6==0) continue; // 6의 배수는 continue로 인해 아래의 코드에 진입하지 못함.
    System.out.println(i); //그러므로 6의 배수를 제외한 숫자만 출력됨. 
}

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

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

과제에 해당하는 라이브러리는 처음 사용해보는 라이브러리였다. 그리고 이 라이브러리는 사이트는 과제를 풀기 위한 힌트가 특별히 없었다. 그저 엑세스 하는 방법만이 있었다.
하지만 API가 잘 구성되었는지, 그래프를 하나씩 찍어가며 라이브러리를 탐색한 것만으로 원하는 값을 추출할 수 있었다.

public class GointoGit {
public static void main(String[] args) throws IOException {

    GitHub github = new GitHubBuilder().withOAuthToken("********").build(); //개인토큰을 통해 엑세스 권한을 얻는다.
    GHRepository repository = github.getRepository("infoqoch/live-study").getSource();//fork한 리포지토리의 소스를 얻는다.
    List<GHIssue> issues = repository.getIssues(GHIssueState.ALL);  //GHIssueState는 Enum으로 되어 있다. All을 통해 모든 이슈를 얻는다. 
    int size = issues.size();//size를 통해 for문을 돌린다.
    System.out.println("size:"+size);
    Map<String, Integer> counter = new HashMap<>();

    for(int i=0; i<size; i++){
        List<GHIssueComment> comments = issues.get(i).getComments(); // 이슈에 대한 커멘츠를 얻는다.
        for(int j=0; j< comments.size(); j++){
            String name = comments.get(j).getUser().getLogin();  // 커멘츠->유저->유저고유이름(여기서는 getLogin()이 닉네임인 것 같다)
            if(!counter.containsKey(name)){
                counter.put(name,1); 
            }else {
                Integer integer = counter.get(name); 
                counter.put(name, integer+1);
            }
        }
    }
    
    Iterator<String> iterator = counter.keySet().iterator();
    while (iterator.hasNext()){
        String names = iterator.next();
        System.out.printf(names+": %.2f", (float)counter.get(names)/size);
    }
}

결과
whiteship: 1.00
infoqoch: 0.24

리포지토리를 생성한 백기선 개발자님(whiteship)은 1.00이다. 이를 통해 getUser()가 하나의 이슈에서 하나의 유저가 커멘츠를 여러개 적는다 하더라도 중복해서 값을 가져오지 않음을 간접적으로 확인할 수 있었다. 왜냐하면 하나의 이슈에서 whiteship으로 된 커멘츠는 매우 많으니까. 물론 교차 검증을 하지 않았기 때문에 확실하지는 않지만, 일단 검토는 생략했다. 참고로 나는 0.24이다. 분발해야지.

완료하지 못한 과제는 차후 추가하도록 하겠습니다.
백기선 개발자님의 자바 라이브 스터디를 하고 있습니다.

좋은 웹페이지 즐겨찾기