영권's

4주차 : 제어문 본문

스터디/백기선 라이브 스터디(자바)

4주차 : 제어문

ykkkk 2020. 12. 12. 03:06

목표

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

학습할 것 (필수)

선택문
반복문

 

 

 

알고리즘은 컴퓨터과학, 수학, 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것이며 계산을 실행하기 위한 단계적 절차를 의미한다.

 

https://algorithmkorea.weebly.com/50508442564753251608-496924943646020.html

예를 들어 1~100까지의 합을 구하는 공식을 알고리즘 순서도로 나타내면 아래와 같이 나타낸다.

 

https://algorithmkorea.weebly.com/50508442564753251608-496924943646020.html

이때 i<100 에 해당하는것이 조건문이고 조건에 따라 i = i+1 과 sum = sum +i 를 반복하게 된다.

 

자바에서의 조건문은 if, if-else, switch문이 있으며 반복문은 for, for-each, while, do-while문이 있다.

 

조건문 

1.if 문

 

- if문은 조건식의 결과에 따라 블록 실행 여부가 결정된다.

 

다음은 if문의 실행 흐름이다.

 

이것이 자바다

 

조건식에는 true 또는 false 값을 산출할 수 있는 연산식이나, boolean 변수가 올 수 있다.

조건식이 true이면 블록을 실행하고 false이면 블록을 실행하지 않는다.

 

중괄호 {} 블록은 여러 개의 실행문을 하나로 묶기 위해 작성된다. 만약 조건식이 true가 될 때 실행해야 할 문장이 하나 밖에 없다면 실행할 수 있다.

하지만 가독성을 위해 {}를 생략하지 않고 작성하는 것이 좋다.

 

- if~else 문

 

if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록을 선택한다.

if문의 조건식이 true문 if문의 블록이 실행되고 false이면 else블록이 실행된다.

 

이것이 자바다

 

- 다중 else if 문 

 

조건문이 여러 개인 if문으로 처음 조건식이 false인 경우 다른 조건식의 결과에 따라 실행 블록을 선택할 수 있는데, if 블록의 끝에 else if문을 붙이면 된다. else if문의 수는 제한이 없으며 여러 개의 조건식 중 true가 되는 블록만 실행하고 전체 if문을 벗어나게 된다.

 

이것이 자바다

 

- 중첩 if 문

 

if 문의 블록 내부에는 또 다른 if문을 사용할 수 있다. 이것을 중첩 if문이라 부르는데, 중첩의 단계는 제한이 없기 때문에 실행 흐름에 따라 사용하면 된다.

 

2.switch 문

 

switch문은 if문과 마찬가지로 조건 제어문이다. 하지만 if문처럼 조건식이 true일 경우 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.

switch문은 변수의 값에 따라서 실행문이 결정되기 때문에 같은 기능의 if문보다 코드가 간결하다.

 

이것이 자바다

 

반복문

- 반복문은 어떤 작업(코드)들이 반복적으로 실행되도록 할 때 사용되며, 반복문의 종류로는 for문, while문, do-while문이 있다.

 

1. for 문

for문은 처음 실행될 때

 

1. 초기화식이 제일 먼저 실행된다. 

2. 조건식을 평가해서 true이면

3. 실행문을 모두 실행시키고, false이면 for문 블록을 실행하지 않고 끝나게 된다. 블록 내부의 실행문들이 모두 실행되면 

4. 증감식을 실행시키고 다시 2의 조건식을 평가하게 된다. 평가 결과가 true면 3 -> 4 -> 2로 다시 진행하고, false이면 for문이 끝나게 된다.

 

이것이 자바다

 

2. while 문

 

for문이 정해진 횟수만큼 반복한다면, while문은 조건식이 true인 경우에 계속해서 반복한다.

조건식에는 비교 또는 논리 연산식이 주로 오는데, 조건식이 false가 되면 반복 행위를 멈추고 while문을 종료한다.

 

이것이 자바다

 

while문이 처음 실행 될 때

1. 조건식을 평가한다. 평가 결과가 true면 

2. 실행문을 실행한다. 

모두 실행되면 다시 조건식으로 돌아가 다시 평가하고 true면 다시 실행문을 실행하고 false면 while문을 종료한다.

 

- do-while문

 

do-while문은 조건식에 의해 반복 실행한다는 점에서 while문과 동일하지만 조건식과 상관없이 실행문을 먼저 최초 한번 실행하고 조건문과 비교하여 true면 다시 실행문 실행, false면 do-while문을 종료한다.

 

이것이 자바다

 

 

- for-each

 

for-each문은 향상된 for문이라고도 하며 배열이나 리스트를 항목 수만큼 실행 반복하는데 반복이 이루어질 때마다 배열의 항목을 순서대로 꺼내어 변수에 자동으로 대입해줍니다.

 

https://library1008.tistory.com/66

 

- break문

 

break문은 반복문인 for문, while, do-while문을 실행 중지할 때 사용한다. 또한 switch문에서도 사용하여 종료한다.

 

이것이 자바다

 

- continue문

 

continue문은 반복문인 for문, while문, do-while문에서만 사용되는데 블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동한다.

 

이것이 자바다

 

지난 라이브 스터디 복습

 

public class LiveStudy04 {

    public static void main(String[] args) {

        //iter
        for (String arg : args) {

        }

        // itar
        for (int i = 0; i < args.length; i++) {
            String arg = args[i];

        }

        // 중간 값 구하기
        int start = 2_000_000_000;
        int end = 2_100_000_000;

        // int middle = (start + end) / 2; 를 하게 되면 overflow가 발생하여 잘못된 값이 나오게 된다.

        int middle = 0;

        // 방법 1
        middle = start + (end - start) / 2;

        System.out.println(middle);

        // 방법 2
        middle = ( (start+end) >>> 1);

        System.out.println(middle);
    }

}

 

 

 

과제 (옵션)

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

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

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

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

 

 

package me.study.week4;

import org.kohsuke.github.*;

import java.io.IOException;
import java.util.*;

public class GitHubDashBoard {
    public static void main(String[] args) throws IOException {
        Map<String, List<Integer>> result = new HashMap<String, List<Integer>>();  //결과값리스트
        GitHub gitHub = new GitHubBuilder().withOAuthToken("54633bb926b0d329d27444c0626b616103ffdaa1").build();
        GHRepository ghRepository = gitHub.getRepository("whiteship/live-study");
        List<GHIssue> CloseghIssues = ghRepository.getIssues(GHIssueState.CLOSED);
        List<GHIssue> OpenghIssues = ghRepository.getIssues(GHIssueState.OPEN);
        List<GHIssue> ghIssues = ghRepository.getIssues(GHIssueState.ALL);

        System.out.println(CloseghIssues.size());
        System.out.println(OpenghIssues.size());
        System.out.println("ghIssues.size() : " + ghIssues.size());
        double issueCount = ghIssues.size();

        for (int i = 0; i < issueCount; i++) {
            System.out.println(i + " 번째 이슈 제목 : " + ghIssues.get(i).getTitle());
        }

        for (int i = 1; i < issueCount; i++) {
            System.out.println(ghIssues.get(i).getTitle());
            List<GHIssueComment> comments = ghIssues.get(i).getComments();
            System.out.println(ghIssues.get(i).getTitle() + " 이슈의 코멘트 크기 : " + comments.size());
            for (int j = 0; j < comments.size(); j++) {
                List<Integer> check;
                GHIssueComment ghIssueComment = comments.get(j);
                String userName = ghIssueComment.getUserName();

                if (!result.containsKey(userName)) {
                    check = new ArrayList<Integer>();
                    check.add(i + 1);
                } else {
                    check = result.get(userName);

                    //한 이슈에 같은 아이디가 존재하지 않을 경우만 값을 넣어준다.(중복제거)
                    if (!check.contains(i + 1)) {
                        check.add(i + 1);
                    }
                }
                result.put(userName, check);

            }
        }
        //결과값 출력
        Iterator<String> keys = result.keySet().iterator();
        int testCount = 1;
        while (keys.hasNext()) {
            String key = keys.next();
            List<Integer> value = result.get(key);
            double attendCount = value.size();
            double attendRate = (attendCount / (issueCount - 1)) * 100;
            System.out.println(testCount++ + ". ID : " + key + " => 출석률 : " + String.format("%.2f", attendRate)
                    + "% (" + attendCount + "/" + (issueCount - 1) + ")");
        }
    }
}

 

과제 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를 사용해서 한번.

 

cyk0825.tistory.com/6?category=1124091

 

스택(Stack) , 큐(Queue)

1. 스택(Stack) 스택은 데이터를 일시적으로 저장하기 위한 자료구조로, 데이터의 입력과 출력 순서는 후입선출(LIFO, Last In First Out)입니다. 스택에 데이터를 넣는 작업을 푸시(push)라 하고 데이터를

cyk0825.tistory.com

 

 

Comments